荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: GyeaonWoo (柏林恋人), 信区: Linux
标  题: Linus's Linux--fs/fcntl.c
发信站: 荔园晨风BBS站 (Mon Aug 25 19:56:50 2003), 站内信件

#include <string.h>
#include <errno.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <asm/segment.h>

#include <fcntl.h>
#include <sys/stat.h>

extern int sys_close(int fd);

static int dupfd(unsigned int fd, unsigned int arg)
{
        if (fd >= NR_OPEN || !current->filp[fd])
                return -EBADF;
        if (arg >= NR_OPEN)
                return -EINVAL;
        while (arg < NR_OPEN)
                if (current->filp[arg])
                        arg++;
                else
                        break;
        if (arg >= NR_OPEN)
                return -EMFILE;
        current->close_on_exec &= ~(1<<arg);
        (current->filp[arg] = current->filp[fd])->f_count++;
        return arg;
}

int sys_dup2(unsigned int oldfd, unsigned int newfd)
{
        sys_close(newfd);
        return dupfd(oldfd,newfd);
}

int sys_dup(unsigned int fildes)
{
        return dupfd(fildes,0);
}

int sys_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg)
{
        struct file * filp;

        if (fd >= NR_OPEN || !(filp = current->filp[fd]))
                return -EBADF;
        switch (cmd) {
                case F_DUPFD:
                        return dupfd(fd,arg);
                case F_GETFD:
                        return (current->close_on_exec>>fd)&1;
                case F_SETFD:
                        if (arg&1)
                                current->close_on_exec |= (1<<fd);
                        else
                                current->close_on_exec &= ~(1<<fd);
                        return 0;
                case F_GETFL:
                        return filp->f_flags;
                case F_SETFL:
                        filp->f_flags &= ~(O_APPEND | O_NONBLOCK);
                        filp->f_flags |= arg & (O_APPEND | O_NONBLOCK);
                        return 0;
                case F_GETLK:   case F_SETLK:   case F_SETLKW:
                        return -1;
                default:
                        return -1;
        }
}

--
刻录服务,质量保证,5元一张,多刻有折,自己提供空碟2元刻一张
刻录上传:ftp:upload:upload@192.168.35.5:614

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.35.5]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店