ioctl.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. #include <linux/errno.h>
  10. #include <linux/fs.h>
  11. #include <linux/ioctl.h>
  12. #include <linux/time.h>
  13. #include <linux/mm.h>
  14. #include <linux/highuid.h>
  15. #include <linux/smp_lock.h>
  16. #include <linux/net.h>
  17. #include <linux/smb_fs.h>
  18. #include <linux/smb_mount.h>
  19. #include <asm/uaccess.h>
  20. #include "proto.h"
  21. long
  22. smb_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
  23. {
  24. struct smb_sb_info *server = server_from_inode(filp->f_path.dentry->d_inode);
  25. struct smb_conn_opt opt;
  26. int result = -EINVAL;
  27. lock_kernel();
  28. switch (cmd) {
  29. uid16_t uid16;
  30. uid_t uid32;
  31. case SMB_IOC_GETMOUNTUID:
  32. SET_UID(uid16, server->mnt->mounted_uid);
  33. result = put_user(uid16, (uid16_t __user *) arg);
  34. break;
  35. case SMB_IOC_GETMOUNTUID32:
  36. SET_UID(uid32, server->mnt->mounted_uid);
  37. result = put_user(uid32, (uid_t __user *) arg);
  38. break;
  39. case SMB_IOC_NEWCONN:
  40. /* arg is smb_conn_opt, or NULL if no connection was made */
  41. if (!arg) {
  42. result = 0;
  43. smb_lock_server(server);
  44. server->state = CONN_RETRIED;
  45. printk(KERN_ERR "Connection attempt failed! [%d]\n",
  46. server->conn_error);
  47. smbiod_flush(server);
  48. smb_unlock_server(server);
  49. break;
  50. }
  51. result = -EFAULT;
  52. if (!copy_from_user(&opt, (void __user *)arg, sizeof(opt)))
  53. result = smb_newconn(server, &opt);
  54. break;
  55. default:
  56. break;
  57. }
  58. unlock_kernel();
  59. return result;
  60. }