亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? open.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
字號:
/*
 *  linux/fs/open.c
 *
 *  Copyright (C) 1991, 1992  Linus Torvalds
 */

#include <linux/vfs.h>
#include <linux/types.h>
#include <linux/utime.h>
#include <linux/errno.h>
#include <linux/fcntl.h>
#include <linux/stat.h>
#include <linux/string.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/signal.h>
#include <linux/tty.h>
#include <linux/time.h>

#include <asm/segment.h>

extern void fcntl_remove_locks(struct task_struct *, struct file *, unsigned int fd);

asmlinkage int sys_ustat(int dev, struct ustat * ubuf)
{
	return -ENOSYS;
}

asmlinkage int sys_statfs(const char * path, struct statfs * buf)
{
	struct inode * inode;
	int error;

	error = verify_area(VERIFY_WRITE, buf, sizeof(struct statfs));
	if (error)
		return error;
	error = namei(path,&inode);
	if (error)
		return error;
	if (!inode->i_sb->s_op->statfs) {
		iput(inode);
		return -ENOSYS;
	}
	inode->i_sb->s_op->statfs(inode->i_sb, buf);
	iput(inode);
	return 0;
}

asmlinkage int sys_fstatfs(unsigned int fd, struct statfs * buf)
{
	struct inode * inode;
	struct file * file;
	int error;

	error = verify_area(VERIFY_WRITE, buf, sizeof(struct statfs));
	if (error)
		return error;
	if (fd >= NR_OPEN || !(file = current->filp[fd]))
		return -EBADF;
	if (!(inode = file->f_inode))
		return -ENOENT;
	if (!inode->i_sb->s_op->statfs)
		return -ENOSYS;
	inode->i_sb->s_op->statfs(inode->i_sb, buf);
	return 0;
}

asmlinkage int sys_truncate(const char * path, unsigned int length)
{
	struct inode * inode;
	int error;

	error = namei(path,&inode);
	if (error)
		return error;
	if (S_ISDIR(inode->i_mode) || !permission(inode,MAY_WRITE)) {
		iput(inode);
		return -EACCES;
	}
	if (IS_RDONLY(inode)) {
		iput(inode);
		return -EROFS;
	}
	inode->i_size = length;
	if (inode->i_op && inode->i_op->truncate)
		inode->i_op->truncate(inode);
	inode->i_ctime = inode->i_mtime = CURRENT_TIME;
	inode->i_dirt = 1;
	error = notify_change(NOTIFY_SIZE, inode);
	iput(inode);
	return error;
}

asmlinkage int sys_ftruncate(unsigned int fd, unsigned int length)
{
	struct inode * inode;
	struct file * file;

	if (fd >= NR_OPEN || !(file = current->filp[fd]))
		return -EBADF;
	if (!(inode = file->f_inode))
		return -ENOENT;
	if (S_ISDIR(inode->i_mode) || !(file->f_mode & 2))
		return -EACCES;
	inode->i_size = length;
	if (inode->i_op && inode->i_op->truncate)
		inode->i_op->truncate(inode);
	inode->i_ctime = inode->i_mtime = CURRENT_TIME;
	inode->i_dirt = 1;
	return notify_change(NOTIFY_SIZE, inode);
}

/* 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)
{
	struct inode * inode;
	long actime,modtime;
	int error;

	error = namei(filename,&inode);
	if (error)
		return error;
	if (IS_RDONLY(inode)) {
		iput(inode);
		return -EROFS;
	}
	if (times) {
		if ((current->euid != inode->i_uid) && !suser()) {
			iput(inode);
			return -EPERM;
		}
		actime = get_fs_long((unsigned long *) &times->actime);
		modtime = get_fs_long((unsigned long *) &times->modtime);
		inode->i_ctime = CURRENT_TIME;
	} else {
		if ((current->euid != inode->i_uid) &&
		    !permission(inode,MAY_WRITE)) {
			iput(inode);
			return -EACCES;
		}
		actime = modtime = inode->i_ctime = CURRENT_TIME;
	}
	inode->i_atime = actime;
	inode->i_mtime = modtime;
	inode->i_dirt = 1;
	error = notify_change(NOTIFY_TIME, inode);
	iput(inode);
	return error;
}

/*
 * XXX we should use the real ids for checking _all_ components of the
 * path.  Now we only use them for the final component of the path.
 */
