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

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

?? ulockmgr.c

?? FUSE文件系統開發工具,將內核層面的文件系統開發過程平移到應用層面上來。
?? C
字號:
/*  libulockmgr: Userspace Lock Manager Library  Copyright (C) 2006  Miklos Szeredi <miklos@szeredi.hu>  This program can be distributed under the terms of the GNU LGPLv2.  See the file COPYING.LIB*//* #define DEBUG 1 */#include "ulockmgr.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <pthread.h>#include <errno.h>#include <assert.h>#include <signal.h>#include <sys/stat.h>#include <sys/socket.h>#include <sys/wait.h>struct message {	unsigned intr : 1;	unsigned nofd : 1;	pthread_t thr;	int cmd;	int fd;	struct flock lock;	int error;};struct fd_store {	struct fd_store *next;	int fd;	int inuse;};struct owner {	struct owner *next;	struct owner *prev;	struct fd_store *fds;	void *id;	size_t id_len;	int cfd;};static pthread_mutex_t ulockmgr_lock;static int ulockmgr_cfd = -1;static struct owner owner_list = { .next = &owner_list, .prev = &owner_list };#define MAX_SEND_FDS 2static void list_del_owner(struct owner *owner){	struct owner *prev = owner->prev;	struct owner *next = owner->next;	prev->next = next;	next->prev = prev;}static void list_add_owner(struct owner *owner, struct owner *next){	struct owner *prev = next->prev;	owner->next = next;	owner->prev = prev;	prev->next = owner;	next->prev = owner;}/* * There's a bug in the linux kernel (< 2.6.22) recv() implementation * on AF_UNIX, SOCK_STREAM sockets, that could cause it to return * zero, even if data was available.  Retrying the recv will return * the data in this case. */static int do_recv(int sock, void *buf, size_t len, int flags){	int res = recv(sock, buf, len, flags);	if (res == 0)		res = recv(sock, buf, len, flags);	return res;}static int ulockmgr_send_message(int sock, void *buf, size_t buflen,				 int *fdp, int numfds){	struct msghdr msg;	struct cmsghdr *p_cmsg;	struct iovec vec;	size_t cmsgbuf[CMSG_SPACE(sizeof(int) * MAX_SEND_FDS) / sizeof(size_t)];	int res;	assert(numfds <= MAX_SEND_FDS);	msg.msg_control = cmsgbuf;	msg.msg_controllen = sizeof(cmsgbuf);	p_cmsg = CMSG_FIRSTHDR(&msg);	p_cmsg->cmsg_level = SOL_SOCKET;	p_cmsg->cmsg_type = SCM_RIGHTS;	p_cmsg->cmsg_len = CMSG_LEN(sizeof(int) * numfds);	memcpy(CMSG_DATA(p_cmsg), fdp, sizeof(int) * numfds);	msg.msg_controllen = p_cmsg->cmsg_len;	msg.msg_name = NULL;	msg.msg_namelen = 0;	msg.msg_iov = &vec;	msg.msg_iovlen = 1;	msg.msg_flags = 0;	vec.iov_base = buf;	vec.iov_len = buflen;	res = sendmsg(sock, &msg, MSG_NOSIGNAL);	if (res == -1) {		perror("libulockmgr: sendmsg");		return -1;	}	if ((size_t) res != buflen) {		fprintf(stderr, "libulockmgr: sendmsg short\n");		return -1;	}	return 0;}static int ulockmgr_start_daemon(void){	int sv[2];	int res;	char tmp[64];	res = socketpair(AF_UNIX, SOCK_STREAM, 0, sv);	if (res == -1) {		perror("libulockmgr: socketpair");		return -1;	}	snprintf(tmp, sizeof(tmp), "exec ulockmgr_server %i", sv[0]);	res = system(tmp);	close(sv[0]);	if (res == -1 || !WIFEXITED(res) || WEXITSTATUS(res) != 0) {		close(sv[1]);		return -1;	}	ulockmgr_cfd = sv[1];	return 0;}static struct owner *ulockmgr_new_owner(const void *id, size_t id_len){	int sv[2];	int res;	char c = 'm';	struct owner *o;	if (ulockmgr_cfd == -1 && ulockmgr_start_daemon() == -1)		return NULL;	o = calloc(1, sizeof(struct owner) + id_len);	if (!o) {		fprintf(stderr, "libulockmgr: failed to allocate memory\n");		return NULL;	}	o->id = o + 1;	o->id_len = id_len;	res = socketpair(AF_UNIX, SOCK_STREAM, 0, sv);	if (res == -1) {		perror("libulockmgr: socketpair");		goto out_free;	}	res = ulockmgr_send_message(ulockmgr_cfd, &c, sizeof(c), &sv[0], 1);	close(sv[0]);	if (res == -1) {		close(ulockmgr_cfd);		ulockmgr_cfd = -1;		goto out_close;	}	o->cfd = sv[1];	memcpy(o->id, id, id_len);	list_add_owner(o, &owner_list);	return o;out_close:	close(sv[1]);out_free:	free(o);	return NULL;}static int ulockmgr_send_request(struct message *msg, const void *id,				 size_t id_len){	int sv[2];	int cfd;	struct owner *o;	struct fd_store *f = NULL;	struct fd_store *newf = NULL;	struct fd_store **fp;	int fd = msg->fd;	int cmd = msg->cmd;	int res;	int unlockall = (cmd == F_SETLK && msg->lock.l_type == F_UNLCK &&			 msg->lock.l_start == 0 && msg->lock.l_len == 0);	for (o = owner_list.next; o != &owner_list; o = o->next)		if (o->id_len == id_len && memcmp(o->id, id, id_len) == 0)			break;	if (o == &owner_list)		o = NULL;	if (!o && cmd != F_GETLK && msg->lock.l_type != F_UNLCK)		o = ulockmgr_new_owner(id, id_len);	if (!o) {		if (cmd == F_GETLK) {			res = fcntl(msg->fd, F_GETLK, &msg->lock);			return (res == -1) ? -errno : 0;		} else if (msg->lock.l_type == F_UNLCK)			return 0;		else			return -ENOLCK;	}	if (unlockall)		msg->nofd = 1;	else {		for (fp = &o->fds; *fp; fp = &(*fp)->next) {			f = *fp;			if (f->fd == fd) {				msg->nofd = 1;				break;			}		}	}	if (!msg->nofd) {		newf = f = calloc(1, sizeof(struct fd_store));		if (!f) {			fprintf(stderr, "libulockmgr: failed to allocate memory\n");			return -ENOLCK;		}	}	res = socketpair(AF_UNIX, SOCK_STREAM, 0, sv);	if (res == -1) {		perror("libulockmgr: socketpair");		free(newf);		return -ENOLCK;	}	cfd = sv[1];	sv[1] = msg->fd;	res = ulockmgr_send_message(o->cfd, msg, sizeof(struct message), sv,				    msg->nofd ? 1 : 2);	close(sv[0]);	if (res == -1) {		free(newf);		close(cfd);		return -EIO;	}	if (newf) {		newf->fd = msg->fd;		newf->next = o->fds;		o->fds = newf;	}	if (f)		f->inuse++;	res = do_recv(cfd, msg, sizeof(struct message), MSG_WAITALL);	if (res == -1) {		perror("libulockmgr: recv");		msg->error = EIO;	} else if (res != sizeof(struct message)) {		fprintf(stderr, "libulockmgr: recv short\n");		msg->error = EIO;	} else if (cmd == F_SETLKW && msg->error == EAGAIN) {		pthread_mutex_unlock(&ulockmgr_lock);		while (1) {			sigset_t old;			sigset_t unblock;			int errno_save;			sigemptyset(&unblock);			sigaddset(&unblock, SIGUSR1);			pthread_sigmask(SIG_UNBLOCK, &unblock, &old);			res = do_recv(cfd, msg, sizeof(struct message),				      MSG_WAITALL);			errno_save = errno;			pthread_sigmask(SIG_SETMASK, &old, NULL);			if (res == sizeof(struct message))				break;			else if (res >= 0) {				fprintf(stderr, "libulockmgr: recv short\n");				msg->error = EIO;				break;			} else if (errno_save != EINTR) {				errno = errno_save;				perror("libulockmgr: recv");				msg->error = EIO;				break;			}			msg->intr = 1;			res = send(o->cfd, msg, sizeof(struct message),				   MSG_NOSIGNAL);			if (res == -1) {				perror("libulockmgr: send");				msg->error = EIO;				break;			}			if (res != sizeof(struct message)) {				fprintf(stderr, "libulockmgr: send short\n");				msg->error = EIO;				break;			}		}		pthread_mutex_lock(&ulockmgr_lock);	}	if (f)		f->inuse--;	close(cfd);	if (unlockall) {		for (fp = &o->fds; *fp;) {			f = *fp;			if (f->fd == fd && !f->inuse) {				*fp = f->next;				free(f);			} else				fp = &f->next;		}		if (!o->fds) {			list_del_owner(o);			close(o->cfd);			free(o);		}		/* Force OK on unlock-all, since it _will_ succeed once the		   owner is deleted */		msg->error = 0;	}	return -msg->error;}#ifdef DEBUGstatic uint32_t owner_hash(const unsigned char *id, size_t id_len){	uint32_t h = 0;	size_t i;	for (i = 0; i < id_len; i++)		h = ((h << 8) | (h >> 24)) ^ id[i];	return h;}#endifstatic int ulockmgr_canonicalize(int fd, struct flock *lock){	off_t offset;	if (lock->l_whence == SEEK_CUR) {		offset = lseek(fd, 0, SEEK_CUR);		if (offset == (off_t) -1)			return -errno;	} else if (lock->l_whence == SEEK_END) {		struct stat stbuf;		int res = fstat(fd, &stbuf);		if (res == -1)			return -errno;		offset = stbuf.st_size;	} else		offset = 0;	lock->l_whence = SEEK_SET;	lock->l_start += offset;	if (lock->l_start < 0)		return -EINVAL;	if (lock->l_len < 0) {		lock->l_start += lock->l_len;		if (lock->l_start < 0)			return -EINVAL;		lock->l_len = -lock->l_len;	}	if (lock->l_len && lock->l_start + lock->l_len - 1 < 0)		return -EINVAL;	return 0;}int ulockmgr_op(int fd, int cmd, struct flock *lock, const void *owner,		size_t owner_len){	int err;	struct message msg;	sigset_t old;	sigset_t block;	if (cmd != F_GETLK && cmd != F_SETLK && cmd != F_SETLKW)		return -EINVAL;	if (lock->l_whence != SEEK_SET && lock->l_whence != SEEK_CUR &&	    lock->l_whence != SEEK_END)		return -EINVAL;#ifdef DEBUG	fprintf(stderr, "libulockmgr: %i %i %i %lli %lli own: 0x%08x\n",		cmd, lock->l_type, lock->l_whence, lock->l_start, lock->l_len,		owner_hash(owner, owner_len));#endif	/* Unlock should never block anyway */	if (cmd == F_SETLKW && lock->l_type == F_UNLCK)		cmd = F_SETLK;	memset(&msg, 0, sizeof(struct message));	msg.cmd = cmd;	msg.fd = fd;	msg.lock = *lock;	err = ulockmgr_canonicalize(fd, &msg.lock);	if (err)		return err;	sigemptyset(&block);	sigaddset(&block, SIGUSR1);	pthread_sigmask(SIG_BLOCK, &block, &old);	pthread_mutex_lock(&ulockmgr_lock);	err = ulockmgr_send_request(&msg, owner, owner_len);	pthread_mutex_unlock(&ulockmgr_lock);	pthread_sigmask(SIG_SETMASK, &old, NULL);	if (!err && cmd == F_GETLK) {		if (msg.lock.l_type == F_UNLCK)			lock->l_type = F_UNLCK;		else			*lock = msg.lock;	}	return err;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲午夜一二三区视频| 国产传媒一区在线| 国产一区二区三区四| 色偷偷久久一区二区三区| 欧美精品丝袜中出| 国产精品福利一区| 黑人巨大精品欧美一区| 91麻豆精品国产91久久久资源速度 | 亚洲国产精品一区二区www在线 | 精品91自产拍在线观看一区| 亚洲精品乱码久久久久久 | 欧美三级视频在线播放| 国产精品免费aⅴ片在线观看| 亚洲高清免费观看高清完整版在线观看| 加勒比av一区二区| 在线观看91av| 亚洲午夜一区二区| 色综合天天性综合| 欧美国产激情一区二区三区蜜月| 久久国产精品99久久久久久老狼| 91福利国产成人精品照片| 国产欧美日韩一区二区三区在线观看| 久久黄色级2电影| 欧美精品高清视频| 亚洲国产精品一区二区www在线| 99国产精品久久久久久久久久| 久久久久国产精品厨房| 精品亚洲国产成人av制服丝袜| 91精品在线麻豆| 午夜精品福利一区二区蜜股av| 91啪亚洲精品| 亚洲欧美激情插| 日本久久一区二区三区| 樱花草国产18久久久久| 色综合久久中文综合久久牛| 国产精品午夜久久| aaa欧美色吧激情视频| 国产欧美日韩精品一区| 成人综合激情网| 国产精品久久久久aaaa| voyeur盗摄精品| 18成人在线观看| 91免费看片在线观看| 亚洲精品大片www| 欧美男人的天堂一二区| 爽好久久久欧美精品| 91精品国产综合久久香蕉麻豆 | 91精品久久久久久蜜臀| 日本欧美一区二区在线观看| 精品美女在线观看| 高潮精品一区videoshd| 国产精品麻豆网站| 欧美视频中文字幕| 久久精品av麻豆的观看方式| 久久久久一区二区三区四区| 成人av网站在线| 一区二区三区在线影院| 欧美日韩免费在线视频| 理论片日本一区| 欧美国产国产综合| 欧美亚洲高清一区| 蜜桃视频免费观看一区| 国产女主播视频一区二区| 色偷偷久久人人79超碰人人澡| 午夜影院久久久| 久久久久久久免费视频了| 99国产精品久久| 日本视频中文字幕一区二区三区| 欧美精品一区男女天堂| 色偷偷成人一区二区三区91| 另类小说综合欧美亚洲| ●精品国产综合乱码久久久久| 欧美日韩国产综合久久 | 欧美三级日韩在线| 国产真实精品久久二三区| 亚洲人午夜精品天堂一二香蕉| 欧美人伦禁忌dvd放荡欲情| 国产精品一区在线观看你懂的| 亚洲女厕所小便bbb| 精品国产欧美一区二区| 91香蕉视频mp4| 久久疯狂做爰流白浆xx| 日韩一区欧美小说| 欧美不卡在线视频| 欧美亚洲自拍偷拍| 床上的激情91.| 蜜臀精品久久久久久蜜臀| 亚洲天堂成人网| 精品久久久久久久久久久久久久久| 97se亚洲国产综合自在线不卡| 九色porny丨国产精品| 亚洲欧美电影一区二区| 国产三级精品三级| 7777精品伊人久久久大香线蕉的 | 亚洲国产精品一区二区久久恐怖片| 欧美xxxxx牲另类人与| 在线日韩av片| 成人动漫在线一区| 国产一区二区在线观看免费| 五月激情丁香一区二区三区| 中文字幕亚洲一区二区av在线| 精品少妇一区二区三区视频免付费 | 亚洲一区二区三区美女| 国产精品亲子乱子伦xxxx裸| 日韩一级在线观看| 欧美日本高清视频在线观看| 欧美亚男人的天堂| 色欧美日韩亚洲| 91亚洲永久精品| 不卡一卡二卡三乱码免费网站| 国产精品一线二线三线精华| 精品一区二区三区免费毛片爱| 舔着乳尖日韩一区| 性做久久久久久久久| 亚洲最新视频在线观看| 亚洲欧美日韩系列| 亚洲欧美一区二区三区极速播放 | 蜜桃免费网站一区二区三区| 亚洲va国产天堂va久久en| 亚洲一区二区三区中文字幕| 亚洲免费观看高清完整版在线观看| 国产精品看片你懂得| 国产精品久久久久久久久久久免费看 | 中文字幕欧美一区| 亚洲码国产岛国毛片在线| 亚洲色图视频免费播放| 日韩一区在线免费观看| 最新欧美精品一区二区三区| 中文字幕日本乱码精品影院| 亚洲美女屁股眼交3| 亚洲va天堂va国产va久| 天天色天天操综合| 狠狠久久亚洲欧美| 懂色av一区二区夜夜嗨| 99久久综合狠狠综合久久| 色老综合老女人久久久| 欧美日免费三级在线| 欧美妇女性影城| 精品日韩一区二区三区免费视频| 久久麻豆一区二区| 国产精品国模大尺度视频| 亚洲一区av在线| 蜜桃av噜噜一区二区三区小说| 国产一区不卡精品| 久久亚区不卡日本| 中文字幕一区三区| 午夜精品福利一区二区三区av | 日本大胆欧美人术艺术动态| 精品综合免费视频观看| 成人激情校园春色| 欧美色视频一区| 久久一区二区三区四区| 成人欧美一区二区三区视频网页 | 久久av资源网| 成人激情免费电影网址| 欧美军同video69gay| 国产欧美精品一区二区色综合 | 精品国产一区二区精华| 国产精品乱码妇女bbbb| 亚洲国产精品久久人人爱蜜臀| 精品制服美女久久| 一本色道久久综合精品竹菊| 日韩欧美专区在线| 亚洲欧美一区二区三区久本道91 | 99精品视频在线播放观看| 5858s免费视频成人| 中文一区在线播放| 久久国产尿小便嘘嘘| 色哟哟一区二区三区| 国产亚洲欧美激情| 日韩黄色免费电影| 日本丶国产丶欧美色综合| 精品国产91乱码一区二区三区 | 欧美大片一区二区三区| 亚洲人亚洲人成电影网站色| 久久99精品久久久久久久久久久久| 欧美艳星brazzers| 亚洲少妇最新在线视频| 高清在线成人网| 久久综合999| 精品系列免费在线观看| 91精品国产全国免费观看| 亚洲欧美色图小说| 成人一区在线看| 精品国产伦理网| 天天综合天天做天天综合| 风间由美一区二区三区在线观看 | 国产精品一区二区x88av| 欧美日本一区二区三区| 国产精品免费久久久久| 精品伊人久久久久7777人| 91亚洲国产成人精品一区二三| 中文在线一区二区| 国产一区激情在线| 欧美一区二区三区婷婷月色| 亚洲成av人综合在线观看| 不卡在线观看av| 久久精品人人做人人爽人人| 国产精品456| 精品久久久久久久久久久久久久久 |