本文整理汇总了C++中IS_RDONLY函数的典型用法代码示例。如果您正苦于以下问题:C++ IS_RDONLY函数的具体用法?C++ IS_RDONLY怎么用?C++ IS_RDONLY使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了IS_RDONLY函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ext2_ioctl
/* 向文件发送一个命令,如获取文件信息的命令,
* 将文件的信息拷贝到arg所指向的内存,如关于文件的flag和版本等信息
*/
int ext2_ioctl (struct inode * inode, struct file * filp, unsigned int cmd,
unsigned long arg)
{
ext2_debug ("cmd = %u, arg = %lu\n", cmd, arg);
switch (cmd) {
case EXT2_IOC_GETFLAGS:
put_fs_long (inode->u.ext2_i.i_flags, (long *) arg);
return 0;
case EXT2_IOC_SETFLAGS:
if ((current->euid != inode->i_uid) && !suser())
return -EPERM;
if (IS_RDONLY(inode))
return -EROFS;
inode->u.ext2_i.i_flags = get_fs_long ((long *) arg);
inode->i_ctime = CURRENT_TIME;
inode->i_dirt = 1;
return 0;
case EXT2_IOC_GETVERSION:
put_fs_long (inode->u.ext2_i.i_version, (long *) arg);
return 0;
case EXT2_IOC_SETVERSION:
if ((current->euid != inode->i_uid) && !suser())
return -EPERM;
if (IS_RDONLY(inode))
return -EROFS;
inode->u.ext2_i.i_version = get_fs_long ((long *) arg);
inode->i_ctime = CURRENT_TIME;
inode->i_dirt = 1;
return 0;
default:
return -EINVAL;
}
}
示例2: xiafs_readdir
static int xiafs_readdir(struct inode * inode,
struct file * filp, struct dirent * dirent, int count)
{
u_int offset, i;
struct buffer_head * bh;
struct xiafs_direct * de;
if (!inode || !inode->i_sb || !S_ISDIR(inode->i_mode))
return -EBADF;
if (inode->i_size & (XIAFS_ZSIZE(inode->i_sb) - 1) )
return -EBADF;
while (filp->f_pos < inode->i_size) {
offset = filp->f_pos & (XIAFS_ZSIZE(inode->i_sb) - 1);
bh = xiafs_bread(inode, filp->f_pos >> XIAFS_ZSIZE_BITS(inode->i_sb),0);
if (!bh) {
filp->f_pos += XIAFS_ZSIZE(inode->i_sb)-offset;
continue;
}
de = (struct xiafs_direct *) (offset + bh->b_data);
while (offset < XIAFS_ZSIZE(inode->i_sb) && filp->f_pos < inode->i_size) {
if (de->d_ino > inode->i_sb->u.xiafs_sb.s_ninodes ||
de->d_rec_len < 12 ||
(char *)de+de->d_rec_len > XIAFS_ZSIZE(inode->i_sb)+bh->b_data ||
de->d_name_len < 1 || de->d_name_len + 8 > de->d_rec_len ||
de->d_name_len > _XIAFS_NAME_LEN ||
de->d_name[de->d_name_len] ) {
printk("XIA-FS: bad directory entry (%s %d)\n", WHERE_ERR);
brelse(bh);
return 0;
}
offset += de->d_rec_len;
filp->f_pos += de->d_rec_len;
if (de->d_ino) {
for (i = 0; i < de->d_name_len ; i++)
put_fs_byte(de->d_name[i],i+dirent->d_name);
put_fs_byte(0,i+dirent->d_name);
put_fs_long(de->d_ino,&dirent->d_ino);
put_fs_word(i,&dirent->d_reclen);
brelse(bh);
if (!IS_RDONLY (inode)) {
inode->i_atime=CURRENT_TIME;
inode->i_dirt=1;
}
return i;
}
de = (struct xiafs_direct *) (offset + bh->b_data);
}
brelse(bh);
if (offset > XIAFS_ZSIZE(inode->i_sb)) {
printk("XIA-FS: bad directory (%s %d)\n", WHERE_ERR);
return 0;
}
}
if (!IS_RDONLY (inode)) {
inode->i_atime=CURRENT_TIME;
inode->i_dirt=1;
}
return 0;
}
示例3: sys_chmod
int sys_chmod(char *filename, mode_t mode)
{
struct inode *inode;
register struct inode *inodep;
int error = namei(filename, &inode, 0, 0);
#ifdef USE_NOTIFY_CHANGE
struct iattr newattrs;
register struct iattr *nap = &newattrs;
inodep = inode;
if (error)
return error;
if (IS_RDONLY(inodep)) {
iput(inodep);
return -EROFS;
}
if (mode == (mode_t) - 1)
mode = inodep->i_mode;
nap->ia_mode = (mode & S_IALLUGO) | (inodep->i_mode & ~S_IALLUGO);
nap->ia_valid = ATTR_MODE | ATTR_CTIME;
inodep->i_dirt = 1;
error = notify_change(inodep, nap);
iput(inodep);
#else
if (!error) {
inodep = inode;
if (IS_RDONLY(inodep)) {
iput(inodep);
return -EROFS;
}
if (mode == (mode_t) - 1)
mode = inodep->i_mode;
mode = (mode & S_IALLUGO) | (inodep->i_mode & ~S_IALLUGO);
if ((current->euid != inodep->i_uid) && !suser()) {
/* FIXME - Should we iput(inodep); at this point? */
return -EPERM;
}
if (!suser() && !in_group_p(inodep->i_gid)) {
mode &= ~S_ISGID;
}
inodep->i_mode = mode;
inodep->i_dirt = 1;
iput(inodep);
}
#endif
return error;
}
示例4: sys_chmod
asmlinkage int sys_chmod(const char * filename, mode_t mode)
{
struct inode * inode;
int error;
struct iattr newattrs;
error = namei(filename,&inode);
if (error)
return error;
if (IS_RDONLY(inode)) {
iput(inode);
return -EROFS;
}
if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) {
iput(inode);
return -EPERM;
}
if (mode == (mode_t) -1)
mode = inode->i_mode;
newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
inode->i_dirt = 1;
error = notify_change(inode, &newattrs);
iput(inode);
return error;
}
示例5: sys_utime
/* If times==NULL, set access and modification to current time,
* must be owner or have write permission.
* Else, update from *times, must be owner or super user.
*/
asmlinkage int sys_utime(char * filename, struct utimbuf * times)
{
int error;
struct inode * inode;
struct iattr newattrs;
error = namei(filename,&inode);
if (error)
return error;
if (IS_RDONLY(inode)) {
iput(inode);
return -EROFS;
}
/* Don't worry, the checks are done in inode_change_ok() */
newattrs.ia_valid = ATTR_CTIME | ATTR_MTIME | ATTR_ATIME;
if (times) {
error = verify_area(VERIFY_READ, times, sizeof(*times));
if (error) {
iput(inode);
return error;
}
newattrs.ia_atime = get_user(×->actime);
newattrs.ia_mtime = get_user(×->modtime);
newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
} else {
if (current->fsuid != inode->i_uid &&
(error = permission(inode,MAY_WRITE)) != 0) {
iput(inode);
return error;
}
}
error = notify_change(inode, &newattrs);
iput(inode);
return error;
}
示例6: sys_truncate
int sys_truncate(char *path, loff_t length)
{
struct inode *inode;
register struct inode *inodep;
int error;
error = namei(path, &inode, NOT_DIR, MAY_WRITE);
inodep = inode;
if (error)
return error;
if (IS_RDONLY(inodep)) {
iput(inodep);
return -EROFS;
}
#ifdef BLOAT_FS
error = get_write_access(inodep);
if (error) {
iput(inodep);
return error;
}
#endif
error = do_truncate(inodep, length);
put_write_access(inodep);
iput(inodep);
return error;
}
示例7: do_chown
static int do_chown(register struct inode *inode, uid_t user, gid_t group)
{
struct iattr newattrs;
register struct iattr *nap = &newattrs;
if (IS_RDONLY(inode))
return -EROFS;
if (user == (uid_t) - 1)
user = inode->i_uid;
if (group == (gid_t) - 1)
group = inode->i_gid;
nap->ia_mode = inode->i_mode;
nap->ia_uid = user;
nap->ia_gid = group;
nap->ia_valid = ATTR_UID | ATTR_GID | ATTR_CTIME;
/*
* If the owner has been changed, remove the setuid bit
*/
if (user != inode->i_uid && (inode->i_mode & S_ISUID)) {
nap->ia_mode &= ~S_ISUID;
nap->ia_valid |= ATTR_MODE;
}
/*
* If the group has been changed, remove the setgid bit
*/
if (group != inode->i_gid && (inode->i_mode & S_ISGID)) {
nap->ia_mode &= ~S_ISGID;
nap->ia_valid |= ATTR_MODE;
}
inode->i_dirt = 1;
return notify_change(inode, nap);
}
示例8: xfs_attrmulti_attr_set
STATIC int
xfs_attrmulti_attr_set(
struct inode *inode,
char *name,
const char __user *ubuf,
__uint32_t len,
__uint32_t flags)
{
char *kbuf;
int error = EFAULT;
if (IS_RDONLY(inode))
return -EROFS;
if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
return EPERM;
if (len > XATTR_SIZE_MAX)
return EINVAL;
kbuf = memdup_user(ubuf, len);
if (IS_ERR(kbuf))
return PTR_ERR(kbuf);
error = xfs_attr_set(XFS_I(inode), name, kbuf, len, flags);
return error;
}
示例9: switch
struct chan *devopen(struct chan *c, int omode, struct dirtab *tab, int ntab,
Devgen * gen)
{
int i;
struct dir dir;
dir.qid.path = 0;
for (i = 0;; i++) {
switch ((*gen) (c, NULL, tab, ntab, i, &dir)) {
case -1:
goto Return;
case 0:
break;
case 1:
if (c->qid.path == dir.qid.path) {
devpermcheck(dir.uid, dir.mode, omode);
goto Return;
}
break;
}
}
Return:
c->offset = 0;
if ((c->qid.type & QTDIR) && !IS_RDONLY(omode))
error("Tried opening dir with non-read-only mode %o", omode);
c->mode = openmode(omode);
c->flag |= COPEN;
return c;
}
示例10: sys_chmod
asmlinkage long sys_chmod(const char * filename, mode_t mode)
{
struct nameidata nd;
struct inode * inode;
int error;
struct iattr newattrs;
error = user_path_walk(filename, &nd);
if (error)
goto out;
inode = nd.dentry->d_inode;
error = -EROFS;
if (IS_RDONLY(inode))
goto dput_and_out;
error = -EPERM;
if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
goto dput_and_out;
if (mode == (mode_t) -1)
mode = inode->i_mode;
newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
error = notify_change(nd.dentry, &newattrs);
dput_and_out:
path_release(&nd);
out:
return error;
}
示例11: sys_utimes
int sys_utimes(char *filename, struct timeval *utimes)
{
int error;
struct inode *inode;
register struct inode *inodep;
struct iattr newattrs;
error = namei(filename, &inode, 0, 0);
inodep = inode;
if (error)
return error;
if (IS_RDONLY(inodep)) {
iput(inodep);
return -EROFS;
}
/* Don't worry, the checks are done in inode_change_ok() */
newattrs.ia_valid = ATTR_CTIME | ATTR_MTIME | ATTR_ATIME;
if (utimes) {
struct timeval times[2];
if (error = verified_memcpy_fromfs(×, utimes, sizeof(times))) {
iput(inodep);
return error;
}
newattrs.ia_atime = times[0].tv_sec;
newattrs.ia_mtime = times[1].tv_sec;
newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
} else if ((error = permission(inodep, MAY_WRITE)) != 0) {
iput(inodep);
return error;
}
error = notify_change(inodep, &newattrs);
iput(inodep);
return error;
}
示例12: xfs_attrmulti_attr_set
STATIC int
xfs_attrmulti_attr_set(
struct vnode *vp,
char *name,
const char __user *ubuf,
__uint32_t len,
__uint32_t flags)
{
char *kbuf;
int error = EFAULT;
if (IS_RDONLY(&vp->v_inode))
return -EROFS;
if (IS_IMMUTABLE(&vp->v_inode) || IS_APPEND(&vp->v_inode))
return EPERM;
if (len > XATTR_SIZE_MAX)
return EINVAL;
kbuf = kmalloc(len, GFP_KERNEL);
if (!kbuf)
return ENOMEM;
if (copy_from_user(kbuf, ubuf, len))
goto out_kfree;
VOP_ATTR_SET(vp, name, kbuf, len, flags, NULL, error);
out_kfree:
kfree(kbuf);
return error;
}
示例13: do_sys_truncate
static inline long do_sys_truncate(const char * path, loff_t length)
{
struct nameidata nd;
struct inode * inode;
int error;
error = -EINVAL;
if (length < 0) /* sorry, but loff_t says... */
goto out;
error = user_path_walk(path, &nd);
if (error)
goto out;
inode = nd.dentry->d_inode;
/* For directories it's -EISDIR, for other non-regulars - -EINVAL */
error = -EISDIR;
if (S_ISDIR(inode->i_mode))
goto dput_and_out;
error = -EINVAL;
if (!S_ISREG(inode->i_mode))
goto dput_and_out;
error = permission(inode,MAY_WRITE);
if (error)
goto dput_and_out;
error = -EROFS;
if (IS_RDONLY(inode))
goto dput_and_out;
error = -EPERM;
if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
goto dput_and_out;
/*
* Make sure that there are no leases.
*/
error = get_lease(inode, FMODE_WRITE);
if (error)
goto dput_and_out;
error = get_write_access(inode);
if (error)
goto dput_and_out;
error = locks_verify_truncate(inode, NULL, length);
if (!error)
{
DQUOT_INIT(inode);
error = do_truncate(nd.dentry, length);
}
put_write_access(inode);
dput_and_out:
path_release(&nd);
out:
return error;
}
示例14: sys_fchmod
asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
{
struct inode * inode;
struct dentry * dentry;
struct file * file;
int err = -EBADF;
struct iattr newattrs;
file = fget(fd);
if (!file)
goto out;
dentry = file->f_dentry;
inode = dentry->d_inode;
err = -EROFS;
if (IS_RDONLY(inode))
goto out_putf;
err = -EPERM;
if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
goto out_putf;
if (mode == (mode_t) -1)
mode = inode->i_mode;
newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
err = notify_change(dentry, &newattrs);
out_putf:
fput(file);
out:
return err;
}
示例15: chown_common
static int chown_common(struct dentry * dentry, uid_t user, gid_t group)
{
struct inode * inode;
int error;
struct iattr newattrs;
error = -ENOENT;
if (!(inode = dentry->d_inode)) {
printk("chown_common: NULL inode\n");
goto out;
}
error = -EROFS;
if (IS_RDONLY(inode))
goto out;
error = -EPERM;
if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
goto out;
if (user == (uid_t) -1)
user = inode->i_uid;
if (group == (gid_t) -1)
group = inode->i_gid;
newattrs.ia_mode = inode->i_mode;
newattrs.ia_uid = user;
newattrs.ia_gid = group;
newattrs.ia_valid = ATTR_UID | ATTR_GID | ATTR_CTIME;
/*
* If the user or group of a non-directory has been changed by a
* non-root user, remove the setuid bit.
* 19981026 David C Niemi <[email protected]>
*
* Changed this to apply to all users, including root, to avoid
* some races. This is the behavior we had in 2.0. The check for
* non-root was definitely wrong for 2.2 anyway, as it should
* have been using CAP_FSETID rather than fsuid -- 19990830 SD.
*/
if ((inode->i_mode & S_ISUID) == S_ISUID &&
!S_ISDIR(inode->i_mode))
{
newattrs.ia_mode &= ~S_ISUID;
newattrs.ia_valid |= ATTR_MODE;
}
/*
* Likewise, if the user or group of a non-directory has been changed
* by a non-root user, remove the setgid bit UNLESS there is no group
* execute bit (this would be a file marked for mandatory locking).
* 19981026 David C Niemi <[email protected]>
*
* Removed the fsuid check (see the comment above) -- 19990830 SD.
*/
if (((inode->i_mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP))
&& !S_ISDIR(inode->i_mode))
{
newattrs.ia_mode &= ~S_ISGID;
newattrs.ia_valid |= ATTR_MODE;
}
error = DQUOT_TRANSFER(dentry, &newattrs);
out:
return error;
}