asmlinkage int sys_access(const char * filename,int mode)
{
	struct inode * inode;
	int res, i_mode;

	if (mode != (mode & S_IRWXO))	/* where's F_OK, X_OK, W_OK, R_OK? */
		return -EINVAL;
	res = namei(filename,&inode);
	if (res)
		return res;
	i_mode = inode->i_mode;
	res = i_mode & S_IRWXUGO;
	if (current->uid == inode->i_uid)
		res >>= 6;		/* needs cleaning? */
	else if (in_group_p(inode->i_gid))
		res >>= 3;		/* needs cleaning? */
	iput(inode);
	if ((res & mode) == mode)
		return 0;
	/*
	 * XXX we are doing this test last because we really should be
	 * swapping the effective with the real user id (temporarily),
	 * and then calling suser() routine.  If we do call the
	 * suser() routine, it needs to be called last. 
	 *
	 * XXX nope.  suser() is inappropriate and swapping the ids while
	 * decomposing the path would be racy.
	 */
	if ((!current->uid) &&
	    (S_ISDIR(i_mode) || !(mode & S_IXOTH) || (i_mode & S_IXUGO)))
		return 0;
	return -EACCES;
}

asmlinkage int sys_chdir(const char * filename)
{
	struct inode * inode;
	int error;

	error = namei(filename,&inode);
	if (error)
		return error;
	if (!S_ISDIR(inode->i_mode)) {
		iput(inode);
		return -ENOTDIR;
	}
	if (!permission(inode,MAY_EXEC)) {
		iput(inode);
		return -EACCES;
	}
	iput(current->pwd);
	current->pwd = inode;
	return (0);
}

asmlinkage int sys_fchdir(unsigned int fd)
{
	struct inode * inode;
	struct file * file;

	if (fd >= NR_OPEN || !(file = current->filp[fd]))
		return -EBADF;
	if (!(inode = file->f_inode))
		return -ENOENT;
	if (!S_ISDIR(inode->i_mode))
		return -ENOTDIR;
	if (!permission(inode,MAY_EXEC))
		return -EACCES;
	iput(current->pwd);
	current->pwd = inode;
	inode->i_count++;
	return (0);
}

asmlinkage int sys_chroot(const char * filename)
{
	struct inode * inode;
	int error;

	error = namei(filename,&inode);
	if (error)
		return error;
	if (!S_ISDIR(inode->i_mode)) {
		iput(inode);
		return -ENOTDIR;
	}
	if (!suser()) {
		iput(inode);
		return -EPERM;
	}
	iput(current->root);
	current->root = inode;
	return (0);
}

asmlinkage int sys_fchmod(unsigned int fd, mode_t mode)
{
	struct inode * inode;
	struct file * file;

	if (fd >= NR_OPEN || !(file = current->filp[fd]))
		return -EBADF;
	if (!(inode = file->f_inode))
		return -ENOENT;
	if ((current->euid != inode->i_uid) && !suser())
		return -EPERM;
	if (IS_RDONLY(inode))
		return -EROFS;
	if (mode == (mode_t) -1)
		mode = inode->i_mode;
	inode->i_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
	if (!suser() && !in_group_p(inode->i_gid))
		inode->i_mode &= ~S_ISGID;
	inode->i_ctime = CURRENT_TIME;
	inode->i_dirt = 1;
	return notify_change(NOTIFY_MODE, inode);
}

asmlinkage int sys_chmod(const char * filename, mode_t mode)
{
	struct inode * inode;
	int error;

	error = namei(filename,&inode);
	if (error)
		return error;
	if ((current->euid != inode->i_uid) && !suser()) {
		iput(inode);
		return -EPERM;
	}
	if (IS_RDONLY(inode)) {
		iput(inode);
		return -EROFS;
	}
	if (mode == (mode_t) -1)
		mode = inode->i_mode;
	inode->i_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
	if (!suser() && !in_group_p(inode->i_gid))
		inode->i_mode &= ~S_ISGID;
	inode->i_ctime = CURRENT_TIME;
	inode->i_dirt = 1;
	error = notify_change(NOTIFY_MODE, inode);
	iput(inode);
	return error;
}

