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

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

?? daemon.c

?? AODV協議實現
?? C
字號:
#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/un.h>#include <unistd.h>#include <pthread.h>#include <signal.h>#include <errno.h>#include <fcntl.h>#include <stdlib.h>#include <drcom.h>#include "config.h"#include "drcom_types.h"#include "client_daemon.h"#include "daemon.h"#include "log.h"#define READ_END	0#define WRITE_END	1void msgprint(const char *);void report_result(int, int, int);void * daemon_watchport(void *);void * daemon_keepalive(void *);void module_start_auth(struct drcom_handle *);void module_stop_auth(void);/*	 0: idle	 1: logged in	 2: busy*/static int status = 0;static int sigusr1_pipe[2] = {-1,-1};static pthread_t th_watchport = 0, th_keepalive = 0;static void unblock_sigusr1(void){	sigset_t set;	sigemptyset(&set);	sigaddset(&set, SIGUSR1);	sigaddset(&set, SIGTERM);	pthread_sigmask(SIG_UNBLOCK, &set, NULL);}static void block_sigusr1(void){	sigset_t set;	sigemptyset(&set);	sigaddset(&set, SIGUSR1);	sigaddset(&set, SIGTERM);	pthread_sigmask(SIG_BLOCK, &set, NULL);}static void sigusr1_handler (int sig){	write(sigusr1_pipe[WRITE_END], &sig, sizeof(int));}static int setup_sigusr1_handler(void){	struct sigaction sa;	int retval;		retval = pipe(sigusr1_pipe);	if (retval < 0) {		logerr("error getting pipes: %s", strerror(errno));		goto exit;	}	retval = fcntl(sigusr1_pipe[READ_END], F_GETFL, 0);	if (retval < 0) {		logerr("error fcntl on read pipe: %s", strerror(errno));		goto exit;	}	retval = fcntl(sigusr1_pipe[READ_END], F_SETFL, retval | O_NONBLOCK);	if (retval < 0) {		logerr("error fcntl on read pipe: %s", strerror(errno));		goto exit;	}	retval = fcntl(sigusr1_pipe[WRITE_END], F_GETFL, 0);	if (retval < 0) {		logerr("error fcntl on write pipe: %s", strerror(errno));		goto exit;	}	retval = fcntl(sigusr1_pipe[WRITE_END], F_SETFL, retval | O_NONBLOCK);	if (retval < 0) {		logerr("error fcntl on write pipe: %s", strerror(errno));		goto exit;	}	memset(&sa, 0x00, sizeof(sa));	sa.sa_handler = sigusr1_handler;	sa.sa_flags = SA_RESTART;	sigemptyset (&sa.sa_mask);	sigaction (SIGUSR1, &sa, NULL);	sigaction (SIGTERM, &sa, NULL);	return 0;exit:	return -1;}static void do_force_logout(struct drcom_handle *h, int sig){	int r;	if (status == 1) {		loginfo("SIGUSR1/SIGTERM caught, force logout.\n");		status = 2;		/* Stop the threads here, since they might interfere with		the logout process */		module_stop_auth();		pthread_cancel(th_keepalive);		pthread_cancel(th_watchport);		pthread_join(th_keepalive, NULL);		pthread_join(th_watchport, NULL);		/* Now try to log out */		r = drcom_logout(h, 0);		if(r){			/* If logout failed, that means we are still logged in,			so re-create the threads and continue authentication */			module_start_auth(h);			pthread_create(&th_watchport, NULL, daemon_watchport, h);			pthread_create(&th_keepalive, NULL, daemon_keepalive, h);		}			status = (!r) ? 0 : 1;	}	if(sig == SIGTERM){		loginfo("exit for SIGTERM ");		exit(1);	}}void drcomcd_daemon(int s){	int s2, r;	struct drcom_handle *h;	unsigned char buf1[DRCOMCD_BUF_LEN];	struct drcomcd_hdr *cd_hdr = (struct drcomcd_hdr *) buf1;	struct drcomcd_login *cd_login = (struct drcomcd_login *) (buf1 + sizeof(*cd_hdr));	struct drcomcd_logout *cd_logout = (struct drcomcd_logout *) (buf1 + sizeof(*cd_hdr));	struct drcomcd_passwd *cd_passwd = (struct drcomcd_passwd *) (buf1 + sizeof(*cd_hdr));	if(setup_sigusr1_handler()<0){		logerr("sigusr1 handler not setup, exit.\n");		exit(1);	}	/* Initialize the handle for the lifetime of the daemon */	h = drcom_create_handle();	drcom_init(h, &msgprint);	loginfo("drcomd started.\n");	while (1) {		int maxfd;		fd_set readfds;		FD_ZERO(&readfds);		FD_SET(s, &readfds);		FD_SET(sigusr1_pipe[READ_END], &readfds);				maxfd = s;		if(maxfd < sigusr1_pipe[READ_END])			maxfd = sigusr1_pipe[READ_END];		unblock_sigusr1();		r = select(maxfd+1, &readfds, NULL,NULL, NULL);		if(r<0){			if(errno != EINTR)				logerr("signal caught\n");			continue;		}		if(FD_ISSET(sigusr1_pipe[READ_END], &readfds)){			char buf[256];			int *sig = (int*)buf;			read(sigusr1_pipe[READ_END], &buf, sizeof(buf));			do_force_logout(h, *sig);		}		if(!FD_ISSET(s, &readfds))			continue;		block_sigusr1();		s2 = accept(s, NULL, NULL);		if (s2 == -1 && errno != EINTR) {			logerr("daemon: accept failed: %s", strerror(errno));			continue;		}		{		fd_set	rfds;		struct timeval t;		FD_ZERO(&rfds);		FD_SET(s2, &rfds);		t.tv_sec = 2;		t.tv_usec = 0;		r = select(s2+1, &rfds, NULL, NULL, &t);		if(r<=0){			logerr("accepted, but no data\n");			close(s2);			continue;		}		if(FD_ISSET(s2, &rfds)){			r = recv(s2, buf1, DRCOMCD_BUF_LEN, 0);			if (r < 0)				logerr("daemon: recv: %s", strerror(errno));			if (r < 1 || cd_hdr->signature != DRCOM_SIGNATURE) {				logerr("Unknown signature\n");				close(s2);				continue;			}		}else{			close(s2);			continue;		}		}		switch (cd_hdr->type) {		case DRCOMCD_LOGIN:			if (status == 0) {				status = 2;				r = drcom_login(h, cd_login->timeout);				status = (!r) ? 1 : 0;			} else {				report_result(s2, DRCOMCD_FAILURE, DRCOMCD_REASON_BUSY);				continue;			}			/* Result-dependent task */			if (status == 1) {				module_start_auth(h);				pthread_create(&th_watchport,NULL,daemon_watchport, h);				pthread_create(&th_keepalive,NULL,daemon_keepalive, h);			}			break;		case DRCOMCD_LOGOUT:			if (status == 1) {				status = 2;				/* Stop the threads here, since they might interfere with				 the logout process */				module_stop_auth();				pthread_cancel(th_keepalive);				pthread_cancel(th_watchport);				pthread_join(th_keepalive, NULL);				pthread_join(th_watchport, NULL);				/* Now try to log out */				r = drcom_logout(h, cd_logout->timeout);				if(r){				/* If logout failed, that means we are still logged in,				 so re-create the threads and continue authentication */					module_start_auth(h);					pthread_create(&th_watchport, 						NULL, daemon_watchport, h);					pthread_create(&th_keepalive, 						NULL, daemon_keepalive, h);				}				status = (!r) ? 0 : 1;			} else {				report_result(s2, DRCOMCD_FAILURE, DRCOMCD_REASON_BUSY);				continue;			}			break;		case DRCOMCD_PASSWD:			if (status == 0) {				status = 2;				r = drcom_passwd(h, 					cd_passwd->newpasswd, cd_passwd->timeout);				status = 0;			} else {				report_result(s2, DRCOMCD_FAILURE, DRCOMCD_REASON_BUSY);				continue;			}			break;		default: continue; break;		}		if (r)			report_result(s2, DRCOMCD_FAILURE, DRCOMCD_REASON_NO_REASON);		else			report_result(s2, DRCOMCD_SUCCESS, DRCOMCD_REASON_NO_REASON);	}	return;}/*#include <iconv.h>#include <wchar.h>*/void msgprint(const char *s){/*	char buf[1024];	size_t buflen;	size_t sbuflen;	iconv_t it;	it = iconv_open("UTF-8", "GB18030");	sbuflen = strlen(s);	buflen=1024;	if(iconv(it, &buf, &buflen, &s, &sbuflen)<0)		strncpy(buf, s, 1024);	iconv_close(it);	fwprintf(stderr, "%s\n", buf);*/	loginfo("%s\n", s);	return;}void report_result(int s2, int result, int reason){	unsigned char buf2[DRCOMCD_BUF_LEN];	struct drcomcd_hdr *dc_hdr = (struct drcomcd_hdr *) buf2;	struct drcomcd_result *dc_result = (struct drcomcd_result *) (buf2 + sizeof(*dc_hdr));	int r;	dc_hdr->signature = DRCOM_SIGNATURE;	dc_hdr->type = result;	dc_result->reason = reason;	r = send(s2, buf2, sizeof(*dc_hdr) + sizeof(*dc_result), 0);	if (r < 0)		logerr("daemon: send: %s", strerror(errno));	close(s2);	return;}void * daemon_watchport(void *arg){	block_sigusr1();	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);	drcom_watchport((struct drcom_handle *) arg);	loginfo("watchport returns\n");	return NULL;}void * daemon_keepalive(void *arg){	block_sigusr1();	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);	sleep(9);	drcom_keepalive((struct drcom_handle *) arg);	loginfo("keepalive returns\n");	return NULL;}void module_start_auth(struct drcom_handle *h){	struct drcom_status_data status_data;	struct drcom_auth_data auth_data;	struct drcom_iface_data iface_data;	struct drcom_except_data except_data[MAX_EXCEPT_ITEMS];	struct drcom_session_info *s;	int authlen, r;	FILE *f;	s = drcom_get_session_info(h);	authlen = drcom_get_authlen();	/* struct drcom_auth is already packed, so no worries here */	memcpy(auth_data.auth, s->auth, authlen);	/* memset(drcom_iface_data, 0, 4 * sizeof(struct addrport)); */	iface_data.hostip = s->hostip;	iface_data.hostport = s->hostport;	iface_data.servip = s->servip;	iface_data.servport = s->servport;	iface_data.dnsp = s->dnsp;	iface_data.dnss = s->dnss;	/* memset(drcom_except_data, 0, 20 * sizeof(struct addrmask)); */	except_data[0].addr = 0;	except_data[0].mask = 0;	/* Actually write to the files */	f = fopen(DRCOM_MODULE_AUTH, "w");	if (!f) {		logerr("Writing authentication data: %s", strerror(errno));		return;	}	r = fwrite(&auth_data, AUTH_LEN, 1, f);	if (r == 0 && ferror(f)) {		logerr("Writing to " DRCOM_MODULE_AUTH ": %s", strerror(errno));		return;	}	fclose(f);	f = fopen(DRCOM_MODULE_IFACE, "w");	if (!f) {		logerr("Writing interface info: %s", strerror(errno));		return;	}	r = fwrite(&iface_data, IFACE_LEN, 1, f);	if (r == 0 && ferror(f)) {		logerr("Writing to " DRCOM_MODULE_IFACE ": %s", strerror(errno));		return;	}	fclose(f);	f = fopen(DRCOM_MODULE_EXCEPT, "w");	if (!f) {		logerr("Writing exceptions: %s", strerror(errno));		return;	}	r = fwrite(&except_data, EXCEPT_LEN, MAX_EXCEPT_ITEMS, f);	if (r == 0 && ferror(f)) {		logerr("Writing to " DRCOM_MODULE_EXCEPT ": %s", strerror(errno));		return;	}	fclose(f);#define DRCOM_MODULE_PID "/proc/drcom/pid"	{		pid_t pid = getpid();		f = fopen(DRCOM_MODULE_PID, "w");		if (!f) {			logerr("Writing pid info " DRCOM_MODULE_PID ": %s", strerror(errno));			return;		}		r = fwrite(&pid, sizeof(pid_t), 1, f);		if (r == 0 && ferror(f)) {			logerr("Writing to " DRCOM_MODULE_PID ": %s", strerror(errno));			return;		}		fclose(f);	}	/* Now tell drcom.o to start authenticating */	status_data.status = STATUS_LOGIN;	f = fopen(DRCOM_MODULE_STATUS, "w");	if (!f) {		logerr("Starting authentication: %s", strerror(errno));		return;	}	r = fwrite(&status_data, STATUS_LEN, 1, f);	if (r == 0 && ferror(f)) {		logerr("Writing to " DRCOM_MODULE_STATUS ": %s", strerror(errno));		return;	}	fclose(f);	return;}void module_stop_auth(){	struct drcom_status_data status_data;	FILE *f;	int r;	status_data.status = STATUS_NOTLOGIN;	f = fopen(DRCOM_MODULE_STATUS, "w");	if (!f) {		logerr("Stopping authentication: %s", strerror(errno));		return;	}	r = fwrite(&status_data, STATUS_LEN, 1, f);	if (r == 0 && ferror(f)) {		logerr("Writing to " DRCOM_MODULE_STATUS ": %s", strerror(errno));		return;	}	loginfo("daemon: Stopped authentication\n");	fclose(f);	return;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品69久久久久水密桃| 日韩精品中午字幕| 亚洲人精品一区| 97se亚洲国产综合自在线观| 国产精品传媒在线| 91免费版pro下载短视频| 一区二区在线观看视频在线观看| 欧美午夜不卡视频| 日本v片在线高清不卡在线观看| 日韩视频中午一区| 国产69精品一区二区亚洲孕妇| 国产精品国产自产拍高清av王其 | 欧美精品久久天天躁| 日韩电影在线一区二区| 26uuu精品一区二区三区四区在线| 国产精品综合二区| 亚洲九九爱视频| 欧美一区二区三区视频免费播放| 激情综合网av| 亚洲欧美在线视频观看| 51精品国自产在线| 国产成人超碰人人澡人人澡| 日韩毛片精品高清免费| 欧美一级欧美三级| av午夜一区麻豆| 日韩福利视频导航| 国产精品理伦片| 日韩一区二区三区精品视频| 成人18视频在线播放| 日韩专区一卡二卡| 亚洲视频在线一区| 精品美女被调教视频大全网站| 99久久免费国产| 激情五月婷婷综合| 亚洲午夜一二三区视频| 久久久精品国产99久久精品芒果| 欧美羞羞免费网站| 国产a区久久久| 日韩高清国产一区在线| 综合婷婷亚洲小说| 久久午夜电影网| 欧美日韩精品一区二区| 成人久久久精品乱码一区二区三区 | 日韩一区欧美二区| 中文字幕一区二区5566日韩| 日韩一区二区在线播放| 色综合天天综合网天天看片| 国产一区二区网址| 日韩高清电影一区| 亚洲激情图片qvod| 久久精品视频网| 欧美久久久久久久久久| 一本一道综合狠狠老| 国产一区二区三区久久悠悠色av| 亚洲午夜久久久久久久久久久 | 久久伊99综合婷婷久久伊| 欧美亚洲动漫制服丝袜| av在线综合网| 成人av在线一区二区| 国产在线日韩欧美| 琪琪一区二区三区| 亚洲成人在线观看视频| 亚洲精品国产成人久久av盗摄| 国产三级精品三级在线专区| 久久美女高清视频| 精品国产一区二区三区忘忧草| 欧美夫妻性生活| 欧美无人高清视频在线观看| 91国产丝袜在线播放| 99久久综合99久久综合网站| 成人一级视频在线观看| 国产精品羞羞答答xxdd| 国产制服丝袜一区| 国产综合久久久久久久久久久久| 久久成人18免费观看| 麻豆91在线播放| 极品少妇xxxx精品少妇| 久久精品久久综合| 欧美日韩国产片| 中文字幕久久午夜不卡| 久久久www成人免费无遮挡大片| 欧美电影影音先锋| 91精品免费在线观看| 欧美一区二区三区免费视频 | 欧美三区在线视频| 欧美日韩一区小说| 777xxx欧美| 日韩欧美的一区二区| 精品久久久久久最新网址| 精品欧美黑人一区二区三区| 久久婷婷国产综合精品青草| 日本一区二区视频在线观看| 国产精品欧美久久久久无广告| 中文字幕一区二区日韩精品绯色| 亚洲丝袜制服诱惑| 亚洲午夜在线观看视频在线| 欧美96一区二区免费视频| 久久se精品一区精品二区| 国产精品亚洲人在线观看| 成人av资源在线| 在线观看日韩国产| 日韩三级视频中文字幕| 国产人妖乱国产精品人妖| 亚洲精品中文字幕乱码三区| 亚洲国产精品久久人人爱| 蜜芽一区二区三区| 激情五月婷婷综合| 色综合久久久久久久| 91精品国产欧美日韩| 久久美女艺术照精彩视频福利播放 | 91丨国产丨九色丨pron| 91精品国产综合久久久久久久久久| 欧美变态凌虐bdsm| 国产精品理伦片| 日本vs亚洲vs韩国一区三区二区| 国产精品一区二区不卡| 在线亚洲+欧美+日本专区| 91精品国产欧美日韩| 欧美经典一区二区三区| 午夜精品福利视频网站| 国产一区二区在线影院| 在线观看精品一区| 久久久天堂av| 亚洲一级二级在线| 国产精品一区二区果冻传媒| 欧美色老头old∨ideo| 欧美国产国产综合| 日本欧美韩国一区三区| 色综合色狠狠天天综合色| 欧美刺激午夜性久久久久久久 | 中文字幕精品在线不卡| 午夜精品福利一区二区三区蜜桃| 成人午夜大片免费观看| 777久久久精品| 亚洲激情男女视频| 国产成人夜色高潮福利影视| 91精品婷婷国产综合久久性色 | 国产精品视频你懂的| 麻豆精品久久久| 欧美午夜精品一区| 亚洲人成电影网站色mp4| 国内精品写真在线观看| 欧美日韩国产经典色站一区二区三区| 国产欧美日韩视频在线观看| 久久激情五月婷婷| 欧美日韩在线观看一区二区| 亚洲天堂a在线| 成人手机电影网| 国产亚洲短视频| 狠狠色丁香九九婷婷综合五月| 欧美日韩国产综合草草| 一区二区三区在线视频播放| 99久久久久免费精品国产| 久久精品亚洲一区二区三区浴池| 奇米色777欧美一区二区| 欧美日韩精品电影| 亚洲尤物在线视频观看| 色综合久久88色综合天天| 国产精品盗摄一区二区三区| 成人三级在线视频| 欧美韩国一区二区| 国产成人在线观看免费网站| 久久丝袜美腿综合| 国内精品久久久久影院色| 精品欧美乱码久久久久久 | 午夜视频久久久久久| 日本丰满少妇一区二区三区| 亚洲欧美另类小说视频| av毛片久久久久**hd| 中文字幕亚洲综合久久菠萝蜜| 99精品在线观看视频| 亚洲视频免费在线观看| 91视视频在线直接观看在线看网页在线看| 国产日韩欧美高清在线| 成人永久看片免费视频天堂| 中文字幕av一区二区三区免费看| 成人亚洲一区二区一| 亚洲欧美怡红院| 色综合天天综合网天天狠天天| 亚洲黄色片在线观看| 欧美亚洲丝袜传媒另类| 日韩激情一二三区| 精品国产露脸精彩对白| 高清shemale亚洲人妖| 国产精品乱码人人做人人爱| 91丨porny丨首页| 一本一道综合狠狠老| 午夜精品久久久久久不卡8050| 日韩亚洲欧美高清| 九色综合狠狠综合久久| 中文字幕免费观看一区| 91丨porny丨中文| 日韩中文欧美在线| 国产欧美一区二区三区鸳鸯浴| 99在线精品免费| 午夜精品久久久久久久久久久| 精品粉嫩aⅴ一区二区三区四区| 成人福利视频在线看| 亚洲午夜视频在线观看| www国产精品av|