diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2006-01-20 01:42:21 +0000 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2006-01-20 01:42:21 +0000 |
commit | c0ac4b3ddff4543901155eb2d7c28952a694f686 (patch) | |
tree | b3c0249ce6d3e879379961ff2f0cead7939b3624 /pand/main.c | |
parent | 8064ef2f30e3327646e96e90c5b8815ba5622225 (diff) |
Include a devup script option
Diffstat (limited to 'pand/main.c')
-rw-r--r-- | pand/main.c | 118 |
1 files changed, 70 insertions, 48 deletions
diff --git a/pand/main.c b/pand/main.c index 485a120d..c01bb6b6 100644 --- a/pand/main.c +++ b/pand/main.c @@ -48,19 +48,19 @@ #include "pand.h" -static uint16_t role = BNEP_SVC_PANU; /* Local role (ie service) */ -static uint16_t service = BNEP_SVC_NAP; /* Remote service */ - -static int detach = 1; -static int persist; -static int use_sdp = 1; -static int use_cache; -static int auth; -static int encrypt; -static int secure; -static int master; -static int cleanup; -static int search_duration = 10; +static uint16_t role = BNEP_SVC_PANU; /* Local role (ie service) */ +static uint16_t service = BNEP_SVC_NAP; /* Remote service */ + +static int detach = 1; +static int persist; +static int use_sdp = 1; +static int use_cache; +static int auth; +static int encrypt; +static int secure; +static int master; +static int cleanup; +static int search_duration = 10; static struct { int valid; @@ -70,10 +70,12 @@ static struct { static char netdev[16] = "bnep%d"; static char *pidfile = NULL; +static char *devupcmd = NULL; + static bdaddr_t src_addr = *BDADDR_ANY; static int src_dev = -1; -volatile int terminate; +static volatile int terminate; static void do_kill(char *dst); @@ -87,12 +89,13 @@ enum { static void run_devup(char *dev, char *dst, int sk, int nsk) { - char *argv[4], prog[40]; + char *argv[4]; struct sigaction sa; - sprintf(prog, "%s/%s", PAND_CONFIG_DIR, PAND_DEVUP_CMD); + if (!devupcmd) + return; - if (access(prog, R_OK | X_OK)) + if (access(devupcmd, R_OK | X_OK)) return; if (fork()) @@ -103,17 +106,19 @@ static void run_devup(char *dev, char *dst, int sk, int nsk) if (nsk >= 0) close(nsk); - + memset(&sa, 0, sizeof(sa)); sa.sa_handler = SIG_DFL; sigaction(SIGCHLD, &sa, NULL); sigaction(SIGPIPE, &sa, NULL); - argv[0] = prog; + argv[0] = devupcmd; argv[1] = dev; argv[2] = dst; argv[3] = NULL; - execv(prog, argv); + + execv(devupcmd, argv); + exit(1); } @@ -131,7 +136,7 @@ static int do_listen(void) sk = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); if (sk < 0) { syslog(LOG_ERR, "Cannot create L2CAP socket. %s(%d)", - strerror(errno), errno); + strerror(errno), errno); return -1; } @@ -141,7 +146,8 @@ static int do_listen(void) l2a.l2_psm = htobs(BNEP_PSM); if (bind(sk, (struct sockaddr *) &l2a, sizeof(l2a))) { - syslog(LOG_ERR, "Bind failed. %s(%d)", strerror(errno), errno); + syslog(LOG_ERR, "Bind failed. %s(%d)", + strerror(errno), errno); return -1; } @@ -150,14 +156,14 @@ static int do_listen(void) olen = sizeof(l2o); if (getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &l2o, &olen) < 0) { syslog(LOG_ERR, "Failed to get L2CAP options. %s(%d)", - strerror(errno), errno); + strerror(errno), errno); return -1; } l2o.imtu = l2o.omtu = BNEP_MTU; if (setsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &l2o, sizeof(l2o)) < 0) { syslog(LOG_ERR, "Failed to set L2CAP options. %s(%d)", - strerror(errno), errno); + strerror(errno), errno); return -1; } @@ -173,7 +179,8 @@ static int do_listen(void) lm |= L2CAP_LM_SECURE; if (lm && setsockopt(sk, SOL_L2CAP, L2CAP_LM, &lm, sizeof(lm)) < 0) { - syslog(LOG_ERR, "Failed to set link mode. %s(%d)", strerror(errno), errno); + syslog(LOG_ERR, "Failed to set link mode. %s(%d)", + strerror(errno), errno); return -1; } @@ -184,7 +191,8 @@ static int do_listen(void) int nsk; nsk = accept(sk, (struct sockaddr *) &l2a, &alen); if (nsk < 0) { - syslog(LOG_ERR, "Accept failed. %s(%d)", strerror(errno), errno); + syslog(LOG_ERR, "Accept failed. %s(%d)", + strerror(errno), errno); continue; } @@ -192,7 +200,8 @@ static int do_listen(void) case 0: break; case -1: - syslog(LOG_ERR, "Fork failed. %s(%d)", strerror(errno), errno); + syslog(LOG_ERR, "Fork failed. %s(%d)", + strerror(errno), errno); default: close(nsk); continue; @@ -202,12 +211,13 @@ static int do_listen(void) char str[40]; ba2str(&l2a.l2_bdaddr, str); - syslog(LOG_INFO, "New connection from %s %s", str, netdev); + syslog(LOG_INFO, "New connection from %s %s", + str, netdev); run_devup(netdev, str, sk, nsk); } else { syslog(LOG_ERR, "Connection failed. %s(%d)", - strerror(errno), errno); + strerror(errno), errno); } close(nsk); @@ -233,7 +243,7 @@ static int w4_hup(int sk) if (errno == EINTR || errno == EAGAIN) continue; syslog(LOG_ERR, "Poll failed. %s(%d)", - strerror(errno), errno); + strerror(errno), errno); return 1; } @@ -269,7 +279,7 @@ static int create_connection(char *dst, bdaddr_t *bdaddr) sk = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); if (sk < 0) { syslog(LOG_ERR, "Cannot create L2CAP socket. %s(%d)", - strerror(errno), errno); + strerror(errno), errno); return -1; } @@ -285,8 +295,8 @@ static int create_connection(char *dst, bdaddr_t *bdaddr) bacpy(&l2a.l2_bdaddr, &src_addr); if (bind(sk, (struct sockaddr *) &l2a, sizeof(l2a))) - syslog(LOG_ERR, "Bind failed. %s(%d)", - strerror(errno), errno); + syslog(LOG_ERR, "Bind failed. %s(%d)", + strerror(errno), errno); memset(&l2a, 0, sizeof(l2a)); l2a.l2_family = AF_BLUETOOTH; @@ -312,7 +322,7 @@ static int create_connection(char *dst, bdaddr_t *bdaddr) r = 0; } else { syslog(LOG_ERR, "Connect to %s failed. %s(%d)", - dst, strerror(errno), errno); + dst, strerror(errno), errno); r = 1; } @@ -365,7 +375,8 @@ static int do_connect(void) ii = NULL; n = hci_inquiry(src_dev, search_duration, 0, NULL, &ii, 0); if (n < 0) { - syslog(LOG_ERR, "Inquiry failed. %s(%d)", strerror(errno), errno); + syslog(LOG_ERR, "Inquiry failed. %s(%d)", + strerror(errno), errno); continue; } @@ -406,29 +417,30 @@ static void do_kill(char *dst) bnep_kill_all_connections(); } -void sig_hup(int sig) +static void sig_hup(int sig) { return; } -void sig_term(int sig) +static void sig_term(int sig) { terminate = 1; } -int write_pidfile(void) +static int write_pidfile(void) { int fd; FILE *f; pid_t pid; - do { + 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); + syslog(LOG_ERR, "Could not read old pidfile: %s(%d)", + strerror(errno), errno); return -1; } @@ -440,7 +452,8 @@ int write_pidfile(void) */ f = fdopen(fd, "r"); if (!f) { - syslog(LOG_ERR, "Could not fdopen old pidfile: %s(%d)", strerror(errno), errno); + syslog(LOG_ERR, "Could not fdopen old pidfile: %s(%d)", + strerror(errno), errno); close(fd); return -1; } @@ -469,17 +482,18 @@ int write_pidfile(void) f = fdopen(fd, "w"); if (!f) { - syslog(LOG_ERR, "Could not fdopen new pidfile: %s(%d)", strerror(errno), errno); + 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' }, @@ -503,11 +517,12 @@ static struct option main_lopts[] = { { "master", 0, 0, 'M' }, { "cache", 0, 0, 'C' }, { "pidfile", 1, 0, 'P' }, + { "devup", 1, 0, 'u' }, { "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_sopts[] = "hsc:k:Kr:d:e:i:lnp::DQ::AESMC::P:u:z"; static char main_help[] = "Bluetooth PAN daemon version " VERSION " \n" @@ -533,7 +548,8 @@ static char main_help[] = "\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"; + "\t--pidfile -P <pidfile> Create PID file\n" + "\t--devup -u <script> Script to run when interface comes up\n"; int main(int argc, char **argv) { @@ -633,6 +649,10 @@ int main(int argc, char **argv) pidfile = strdup(optarg); break; + case 'u': + devupcmd = strdup(optarg); + break; + case 'z': cleanup = 1; break; @@ -681,7 +701,8 @@ int main(int argc, char **argv) sigaction(SIGINT, &sa, NULL); if (detach) { - if (fork()) exit(0); + if (fork()) + exit(0); /* Direct stdin,stdout,stderr to '/dev/null' */ { @@ -700,7 +721,8 @@ int main(int argc, char **argv) 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); + syslog(LOG_ERR, "Invalid source. %s(%d)", + strerror(errno), errno); return -1; } } |