ioctl.c 1.4 KB

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