LINUX.ORG.RU

from #include <bits/fcntl.h>
define O_ACCMODE 0003
#define O_RDONLY 00
#define O_WRONLY 01
#define O_RDWR 02
#define O_CREAT 0100 /* not fcntl */
#define O_EXCL 0200 /* not fcntl */
#define O_NOCTTY 0400 /* not fcntl */ !!!!
#define O_TRUNC 01000 /* not fcntl */
#define O_APPEND 02000
#define O_NONBLOCK 04000
#define O_NDELAY O_NONBLOCK
#define O_SYNC 010000
#define O_FSYNC O_SYNC
#define O_ASYNC 020000

alexsy ★★
() автор топика
Ответ на: комментарий от alexsy

То есть O_RDONLY можно менять на O_RDWR что ли? А я думал, можно специально от рута открыть например файл, к которому доступа ни у кого нет, сделать setuid, и у тебя гарантия, что дальше ты файл никак не испортишь.

Teak ★★★★★
()

Задача поставлена странно. Судя из условия, Вам нужно просто отсоединить процесс от контрольного терминала. Делается это, например, через ioctl (fd,TIOCNOTTY). А что значит "поменять включить опцию файла" и зачем это делать?

Chumka ★★★
()
Ответ на: комментарий от klalafuda

>> то есть системный вызов open( pathname, flag ) флаг был O_RDWR а
>> надо O_RDWR | O_NOCTTY
> никак 

asmlinkage long sys_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg)
{
    struct file *filp;
    long err = -EBADF;

    filp = fget(fd);
    if (!filp)
        goto out;

    err = security_file_fcntl(filp, cmd, arg);
    if (err) {
        fput(filp);
        return err;
    }

    err = do_fcntl(fd, cmd, arg, filp);

    fput(filp);
out:
    return err;
}

static long do_fcntl(int fd, unsigned int cmd, unsigned long arg,
        struct file *filp)
{
    long err = -EINVAL;

    switch (cmd) {
    ......
    case F_GETFL:
        err = filp->f_flags;
        break;
    case F_SETFL:
        err = setfl(fd, filp, arg);
        break;
    ......
    return err;
}

#define SETFL_MASK (O_APPEND | O_NONBLOCK | O_NDELAY | FASYNC | O_DIRECT | O_NOATIME)

static int setfl(int fd, struct file * filp, unsigned long arg)
{
.........
    filp->f_flags = (arg & SETFL_MASK) | (filp->f_flags & ~SETFL_MASK);
.........
}

// wbr

klalafuda ★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.