summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--main.c29
-rw-r--r--netifd.h10
-rw-r--r--proto-shell.c13
-rw-r--r--system.c8
-rw-r--r--system.h2
-rw-r--r--ubus.c5
6 files changed, 22 insertions, 45 deletions
diff --git a/main.c b/main.c
index 4ee86eb..2fef776 100644
--- a/main.c
+++ b/main.c
@@ -32,7 +32,6 @@ const char *resolv_conf = DEFAULT_RESOLV_CONF;
static char **global_argv;
static struct list_head process_list = LIST_HEAD_INIT(process_list);
-static struct list_head fds = LIST_HEAD_INIT(fds);
#define DEFAULT_LOG_LEVEL L_NOTICE
@@ -58,8 +57,8 @@ netifd_delete_process(struct netifd_process *proc)
if (proc->uloop.pending)
uloop_process_delete(&proc->uloop);
list_del(&proc->list);
- netifd_fd_delete(&proc->log_fd);
- close(proc->log_fd.fd);
+ uloop_fd_delete(&proc->log_uloop);
+ close(proc->log_uloop.fd);
if (proc->log_buf) {
free(proc->log_buf);
proc->log_buf = NULL;
@@ -168,7 +167,6 @@ netifd_process_cb(struct uloop_process *proc, int ret)
int
netifd_start_process(const char **argv, char **env, struct netifd_process *proc)
{
- struct netifd_fd *fd;
int pfds[2];
int pid;
@@ -190,13 +188,6 @@ netifd_start_process(const char **argv, char **env, struct netifd_process *proc)
if (proc->dir_fd >= 0)
fchdir(proc->dir_fd);
- /* close all non-essential fds */
- list_for_each_entry(fd, &fds, list) {
- if (fd->proc == proc)
- continue;
- close(fd->fd);
- }
-
dup2(pfds[1], 0);
dup2(pfds[1], 1);
dup2(pfds[1], 2);
@@ -217,10 +208,10 @@ netifd_start_process(const char **argv, char **env, struct netifd_process *proc)
uloop_process_add(&proc->uloop);
list_add_tail(&proc->list, &process_list);
+ system_fd_set_cloexec(pfds[0]);
proc->log_buf_ofs = 0;
- proc->log_uloop.fd = proc->log_fd.fd = pfds[0];
+ proc->log_uloop.fd = pfds[0];
proc->log_uloop.cb = netifd_process_log_cb;
- netifd_fd_add(&proc->log_fd);
uloop_fd_add(&proc->log_uloop, ULOOP_EDGE_TRIGGER | ULOOP_READ);
return 0;
@@ -241,18 +232,6 @@ netifd_kill_process(struct netifd_process *proc)
netifd_delete_process(proc);
}
-void
-netifd_fd_add(struct netifd_fd *fd)
-{
- list_add_tail(&fd->list, &fds);
-}
-
-void
-netifd_fd_delete(struct netifd_fd *fd)
-{
- list_del(&fd->list);
-}
-
static void netifd_do_restart(struct uloop_timeout *timeout)
{
execvp(global_argv[0], global_argv);
diff --git a/netifd.h b/netifd.h
index e51514e..ac0c0f2 100644
--- a/netifd.h
+++ b/netifd.h
@@ -71,19 +71,12 @@ static inline void no_debug(int level, const char *fmt, ...)
{
}
-struct netifd_fd {
- struct list_head list;
- struct netifd_process *proc;
- int fd;
-};
-
struct netifd_process {
struct list_head list;
struct uloop_process uloop;
void (*cb)(struct netifd_process *, int ret);
int dir_fd;
- struct netifd_fd log_fd;
struct uloop_fd log_uloop;
const char *log_prefix;
char *log_buf;
@@ -96,9 +89,6 @@ void netifd_log_message(int priority, const char *format, ...);
int netifd_start_process(const char **argv, char **env, struct netifd_process *proc);
void netifd_kill_process(struct netifd_process *proc);
-void netifd_fd_add(struct netifd_fd *fd);
-void netifd_fd_delete(struct netifd_fd *fd);
-
struct device;
struct interface;
diff --git a/proto-shell.c b/proto-shell.c
index ae0f938..2a5eda0 100644
--- a/proto-shell.c
+++ b/proto-shell.c
@@ -30,8 +30,9 @@
#include "interface.h"
#include "interface-ip.h"
#include "proto.h"
+#include "system.h"
-static struct netifd_fd proto_fd;
+static int proto_fd = -1;
enum proto_shell_sm {
S_IDLE,
@@ -704,10 +705,10 @@ proto_shell_attach(const struct proto_handler *h, struct interface *iface,
state->proto.cb = proto_shell_handler;
state->teardown_timeout.cb = proto_shell_teardown_timeout_cb;
state->script_task.cb = proto_shell_script_cb;
- state->script_task.dir_fd = proto_fd.fd;
+ state->script_task.dir_fd = proto_fd;
state->script_task.log_prefix = iface->name;
state->proto_task.cb = proto_shell_task_cb;
- state->proto_task.dir_fd = proto_fd.fd;
+ state->proto_task.dir_fd = proto_fd;
state->proto_task.log_prefix = iface->name;
state->handler = container_of(h, struct proto_shell_handler, proto);
@@ -907,11 +908,11 @@ static void __init proto_shell_init(void)
if (chdir("./proto"))
goto close_cur;
- proto_fd.fd = open(".", O_RDONLY | O_DIRECTORY);
- if (proto_fd.fd < 0)
+ proto_fd = open(".", O_RDONLY | O_DIRECTORY);
+ if (proto_fd < 0)
goto close_cur;
- netifd_fd_add(&proto_fd);
+ system_fd_set_cloexec(proto_fd);
glob("./*.sh", 0, NULL, &g);
for (i = 0; i < g.gl_pathc; i++)
proto_shell_add_script(g.gl_pathv[i]);
diff --git a/system.c b/system.c
index 1096ad2..f71bcbe 100644
--- a/system.c
+++ b/system.c
@@ -13,6 +13,7 @@
*/
#include "netifd.h"
#include "system.h"
+#include <fcntl.h>
static const struct blobmsg_policy tunnel_attrs[__TUNNEL_ATTR_MAX] = {
[TUNNEL_ATTR_TYPE] = { "mode", BLOBMSG_TYPE_STRING },
@@ -27,3 +28,10 @@ const struct config_param_list tunnel_attr_list = {
.n_params = __TUNNEL_ATTR_MAX,
.params = tunnel_attrs,
};
+
+void system_fd_set_cloexec(int fd)
+{
+#ifdef FD_CLOEXEC
+ fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
+#endif
+}
diff --git a/system.h b/system.h
index 7716fbd..bc1b932 100644
--- a/system.h
+++ b/system.h
@@ -99,4 +99,6 @@ int system_add_ip_tunnel(const char *name, struct blob_attr *attr);
time_t system_get_rtime(void);
+void system_fd_set_cloexec(int fd);
+
#endif
diff --git a/ubus.c b/ubus.c
index 3ea71bf..7b85930 100644
--- a/ubus.c
+++ b/ubus.c
@@ -25,7 +25,6 @@
static struct ubus_context *ctx = NULL;
static struct blob_buf b;
-static struct netifd_fd ubus_fd;
static const char *ubus_path;
/* global object */
@@ -258,8 +257,7 @@ static void
netifd_ubus_add_fd(void)
{
ubus_add_uloop(ctx);
- ubus_fd.fd = ctx->sock.fd;
- netifd_fd_add(&ubus_fd);
+ system_fd_set_cloexec(ctx->sock.fd);
}
static void
@@ -283,7 +281,6 @@ netifd_ubus_reconnect_timer(struct uloop_timeout *timeout)
static void
netifd_ubus_connection_lost(struct ubus_context *ctx)
{
- netifd_fd_delete(&ubus_fd);
netifd_ubus_reconnect_timer(NULL);
}