asmlinkage int sys_fchown(unsigned int fd, uid_t user, gid_t group)
{
	struct inode * inode;
	struct file * file;

	if (fd >= NR_OPEN || !(file = current->filp[fd]))
		return -EBADF;
	if (!(inode = file->f_inode))
		return -ENOENT;
	if (IS_RDONLY(inode))
		return -EROFS;
	if (user == (uid_t) -1)
		user = inode->i_uid;
	if (group == (gid_t) -1)
		group = inode->i_gid;
	if ((current->euid == inode->i_uid && user == inode->i_uid &&
	     (in_group_p(group) || group == inode->i_gid)) ||
	    suser()) {
		inode->i_uid = user;
		inode->i_gid = group;
		inode->i_ctime = CURRENT_TIME;
		inode->i_dirt = 1;
		return notify_change(NOTIFY_UIDGID, inode);
	}
	return -EPERM;
}

asmlinkage int sys_chown(const char * filename, uid_t user, gid_t group)
{
	struct inode * inode;
	int error;

	error = lnamei(filename,&inode);
	if (error)
		return error;
	if (IS_RDONLY(inode)) {
		iput(inode);
		return -EROFS;
	}
	if (user == (uid_t) -1)
		user = inode->i_uid;
	if (group == (gid_t) -1)
		group = inode->i_gid;
	if ((current->euid == inode->i_uid && user == inode->i_uid &&
	     (in_group_p(group) || group == inode->i_gid)) ||
	    suser()) {
		inode->i_uid = user;
		inode->i_gid = group;
		inode->i_ctime = CURRENT_TIME;
		inode->i_dirt = 1;
		error = notify_change(NOTIFY_UIDGID, inode);
		iput(inode);
		return error;
	}
	iput(inode);
	return -EPERM;
}

/*
 * Note that while the flag value (low two bits) for sys_open means:
 *	00 - read-only
 *	01 - write-only
 *	10 - read-write
 *	11 - special
 * it is changed into
 *	00 - no permissions needed
 *	01 - read-permission
 *	10 - write-permission
 *	11 - read-write
 * for the internal routines (ie open_namei()/follow_link() etc). 00 is
 * used by symlinks.
 */
int do_open(const char * filename,int flags,int mode)
{
	struct inode * inode;
	struct file * f;
	int flag,error,fd;

	for(fd=0 ; fd<NR_OPEN ; fd++)
		if (!current->filp[fd])
			break;
	if (fd>=NR_OPEN)
		return -EMFILE;
	FD_CLR(fd,&current->close_on_exec);
	f = get_empty_filp();
	if (!f)
		return -ENFILE;
	current->filp[fd] = f;
	f->f_flags = flag = flags;
	f->f_mode = (flag+1) & O_ACCMODE;
	if (f->f_mode)
		flag++;
	if (flag & (O_TRUNC | O_CREAT))
		flag |= 2;
	error = open_namei(filename,flag,mode,&inode,NULL);
	if (error) {
		current->filp[fd]=NULL;
		f->f_count--;
		return error;
	}

	f->f_inode = inode;
	f->f_pos = 0;
	f->f_reada = 0;
	f->f_op = NULL;
	if (inode->i_op)
		f->f_op = inode->i_op->default_file_ops;
	if (f->f_op && f->f_op->open) {
		error = f->f_op->open(inode,f);
		if (error) {
			iput(inode);
			f->f_count--;
			current->filp[fd]=NULL;
			return error;
		}
	}
	f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
	return (fd);
}

asmlinkage int sys_open(const char * filename,int flags,int mode)
{
	char * tmp;
	int error;

	error = getname(filename, &tmp);
	if (error)
		return error;
	error = do_open(tmp,flags,mode);
	putname(tmp);
	return error;
}

