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

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

?? printd.c

?? UNIX高級編程
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * Print server daemon. */#include "apue.h"#include "print.h"#include "ipp.h"#include <fcntl.h>#include <dirent.h>#include <ctype.h>#include <pwd.h>#include <pthread.h>#include <strings.h>#include <sys/select.h>#include <sys/uio.h>/* * These are for the HTTP response from the printer. */#define HTTP_INFO(x)	((x) >= 100 && (x) <= 199)#define HTTP_SUCCESS(x) ((x) >= 200 && (x) <= 299)/* * Describes a print job. */struct job {	struct job      *next;		/* next in list */	struct job      *prev;		/* previous in list */	long             jobid;		/* job ID */	struct printreq  req;		/* copy of print request */};/* * Describes a thread processing a client request. */struct worker_thread {	struct worker_thread  *next;	/* next in list */	struct worker_thread  *prev;	/* previous in list */	pthread_t              tid;		/* thread ID */	int                    sockfd;	/* socket */};/* * Needed for logging. */int					log_to_stderr = 0;/* * Printer-related stuff. */struct addrinfo		*printer;char					*printer_name;pthread_mutex_t		configlock = PTHREAD_MUTEX_INITIALIZER;int					reread;/* * Thread-related stuff. */struct worker_thread	*workers;pthread_mutex_t		workerlock = PTHREAD_MUTEX_INITIALIZER;sigset_t				mask;/* * Job-related stuff. */struct job				*jobhead, *jobtail;int					jobfd;long					nextjob;pthread_mutex_t		joblock = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t			jobwait = PTHREAD_COND_INITIALIZER;/* * Function prototypes. */void		init_request(void);void		init_printer(void);void		update_jobno(void);long		get_newjobno(void);void		add_job(struct printreq *, long);void		replace_job(struct job *);void		remove_job(struct job *);void		build_qonstart(void);void		*client_thread(void *);void		*printer_thread(void *);void		*signal_thread(void *);ssize_t	readmore(int, char **, int, int *);int		printer_status(int, struct job *);void		add_worker(pthread_t, int);void		kill_workers(void);void		client_cleanup(void *);/* * Main print server thread.  Accepts connect requests from * clients and spawns additional threads to service requests. * * LOCKING: none. */intmain(int argc, char *argv[]){	pthread_t			tid;	struct addrinfo		*ailist, *aip;	int					sockfd, err, i, n, maxfd;	char				*host;	fd_set				rendezvous, rset;	struct sigaction	sa;	struct passwd		*pwdp;	if (argc != 1)		err_quit("usage: printd");	daemonize("printd");	sigemptyset(&sa.sa_mask);	sa.sa_flags = 0;	sa.sa_handler = SIG_IGN;	if (sigaction(SIGPIPE, &sa, NULL) < 0)		log_sys("sigaction failed");	sigemptyset(&mask);	sigaddset(&mask, SIGHUP);	sigaddset(&mask, SIGTERM);	if ((err = pthread_sigmask(SIG_BLOCK, &mask, NULL)) != 0)		log_sys("pthread_sigmask failed");	init_request();	init_printer();#ifdef _SC_HOST_NAME_MAX	n = sysconf(_SC_HOST_NAME_MAX);	if (n < 0)	/* best guess */#endif		n = HOST_NAME_MAX;	if ((host = malloc(n)) == NULL)		log_sys("malloc error");	if (gethostname(host, n) < 0)		log_sys("gethostname error");	if ((err = getaddrlist(host, "print", &ailist)) != 0) {		log_quit("getaddrinfo error: %s", gai_strerror(err));		exit(1);	}	FD_ZERO(&rendezvous);	maxfd = -1;	for (aip = ailist; aip != NULL; aip = aip->ai_next) {		if ((sockfd = initserver(SOCK_STREAM, aip->ai_addr,		  aip->ai_addrlen, QLEN)) >= 0) {			FD_SET(sockfd, &rendezvous);			if (sockfd > maxfd)				maxfd = sockfd;		}	}	if (maxfd == -1)		log_quit("service not enabled");	pwdp = getpwnam("lp");	if (pwdp == NULL)		log_sys("can't find user lp");	if (pwdp->pw_uid == 0)		log_quit("user lp is privileged");	if (setuid(pwdp->pw_uid) < 0)		log_sys("can't change IDs to user lp");	pthread_create(&tid, NULL, printer_thread, NULL);	pthread_create(&tid, NULL, signal_thread, NULL);	build_qonstart();	log_msg("daemon initialized");	for (;;) {		rset = rendezvous;		if (select(maxfd+1, &rset, NULL, NULL, NULL) < 0)			log_sys("select failed");		for (i = 0; i <= maxfd; i++) {			if (FD_ISSET(i, &rset)) {				/*				 * Accept the connection and handle				 * the request.				 */				sockfd = accept(i, NULL, NULL);				if (sockfd < 0)					log_ret("accept failed");				pthread_create(&tid, NULL, client_thread,				  (void *)sockfd);			}		}	}	exit(1);}/* * Initialize the job ID file.  Use a record lock to prevent * more than one printer daemon from running at a time. * * LOCKING: none, except for record-lock on job ID file. */voidinit_request(void){	int		n;	char	name[FILENMSZ];	sprintf(name, "%s/%s", SPOOLDIR, JOBFILE);	jobfd = open(name, O_CREAT|O_RDWR, S_IRUSR|S_IWUSR);	if (write_lock(jobfd, 0, SEEK_SET, 0) < 0)		log_quit("daemon already running");	/*	 * Reuse the name buffer for the job counter.	 */	if ((n = read(jobfd, name, FILENMSZ)) < 0)		log_sys("can't read job file");	if (n == 0)		nextjob = 1;	else		nextjob = atol(name);}/* * Initialize printer information. * * LOCKING: none. */voidinit_printer(void){	printer = get_printaddr();	if (printer == NULL) {		log_msg("no printer device registered");		exit(1);	}	printer_name = printer->ai_canonname;	if (printer_name == NULL)		printer_name = "printer";	log_msg("printer is %s", printer_name);}/* * Update the job ID file with the next job number. * * LOCKING: none. */voidupdate_jobno(void){	char	buf[32];	lseek(jobfd, 0, SEEK_SET);	sprintf(buf, "%ld", nextjob);	if (write(jobfd, buf, strlen(buf)) < 0)		log_sys("can't update job file");}/* * Get the next job number. * * LOCKING: acquires and releases joblock. */longget_newjobno(void){	long	jobid;	pthread_mutex_lock(&joblock);	jobid = nextjob++;	if (nextjob <= 0)		nextjob = 1;	pthread_mutex_unlock(&joblock);	return(jobid);}/* * Add a new job to the list of pending jobs.  Then signal * the printer thread that a job is pending. * * LOCKING: acquires and releases joblock. */voidadd_job(struct printreq *reqp, long jobid){	struct job	*jp;	if ((jp = malloc(sizeof(struct job))) == NULL)		log_sys("malloc failed");	memcpy(&jp->req, reqp, sizeof(struct printreq));	jp->jobid = jobid;	jp->next = NULL;	pthread_mutex_lock(&joblock);	jp->prev = jobtail;	if (jobtail == NULL)		jobhead = jp;	else		jobtail->next = jp;	jobtail = jp;	pthread_mutex_unlock(&joblock);	pthread_cond_signal(&jobwait);}/* * Replace a job back on the head of the list. * * LOCKING: acquires and releases joblock. */voidreplace_job(struct job *jp){	pthread_mutex_lock(&joblock);	jp->prev = NULL;	jp->next = jobhead;	if (jobhead == NULL)		jobtail = jp;	else		jobhead->prev = jp;	jobhead = jp;	pthread_mutex_unlock(&joblock);}/* * Remove a job from the list of pending jobs. * * LOCKING: caller must hold joblock. */voidremove_job(struct job *target){	if (target->next != NULL)		target->next->prev = target->prev;	else		jobtail = target->prev;	if (target->prev != NULL)		target->prev->next = target->next;	else		jobhead = target->next;}/* * Check the spool directory for pending jobs on start-up. * * LOCKING: none. */voidbuild_qonstart(void){	int				fd, err, nr;	long			jobid;	DIR				*dirp;	struct dirent	*entp;	struct printreq	req;	char			dname[FILENMSZ], fname[FILENMSZ];	sprintf(dname, "%s/%s", SPOOLDIR, REQDIR);	if ((dirp = opendir(dname)) == NULL)		return;	while ((entp = readdir(dirp)) != NULL) {		/*		 * Skip "." and ".."		 */		if (strcmp(entp->d_name, ".") == 0 ||		  strcmp(entp->d_name, "..") == 0)			continue;		/*		 * Read the request structure.		 */		sprintf(fname, "%s/%s/%s", SPOOLDIR, REQDIR, entp->d_name);		if ((fd = open(fname, O_RDONLY)) < 0)			continue;		nr = read(fd, &req, sizeof(struct printreq));		if (nr != sizeof(struct printreq)) {			if (nr < 0)				err = errno;			else				err = EIO;			close(fd);			log_msg("build_qonstart: can't read %s: %s",			  fname, strerror(err));			unlink(fname);			sprintf(fname, "%s/%s/%s", SPOOLDIR, DATADIR,			  entp->d_name);			unlink(fname);			continue;		}		jobid = atol(entp->d_name);		log_msg("adding job %ld to queue", jobid);		add_job(&req, jobid);	}	closedir(dirp);}/* * Accept a print job from a client. * * LOCKING: none. */void *client_thread(void *arg){	int					n, fd, sockfd, nr, nw, first;	long				jobid;	pthread_t			tid;	struct printreq		req;	struct printresp	res;	char				name[FILENMSZ];	char				buf[IOBUFSZ];	tid = pthread_self();	pthread_cleanup_push(client_cleanup, (void *)tid);	sockfd = (int)arg;	add_worker(tid, sockfd);	/*	 * Read the request header.	 */	if ((n = treadn(sockfd, &req, sizeof(struct printreq), 10)) !=	  sizeof(struct printreq)) {		res.jobid = 0;		if (n < 0)			res.retcode = htonl(errno);		else			res.retcode = htonl(EIO);		strncpy(res.msg, strerror(res.retcode), MSGLEN_MAX);		writen(sockfd, &res, sizeof(struct printresp));		pthread_exit((void *)1);	}	req.size = ntohl(req.size);	req.flags = ntohl(req.flags);	/*	 * Create the data file.	 */	jobid = get_newjobno();	sprintf(name, "%s/%s/%ld", SPOOLDIR, DATADIR, jobid);	if ((fd = creat(name, FILEPERM)) < 0) {		res.jobid = 0;		if (n < 0)			res.retcode = htonl(errno);		else			res.retcode = htonl(EIO);		log_msg("client_thread: can't create %s: %s", name,		  strerror(res.retcode));		strncpy(res.msg, strerror(res.retcode), MSGLEN_MAX);		writen(sockfd, &res, sizeof(struct printresp));		pthread_exit((void *)1);	}	/*	 * Read the file and store it in the spool directory.	 */	first = 1;	while ((nr = tread(sockfd, buf, IOBUFSZ, 20)) > 0) {		if (first) {			first = 0;			if (strncmp(buf, "%!PS", 4) != 0)				req.flags |= PR_TEXT;		}		nw = write(fd, buf, nr);		if (nw != nr) {			if (nw < 0)				res.retcode = htonl(errno);			else				res.retcode = htonl(EIO);			log_msg("client_thread: can't write %s: %s", name,			  strerror(res.retcode));			close(fd);			strncpy(res.msg, strerror(res.retcode), MSGLEN_MAX);			writen(sockfd, &res, sizeof(struct printresp));			unlink(name);			pthread_exit((void *)1);		}	}	close(fd);	/*	 * Create the control file.	 */	sprintf(name, "%s/%s/%ld", SPOOLDIR, REQDIR, jobid);	fd = creat(name, FILEPERM);	if (fd < 0) {		res.jobid = 0;		if (n < 0)			res.retcode = htonl(errno);		else			res.retcode = htonl(EIO);		log_msg("client_thread: can't create %s: %s", name,		  strerror(res.retcode));		strncpy(res.msg, strerror(res.retcode), MSGLEN_MAX);		writen(sockfd, &res, sizeof(struct printresp));		sprintf(name, "%s/%s/%ld", SPOOLDIR, DATADIR, jobid);		unlink(name);		pthread_exit((void *)1);	}	nw = write(fd, &req, sizeof(struct printreq));	if (nw != sizeof(struct printreq)) {		res.jobid = 0;		if (nw < 0)			res.retcode = htonl(errno);		else			res.retcode = htonl(EIO);		log_msg("client_thread: can't write %s: %s", name,		  strerror(res.retcode));		close(fd);		strncpy(res.msg, strerror(res.retcode), MSGLEN_MAX);		writen(sockfd, &res, sizeof(struct printresp));		unlink(name);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲伊人色欲综合网| 欧美午夜免费电影| 国产农村妇女精品| 成人网在线播放| 中文字幕av在线一区二区三区| 国产麻豆成人精品| 国产精品拍天天在线| 成人国产精品视频| 亚洲精品国产第一综合99久久| 91久久线看在观草草青青| 亚洲大片在线观看| 欧美成人官网二区| 国产91精品一区二区| 亚洲少妇30p| 4438成人网| 国产一区二区三区精品欧美日韩一区二区三区| 精品国产凹凸成av人网站| 粉嫩av一区二区三区在线播放| 中文字幕一区二区三区在线不卡| 成人avav在线| 午夜亚洲国产au精品一区二区| 日韩视频免费直播| 风间由美一区二区三区在线观看| 中文字幕制服丝袜成人av| 欧美日韩在线三区| 久久99精品久久久| 亚洲男女一区二区三区| 欧美精品99久久久**| 免费的成人av| 国产精品日日摸夜夜摸av| 欧美日韩另类一区| 国产v综合v亚洲欧| 五月天精品一区二区三区| 国产亚洲欧美在线| 欧美日本一区二区三区| 岛国一区二区三区| 日韩二区三区四区| 中文字幕在线不卡| 日韩女优av电影| 日本韩国欧美国产| 国产一区 二区| 亚洲18女电影在线观看| 国产精品三级电影| 亚洲精品一区二区三区在线观看 | 欧美色倩网站大全免费| 精品一区二区三区免费| 夜色激情一区二区| 中文字幕精品一区| 日韩精品一区二区三区swag| 色婷婷av久久久久久久| 国内成人免费视频| 日韩国产一区二| 亚洲与欧洲av电影| 国产精品三级av在线播放| www成人在线观看| 宅男噜噜噜66一区二区66| 91蜜桃免费观看视频| 国产成人高清在线| 青青草视频一区| 亚洲大片免费看| 亚洲综合成人在线视频| 国产精品美女久久久久高潮| 欧美mv日韩mv| 91麻豆精品久久久久蜜臀| 欧美在线短视频| 91免费在线播放| 成人久久视频在线观看| 国产精品自产自拍| 老鸭窝一区二区久久精品| 图片区小说区区亚洲影院| 亚洲激情中文1区| 亚洲精品视频一区| 亚洲人一二三区| 亚洲日穴在线视频| 最好看的中文字幕久久| 国产精品成人一区二区艾草| 国产精品狼人久久影院观看方式| 国产无人区一区二区三区| xfplay精品久久| 久久这里只有精品视频网| 久久尤物电影视频在线观看| 欧美va亚洲va| 欧美激情一区二区三区四区| 国产亚洲一本大道中文在线| 欧美国产欧美亚州国产日韩mv天天看完整| 日韩一区二区三区电影在线观看 | 国产一区欧美日韩| 精品一区二区久久久| 久久99国产精品尤物| 韩国精品免费视频| 国产精品影音先锋| 成人精品免费看| 日本精品一区二区三区四区的功能| 一本大道久久a久久综合| 欧美在线一区二区| 制服丝袜亚洲色图| 精品国产免费人成在线观看| 久久久久久久久久久久久夜| 国产精品你懂的在线| 亚洲精品视频在线观看免费| 水野朝阳av一区二区三区| 久久国产精品99精品国产| 国产综合成人久久大片91| 波多野结衣精品在线| 一本在线高清不卡dvd| 欧美色视频在线| 欧美xxxx在线观看| 国产精品久久久久一区 | 亚洲成人av一区二区三区| 日本少妇一区二区| 国产精品自拍在线| 欧亚洲嫩模精品一区三区| 91精品国产aⅴ一区二区| 久久久久久久综合狠狠综合| 亚洲免费资源在线播放| 青椒成人免费视频| 成人av在线一区二区三区| 在线视频国内自拍亚洲视频| 精品国产欧美一区二区| 一区二区三区成人在线视频| 另类人妖一区二区av| 91年精品国产| 久久精品人人做人人爽97| 一区二区三区中文字幕| 久久成人久久爱| 色婷婷精品久久二区二区蜜臂av| 欧美一区二区三区日韩| 国产精品午夜免费| 免费成人av在线播放| www.日本不卡| 精品国内二区三区| 亚洲精品国久久99热| 国产一区二三区| 欧美日韩成人一区| 成人免费在线视频| 激情综合色播激情啊| 91国偷自产一区二区三区观看| 精品国产一区二区精华| 午夜精品一区二区三区免费视频| 国产成人高清视频| 精品少妇一区二区| 丝袜国产日韩另类美女| 在线观看www91| 日韩美女视频一区| 丁香啪啪综合成人亚洲小说| 精品久久久久久久久久久院品网| 亚洲国产乱码最新视频| 成人av资源下载| 中文字幕第一区| 国产一区二区三区精品视频| 欧美成人伊人久久综合网| 亚洲va欧美va人人爽| 在线一区二区三区四区五区| 国产精品免费视频观看| 国产毛片精品国产一区二区三区| 日韩一级片在线观看| 一本一道久久a久久精品| 久久精品人人做人人爽人人| 精品成人一区二区三区四区| 亚洲国产精品嫩草影院| 成人黄色小视频| 国产亚洲一区二区三区| 黄网站免费久久| 精品福利一区二区三区| 日韩成人dvd| 日韩一区二区免费在线电影| 日韩精品成人一区二区三区| 欧美日韩国产影片| 一区二区三区在线观看国产| 9i在线看片成人免费| 国产日韩欧美亚洲| 国产麻豆91精品| 久久久91精品国产一区二区三区| 免费成人你懂的| 欧美大片日本大片免费观看| 国产精品久久久久一区二区三区| 国产精品一区二区91| 欧美韩日一区二区三区| 激情久久五月天| 久久久久久99精品| 国产成人激情av| 国产精品久久久久久久久搜平片 | 日本一区二区综合亚洲| 精品夜夜嗨av一区二区三区| 久久久激情视频| www.成人在线| 午夜精品一区二区三区三上悠亚| 欧美一区二区福利视频| 国产在线看一区| 国产精品免费久久| 在线观看亚洲精品视频| 日韩国产精品久久| 2023国产一二三区日本精品2022| 国产99久久久国产精品免费看 | 中文字幕中文在线不卡住| 99精品国产99久久久久久白柏| 一区二区三区视频在线看| 51精品久久久久久久蜜臀| 精品一区二区三区免费观看| 国产精品美日韩|