📄 main.c
字号:
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 + -