ioctl.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:2k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * linux/fs/ext2/ioctl.c
  3.  *
  4.  * Copyright (C) 1993, 1994, 1995
  5.  * Remy Card (card@masi.ibp.fr)
  6.  * Laboratoire MASI - Institut Blaise Pascal
  7.  * Universite Pierre et Marie Curie (Paris VI)
  8.  */
  9. #include <linux/fs.h>
  10. #include <linux/ext2_fs.h>
  11. #include <linux/sched.h>
  12. #include <asm/uaccess.h>
  13. int ext2_ioctl (struct inode * inode, struct file * filp, unsigned int cmd,
  14. unsigned long arg)
  15. {
  16. unsigned int flags;
  17. ext2_debug ("cmd = %u, arg = %lun", cmd, arg);
  18. switch (cmd) {
  19. case EXT2_IOC_GETFLAGS:
  20. flags = inode->u.ext2_i.i_flags & EXT2_FL_USER_VISIBLE;
  21. return put_user(flags, (int *) arg);
  22. case EXT2_IOC_SETFLAGS: {
  23. unsigned int oldflags;
  24. if (IS_RDONLY(inode))
  25. return -EROFS;
  26. if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER))
  27. return -EACCES;
  28. if (get_user(flags, (int *) arg))
  29. return -EFAULT;
  30. oldflags = inode->u.ext2_i.i_flags;
  31. /*
  32.  * The IMMUTABLE and APPEND_ONLY flags can only be changed by
  33.  * the relevant capability.
  34.  *
  35.  * This test looks nicer. Thanks to Pauline Middelink
  36.  */
  37. if ((flags ^ oldflags) & (EXT2_APPEND_FL | EXT2_IMMUTABLE_FL)) {
  38. if (!capable(CAP_LINUX_IMMUTABLE))
  39. return -EPERM;
  40. }
  41. flags = flags & EXT2_FL_USER_MODIFIABLE;
  42. flags |= oldflags & ~EXT2_FL_USER_MODIFIABLE;
  43. inode->u.ext2_i.i_flags = flags;
  44. if (flags & EXT2_SYNC_FL)
  45. inode->i_flags |= S_SYNC;
  46. else
  47. inode->i_flags &= ~S_SYNC;
  48. if (flags & EXT2_APPEND_FL)
  49. inode->i_flags |= S_APPEND;
  50. else
  51. inode->i_flags &= ~S_APPEND;
  52. if (flags & EXT2_IMMUTABLE_FL)
  53. inode->i_flags |= S_IMMUTABLE;
  54. else
  55. inode->i_flags &= ~S_IMMUTABLE;
  56. if (flags & EXT2_NOATIME_FL)
  57. inode->i_flags |= S_NOATIME;
  58. else
  59. inode->i_flags &= ~S_NOATIME;
  60. inode->i_ctime = CURRENT_TIME;
  61. mark_inode_dirty(inode);
  62. return 0;
  63. }
  64. case EXT2_IOC_GETVERSION:
  65. return put_user(inode->i_generation, (int *) arg);
  66. case EXT2_IOC_SETVERSION:
  67. if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER))
  68. return -EPERM;
  69. if (IS_RDONLY(inode))
  70. return -EROFS;
  71. if (get_user(inode->i_generation, (int *) arg))
  72. return -EFAULT;
  73. inode->i_ctime = CURRENT_TIME;
  74. mark_inode_dirty(inode);
  75. return 0;
  76. default:
  77. return -ENOTTY;
  78. }
  79. }