X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Funixctl.c;h=88fe60352453dc4b9531302b13628e5a14f6e9a0;hb=a0bc29a541fc7dc6e20137d5558e2094d614e6ab;hp=43a174ccb657f19c2d77f3420ca485a3fc7f0157;hpb=67a4917b07031b387beafaedce413b4207214059;p=openvswitch diff --git a/lib/unixctl.c b/lib/unixctl.c index 43a174cc..88fe6035 100644 --- a/lib/unixctl.c +++ b/lib/unixctl.c @@ -44,7 +44,8 @@ #include "vlog.h" struct unixctl_command { - void (*cb)(struct unixctl_conn *, const char *args); + unixctl_cb_func *cb; + void *aux; }; struct unixctl_conn { @@ -76,7 +77,8 @@ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 5); static struct shash commands = SHASH_INITIALIZER(&commands); static void -unixctl_help(struct unixctl_conn *conn, const char *args OVS_UNUSED) +unixctl_help(struct unixctl_conn *conn, const char *args OVS_UNUSED, + void *aux OVS_UNUSED) { struct ds ds = DS_EMPTY_INITIALIZER; struct shash_node *node; @@ -90,8 +92,7 @@ unixctl_help(struct unixctl_conn *conn, const char *args OVS_UNUSED) } void -unixctl_command_register(const char *name, - void (*cb)(struct unixctl_conn *, const char *args)) +unixctl_command_register(const char *name, unixctl_cb_func *cb, void *aux) { struct unixctl_command *command; @@ -99,6 +100,7 @@ unixctl_command_register(const char *name, || shash_find_data(&commands, name) == cb); command = xmalloc(sizeof *command); command->cb = cb; + command->aux = aux; shash_add(&commands, name, command); } @@ -178,17 +180,13 @@ unixctl_server_create(const char *path, struct unixctl_server **serverp) struct unixctl_server *server; int error; - unixctl_command_register("help", unixctl_help); + unixctl_command_register("help", unixctl_help, NULL); server = xmalloc(sizeof *server); list_init(&server->conns); if (path) { - if (path[0] == '/') { - server->path = xstrdup(path); - } else { - server->path = xasprintf("%s/%s", ovs_rundir, path); - } + server->path = abs_file_name(ovs_rundir, path); } else { server->path = xasprintf("%s/%s.%ld.ctl", ovs_rundir, program_name, (long int) getpid()); @@ -198,22 +196,21 @@ unixctl_server_create(const char *path, struct unixctl_server **serverp) NULL); if (server->fd < 0) { error = -server->fd; - fprintf(stderr, "Could not initialize control socket %s (%s)\n", - server->path, strerror(error)); + ovs_error(error, "could not initialize control socket %s", + server->path); goto error; } if (chmod(server->path, S_IRUSR | S_IWUSR) < 0) { error = errno; - fprintf(stderr, "Failed to chmod control socket %s (%s)\n", - server->path, strerror(error)); + ovs_error(error, "failed to chmod control socket %s", server->path); goto error; } if (listen(server->fd, 10) < 0) { error = errno; - fprintf(stderr, "Failed to listen on control socket %s (%s)\n", - server->path, strerror(error)); + ovs_error(error, "Failed to listen on control socket %s", + server->path); goto error; } @@ -282,7 +279,7 @@ process_command(struct unixctl_conn *conn, char *s) command = shash_find_data(&commands, name); if (command) { - command->cb(conn, args); + command->cb(conn, args, command->aux); } else { char *msg = xasprintf("\"%s\" is not a valid command", name); unixctl_command_reply(conn, 400, msg); @@ -460,11 +457,7 @@ unixctl_client_create(const char *path, struct unixctl_client **clientp) /* Determine location. */ client = xmalloc(sizeof *client); - if (path[0] == '/') { - client->connect_path = xstrdup(path); - } else { - client->connect_path = xasprintf("%s/%s", ovs_rundir, path); - } + client->connect_path = abs_file_name(ovs_rundir, path); client->bind_path = xasprintf("/tmp/vlog.%ld.%d", (long int) getpid(), counter++);