⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 Bluezan implementation of the Bluetooth&#8482 wireless standards specifications for Linux. The code
💻 C
📖 第 1 页 / 共 2 页
字号:
			syslog(LOG_ERR, "Inquiry failed. %s(%d)", strerror(errno), errno);			continue;		}		for (i = 0; i < n; i++) {			char dst[40];			ba2str(&ii[i].bdaddr, dst);			if (use_sdp) {				syslog(LOG_INFO, "Searching for %s on %s", 						bnep_svc2str(service), dst);				if (bnep_sdp_search(&src_addr, &ii[i].bdaddr, service) <= 0)					continue;			}			r = create_connection(dst, &ii[i].bdaddr);			if (r < 0) {				terminate = 1;				break;			}		}		free(ii);	} while (!terminate && persist);	return r;}static void do_show(void){	bnep_show_connections();}static void do_kill(char *dst){	if (dst)		bnep_kill_connection((void *) strtoba(dst));	else		bnep_kill_all_connections();}void sig_hup(int sig){	return;}void sig_term(int sig){	terminate = 1;}int write_pidfile(void){	int fd;	FILE *f;	pid_t pid;	do { 		fd = open(pidfile, O_WRONLY|O_TRUNC|O_CREAT|O_EXCL, 0644);		if (fd == -1) {			/* Try to open the file for read. */			fd = open(pidfile, O_RDONLY);			if(fd == -1) {				syslog(LOG_ERR, "Could not read old pidfile: %s(%d)", strerror(errno), errno);				return -1;			}						/* We're already running; send a SIGHUP (we presume that they			 * are calling ifup for a reason, so they probably want to			 * rescan) and then exit cleanly and let things go on in the			 * background.  Muck with the filename so that we don't go			 * deleting the pid file for the already-running instance.			 */			f = fdopen(fd, "r");			if (!f) {				syslog(LOG_ERR, "Could not fdopen old pidfile: %s(%d)", strerror(errno), errno);				close(fd);				return -1;			}			pid = 0;			fscanf(f, "%d", &pid);			fclose(f);			if (pid) {				/* Try to kill it. */				if (kill(pid, SIGHUP) == -1) {					/* No such pid; remove the bogus pid file. */					syslog(LOG_INFO, "Removing stale pidfile");					unlink(pidfile);					fd = -1;				} else {					/* Got it.  Don't mess with the pid file on					 * our way out. */					syslog(LOG_INFO, "Signalling existing process %d and exiting\n", pid);					pidfile = NULL;					return -1;				}			}		}	} while(fd == -1);	f = fdopen(fd, "w");	if (!f) {		syslog(LOG_ERR, "Could not fdopen new pidfile: %s(%d)", strerror(errno), errno);		close(fd);		unlink(pidfile);		return -1;	}	fprintf(f, "%d\n", getpid());	fclose(f);	return 0;}		static struct option main_lopts[] = {	{ "help",     0, 0, 'h' },	{ "listen",   0, 0, 's' },	{ "connect",  1, 0, 'c' },	{ "search",   2, 0, 'Q' },	{ "kill",     1, 0, 'k' },	{ "killall",  0, 0, 'K' },	{ "role",     1, 0, 'r' },	{ "service",  1, 0, 'd' },	{ "ethernet", 1, 0, 'e' },	{ "device",   1, 0, 'i' },	{ "nosdp",    0, 0, 'D' },	{ "list",     0, 0, 'l' },	{ "show",     0, 0, 'l' },	{ "nodetach", 0, 0, 'n' },	{ "persist",  2, 0, 'p' },	{ "auth",     0, 0, 'A' },	{ "encrypt",  0, 0, 'E' },	{ "secure",   0, 0, 'S' },	{ "master",   0, 0, 'M' },	{ "cache",    0, 0, 'C' },	{ "pidfile",  1, 0, 'P' },	{ "autozap",  0, 0, 'z' },	{ 0, 0, 0, 0 }};static char main_sopts[] = "hsc:k:Kr:d:e:i:lnp::DQ::AESMC::P:z";static char main_help[] = 	"Bluetooth PAN daemon version " VERSION " \n"	"Usage:\n"	"\tpand <options>\n"	"Options:\n"	"\t--show --list -l          Show active PAN connections\n"	"\t--listen -s               Listen for PAN connections\n"	"\t--connect -c <bdaddr>     Create PAN connection\n"	"\t--autozap -z              Disconnect automatically on exit\n"	"\t--search -Q[duration]     Search and connect\n"	"\t--kill -k <bdaddr>        Kill PAN connection\n"	"\t--killall -K              Kill all PAN connections\n"	"\t--role -r <role>          Local PAN role (PANU, NAP, GN)\n"	"\t--service -d <role>       Remote PAN service (PANU, NAP, GN)\n"	"\t--ethernet -e <name>      Network interface name\n"	"\t--device -i <bdaddr>      Source bdaddr\n"	"\t--nosdp -D                Disable SDP\n"	"\t--auth -A                 Enable authentication\n"	"\t--encrypt -E              Enable encryption\n"	"\t--secure -S               Secure connection\n"	"\t--master -M               Become the master of a piconet\n"	"\t--nodetach -n             Do not become a daemon\n"	"\t--persist -p[interval]    Persist mode\n"	"\t--cache -C[valid]         Cache addresses\n"	"\t--pidfile -P <pidfile>    Create PID file\n";int main(int argc, char **argv){	char *dst = NULL, *src = NULL;	struct sigaction sa;	int mode = NONE;	int opt;	while ((opt=getopt_long(argc, argv, main_sopts, main_lopts, NULL)) != -1) {		switch(opt) {		case 'l':			mode = SHOW;			detach = 0;			break;		case 's':			mode = LISTEN;			break;		case 'c':			mode = CONNECT;			dst  = strdup(optarg);			break;		case 'Q':			mode = CONNECT;			if (optarg)				search_duration = atoi(optarg);			break;		case 'k':			mode = KILL;			detach = 0;			dst  = strdup(optarg);			break;		case 'K':			mode = KILL;			detach = 0;			break;		case 'i':			src = strdup(optarg);			break;		case 'r':			bnep_str2svc(optarg, &role);			break;		case 'd':			bnep_str2svc(optarg, &service);			break;		case 'D':			use_sdp = 0;			break;		case 'A':			auth = 1;			break;		case 'E':			encrypt = 1;			break;		case 'S':			secure = 1;			break;		case 'M':			master = 1;			break;		case 'e':			strcpy(netdev, optarg);			break;		case 'n':			detach = 0;			break;		case 'p':			if (optarg)				persist = atoi(optarg);			else				persist = 5;			break;		case 'C':			if (optarg)				use_cache = atoi(optarg);			else				use_cache = 2;			break;		case 'P':			pidfile = strdup(optarg);			break;		case 'z':			cleanup = 1;			break;		case 'h':		default:			printf(main_help);			exit(0);		}	}	argc -= optind;	argv += optind;	optind = 0;	if (bnep_init())		return -1;	/* Check non daemon modes first */	switch (mode) {	case SHOW:		do_show();		return 0;	case KILL:		do_kill(dst);		return 0;	case NONE:		printf(main_help);		return 0;	}	/* Initialize signals */	memset(&sa, 0, sizeof(sa));	sa.sa_flags   = SA_NOCLDSTOP;	sa.sa_handler = SIG_IGN;	sigaction(SIGCHLD, &sa, NULL);	sigaction(SIGPIPE, &sa, NULL);	sa.sa_handler = sig_hup;	sigaction(SIGHUP, &sa, NULL);	sa.sa_handler = sig_term;	sigaction(SIGTERM, &sa, NULL);	sigaction(SIGINT,  &sa, NULL);	if (detach) {		if (fork()) exit(0);		/* Direct stdin,stdout,stderr to '/dev/null' */		{			int fd = open("/dev/null", O_RDWR);			dup2(fd, 0); dup2(fd, 1); dup2(fd, 2);			close(fd);		}		setsid();		chdir("/");	}	openlog("pand", LOG_PID | LOG_NDELAY | LOG_PERROR, LOG_DAEMON);	syslog(LOG_INFO, "Bluetooth PAN daemon version %s", VERSION);	if (src) {		src_dev = hci_devid(src);		if (src_dev < 0 || hci_devba(src_dev, &src_addr) < 0) {			syslog(LOG_ERR, "Invalid source. %s(%d)", strerror(errno), errno);			return -1;		}	}	if (pidfile && write_pidfile())		return -1;	if (dst) {		/* Disable cache invalidation */		use_cache = 0;		strncpy(cache.dst, dst, sizeof(cache.dst) - 1);		str2ba(dst, &cache.bdaddr);		cache.valid = 1;		free(dst);	}	switch (mode) {	case CONNECT:		do_connect();		break;	case LISTEN:		do_listen();		break;	}	if (pidfile)		unlink(pidfile);	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -