1/* 2 * ioctl.c 3 * 4 * Copyright (C) 1995, 1996 by Volker Lendecke 5 * Copyright (C) 1997 by Volker Lendecke 6 * 7 * Please add a note about your changes to smbfs in the ChangeLog file. 8 */ 9 10#include <linux/errno.h> 11#include <linux/fs.h> 12#include <linux/ioctl.h> 13#include <linux/time.h> 14#include <linux/mm.h> 15#include <linux/highuid.h> 16#include <linux/smp_lock.h> 17#include <linux/net.h> 18 19#include <linux/smb_fs.h> 20#include <linux/smb_mount.h> 21 22#include <asm/uaccess.h> 23 24#include "proto.h" 25 26long 27smb_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 28{ 29 struct smb_sb_info *server = server_from_inode(filp->f_path.dentry->d_inode); 30 struct smb_conn_opt opt; 31 int result = -EINVAL; 32 33 lock_kernel(); 34 switch (cmd) { 35 uid16_t uid16; 36 uid_t uid32; 37 case SMB_IOC_GETMOUNTUID: 38 SET_UID(uid16, server->mnt->mounted_uid); 39 result = put_user(uid16, (uid16_t __user *) arg); 40 break; 41 case SMB_IOC_GETMOUNTUID32: 42 SET_UID(uid32, server->mnt->mounted_uid); 43 result = put_user(uid32, (uid_t __user *) arg); 44 break; 45 46 case SMB_IOC_NEWCONN: 47 /* arg is smb_conn_opt, or NULL if no connection was made */ 48 if (!arg) { 49 result = 0; 50 smb_lock_server(server); 51 server->state = CONN_RETRIED; 52 printk(KERN_ERR "Connection attempt failed! [%d]\n", 53 server->conn_error); 54 smbiod_flush(server); 55 smb_unlock_server(server); 56 break; 57 } 58 59 result = -EFAULT; 60 if (!copy_from_user(&opt, (void __user *)arg, sizeof(opt))) 61 result = smb_newconn(server, &opt); 62 break; 63 default: 64 break; 65 } 66 unlock_kernel(); 67 68 return result; 69} 70