asmlinkage int sys_creat(const char * pathname, int mode)
{
	return sys_open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode);
}

int close_fp(struct file *filp, unsigned int fd)
{
	struct inode *inode;

	if (filp->f_count == 0) {
		printk("VFS: Close: file count is 0\n");
		return 0;
	}
	inode = filp->f_inode;
	if (inode && S_ISREG(inode->i_mode))
		fcntl_remove_locks(current, filp, fd);
	if (filp->f_count > 1) {
		filp->f_count--;
		return 0;
	}
	if (filp->f_op && filp->f_op->release)
		filp->f_op->release(inode,filp);
	filp->f_count--;
	filp->f_inode = NULL;
	iput(inode);
	return 0;
}

asmlinkage int sys_close(unsigned int fd)
{	
	struct file * filp;

	if (fd >= NR_OPEN)
		return -EBADF;
	FD_CLR(fd, &current->close_on_exec);
	if (!(filp = current->filp[fd]))
		return -EBADF;
	current->filp[fd] = NULL;
	return (close_fp (filp, fd));
}

/*
 * This routine simulates a hangup on the tty, to arrange that users
 * are given clean terminals at login time.
 */
asmlinkage int sys_vhangup(void)
{
	struct tty_struct *tty;

	if (!suser())
		return -EPERM;
	/* See if there is a controlling tty. */
	if (current->tty < 0)
		return 0;
	tty = TTY_TABLE(MINOR(current->tty));
	tty_vhangup(tty);
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产麻豆视频精品| 天天综合网 天天综合色| 亚洲欧美一区二区三区久本道91 | 精品国产乱码久久久久久蜜臀 | 欧美色区777第一页| 久久久天堂av| 婷婷中文字幕一区三区| 欧美性感一区二区三区| 国产精品麻豆一区二区| 久久99精品国产.久久久久久| 色婷婷av久久久久久久| 国产精品麻豆99久久久久久| 成人a免费在线看| 久久久久一区二区三区四区| 成人理论电影网| 国产精品久久久久一区二区三区 | 色系网站成人免费| 亚洲成人你懂的| 91麻豆国产在线观看| 久久综合九色综合97_久久久| 天堂久久久久va久久久久| 91福利小视频| 一区二区三区色| 99re热视频精品| 中文字幕亚洲欧美在线不卡| 成人午夜免费视频| 亚洲一区免费视频| 欧洲激情一区二区| 亚洲黄色免费电影| 91黄色免费观看| 久久福利资源站| 亚洲日本va在线观看| 国产精品中文欧美| 久久午夜羞羞影院免费观看| 99精品桃花视频在线观看| 亚洲高清一区二区三区| 欧美日本在线播放| 日本不卡在线视频| 精品国产一区二区三区久久久蜜月| 蜜臀a∨国产成人精品| 精品日韩欧美在线| 国产黄色91视频| 国产精品久久久一本精品| 欧美日韩在线播| 成人少妇影院yyyy| 免费在线观看日韩欧美| 精品欧美久久久| 色乱码一区二区三区88| 精品写真视频在线观看| 亚洲国产精品一区二区久久 | 成人一级片网址| 日av在线不卡| 亚洲成人免费看| 国产精品福利一区| 日韩精品专区在线影院观看| 日韩高清在线观看| 亚洲人一二三区| 国产视频一区二区在线观看| 国产成人在线网站| 奇米精品一区二区三区在线观看 | 三级影片在线观看欧美日韩一区二区| 亚洲欧美一区二区在线观看| 欧美一区日本一区韩国一区| 国产成人亚洲综合a∨婷婷图片| 日韩电影免费在线| 亚洲蜜桃精久久久久久久| 中文幕一区二区三区久久蜜桃| 亚洲人成网站精品片在线观看 | 国产亚洲成av人在线观看导航 | 成人美女在线视频| 国产一区久久久| 美国十次综合导航| 日本vs亚洲vs韩国一区三区二区| 亚洲精品第一国产综合野| 亚洲人成在线播放网站岛国| 中文字幕不卡在线播放| 欧美熟乱第一页| 在线免费视频一区二区| 91首页免费视频| 色天使色偷偷av一区二区| www.性欧美| 国产制服丝袜一区| 午夜久久久久久电影| 亚洲成人免费看| 日韩在线a电影| 久久精品国产**网站演员| 免费成人深夜小野草| 日韩avvvv在线播放| 男人的j进女人的j一区| 日本大胆欧美人术艺术动态| 麻豆高清免费国产一区| 国产精品综合一区二区三区| 91久久一区二区| av在线不卡观看免费观看| 91久久精品一区二区三区| 色婷婷亚洲一区二区三区| 91免费观看视频在线| 欧美日韩中文字幕精品| 欧美一级午夜免费电影| 精品日韩成人av| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 午夜日韩在线观看| 日本成人中文字幕| 国产一区二区美女诱惑| 成人激情av网| 欧美亚洲愉拍一区二区| 日韩你懂的在线观看| 国产精品麻豆网站| 图片区日韩欧美亚洲| 久久成人久久鬼色| 北条麻妃国产九九精品视频| 在线看国产一区二区| 日韩精品专区在线影院观看 | 一区二区三区电影在线播| 亚洲大片一区二区三区| 蜜臀久久99精品久久久画质超高清 | 久久精品视频免费观看| 国产精品色呦呦| 日韩电影免费在线看| a美女胸又www黄视频久久| 欧美日韩国产片| 国产精品蜜臀在线观看| 丝袜美腿亚洲一区二区图片| 国产成人在线网站| 欧美高清视频在线高清观看mv色露露十八| 91视视频在线直接观看在线看网页在线看 | 青青草伊人久久| 成人av在线资源| 欧美一区二视频| 一区二区三区免费在线观看| 国产一区三区三区| 欧美日韩一区二区欧美激情| 国产亚洲精品久| 日韩精品电影在线| 99视频精品全部免费在线| 精品国产乱码久久久久久蜜臀| 一区二区三区中文在线观看| 国产美女视频91| 欧美一区二区三区精品| 亚洲最新在线观看| 成人美女在线观看| 久久久亚洲午夜电影| 亚洲成a人v欧美综合天堂| 成人蜜臀av电影| 日本一区二区三级电影在线观看| 中文字幕乱码亚洲精品一区| 久久精品久久精品| 色老头久久综合| 国产精品热久久久久夜色精品三区 | 日韩欧美成人午夜| 亚洲综合一二区| 91小视频免费看| 中文天堂在线一区| 国产伦精品一区二区三区免费| 91精品国产综合久久久久久漫画 | 91丝袜美腿高跟国产极品老师| 精品久久一区二区三区| 美国十次综合导航| 91精品国模一区二区三区| 偷拍亚洲欧洲综合| 在线视频欧美精品| 一区二区三区在线视频观看58 | 国产一区二区三区在线观看免费视频 | 日韩av电影免费观看高清完整版 | 激情丁香综合五月| 日韩三级在线观看| 亚洲国产电影在线观看| 国产精品自拍三区| 国产婷婷精品av在线| 国产一区欧美二区| 欧美激情中文字幕一区二区| 国产东北露脸精品视频| 国产日本一区二区| 国产suv精品一区二区三区| 欧美三级电影精品| 亚洲午夜精品网| 欧美无砖砖区免费| 日韩激情在线观看| 日韩手机在线导航| 精品午夜一区二区三区在线观看| 欧美一级午夜免费电影| 精品中文字幕一区二区| 日韩精品一区二区三区中文精品| 蜜臀久久99精品久久久画质超高清 | 粉嫩嫩av羞羞动漫久久久| 中文字幕成人av| 91久久精品一区二区| 亚洲成av人综合在线观看| 欧美一级片免费看| 极品美女销魂一区二区三区| 久久精品一区二区三区av| 成人av在线资源网| 亚洲一区二区在线观看视频| 欧美久久一二区| 国产资源精品在线观看| 国产精品高潮呻吟久久| 欧美性大战xxxxx久久久| 狂野欧美性猛交blacked| 国产蜜臀97一区二区三区| 91麻豆.com|