static void ipsp_disconnected(struct bt_l2cap_chan *chan) { struct bt_context *ctxt = CHAN_CTXT(chan); NET_DBG("Channel %p disconnected", chan); /* Set iface down */ net_if_down(ctxt->iface); }
static void send_iface1_down(void) { bool ret; DBG("Sending data to iface 1 %p while down\n", iface1); net_if_down(iface1); ret = send_iface(iface1, 1, true); zassert_true(ret, "iface 1 down"); }
static void ipsp_disconnected(struct bt_l2cap_chan *chan) { struct bt_context *ctxt = CHAN_CTXT(chan); NET_DBG("Channel %p disconnected", chan); /* Set iface down */ net_if_down(ctxt->iface); #if defined(CONFIG_NET_L2_BLUETOOTH_MGMT) if (chan->conn != default_conn) { return; } bt_conn_unref(default_conn); default_conn = NULL; #endif }
static void monitor_application(pid_t app_pid) { while (app_pid) { usleep(20000); int status; pid_t rv; do { rv = waitpid(-1, &status, 0); if (rv == -1) break; } while(rv != app_pid); if (arg_debug) printf("Sandbox monitor: waitpid %u retval %d status %d\n", app_pid, rv, status); DIR *dir; if (!(dir = opendir("/proc"))) { // sleep 2 seconds and try again sleep(2); if (!(dir = opendir("/proc"))) { fprintf(stderr, "Error: cannot open /proc directory\n"); exit(1); } } struct dirent *entry; app_pid = 0; while ((entry = readdir(dir)) != NULL) { unsigned pid; if (sscanf(entry->d_name, "%u", &pid) != 1) continue; if (pid == 1) continue; app_pid = pid; break; } closedir(dir); if (app_pid != 0 && arg_debug) printf("Sandbox monitor: monitoring %u\n", app_pid); } #if 0 // todo: find a way to shut down interfaces before closing the namespace // the problem is we don't have enough privileges to shutdown interfaces in this moment // shut down bridge/macvlan interfaces if (any_bridge_configured()) { if (cfg.bridge0.configured) { printf("Shutting down %s\n", cfg.bridge0.devsandbox); net_if_down( cfg.bridge0.devsandbox); } if (cfg.bridge1.configured) { printf("Shutting down %s\n", cfg.bridge1.devsandbox); net_if_down( cfg.bridge1.devsandbox); } if (cfg.bridge2.configured) { printf("Shutting down %s\n", cfg.bridge2.devsandbox); net_if_down( cfg.bridge2.devsandbox); } if (cfg.bridge3.configured) { printf("Shutting down %s\n", cfg.bridge3.devsandbox); net_if_down( cfg.bridge3.devsandbox); } usleep(20000); // 20 ms sleep } #endif }
static int monitor_application(pid_t app_pid) { monitored_pid = app_pid; signal (SIGTERM, sandbox_handler); EUID_USER(); int status = 0; while (monitored_pid) { usleep(20000); char *msg; if (asprintf(&msg, "monitoring pid %d\n", monitored_pid) == -1) errExit("asprintf"); logmsg(msg); if (arg_debug) printf("%s\n", msg); free(msg); pid_t rv; do { rv = waitpid(-1, &status, 0); if (rv == -1) break; } while(rv != monitored_pid); if (arg_debug) printf("Sandbox monitor: waitpid %u retval %d status %d\n", monitored_pid, rv, status); DIR *dir; if (!(dir = opendir("/proc"))) { // sleep 2 seconds and try again sleep(2); if (!(dir = opendir("/proc"))) { fprintf(stderr, "Error: cannot open /proc directory\n"); exit(1); } } struct dirent *entry; monitored_pid = 0; while ((entry = readdir(dir)) != NULL) { unsigned pid; if (sscanf(entry->d_name, "%u", &pid) != 1) continue; if (pid == 1) continue; // todo: make this generic // Dillo browser leaves a dpid process running, we need to shut it down if (strcmp(cfg.command_name, "dillo") == 0) { char *pidname = pid_proc_comm(pid); if (pidname && strcmp(pidname, "dpid") == 0) break; free(pidname); } monitored_pid = pid; break; } closedir(dir); if (monitored_pid != 0 && arg_debug) printf("Sandbox monitor: monitoring %u\n", monitored_pid); } // return the latest exit status. return status; #if 0 // todo: find a way to shut down interfaces before closing the namespace // the problem is we don't have enough privileges to shutdown interfaces in this moment // shut down bridge/macvlan interfaces if (any_bridge_configured()) { if (cfg.bridge0.configured) { printf("Shutting down %s\n", cfg.bridge0.devsandbox); net_if_down( cfg.bridge0.devsandbox); } if (cfg.bridge1.configured) { printf("Shutting down %s\n", cfg.bridge1.devsandbox); net_if_down( cfg.bridge1.devsandbox); } if (cfg.bridge2.configured) { printf("Shutting down %s\n", cfg.bridge2.devsandbox); net_if_down( cfg.bridge2.devsandbox); } if (cfg.bridge3.configured) { printf("Shutting down %s\n", cfg.bridge3.devsandbox); net_if_down( cfg.bridge3.devsandbox); } usleep(20000); // 20 ms sleep } #endif }