write(fd, str, strlen(str));
close(fd);
talloc_free(str);
+ if (oserver->argv)
+ execvp(oserver->argv[0], oserver->argv);
}
static bool load_file(struct oserver *oserver, const char *file)
return NULL;
}
- /* Restore ignored fields in clients (fde and oserver). */
+ /* Restore ignored fields in clients, and talloc hierarchy. */
for (i = 0; i < ARRAY_SIZE(oserver->clients); i++) {
struct client *client = oserver->clients[i];
if (!client)
continue;
+ /* These two were marked CDUMP_IGNORE. */
client->oserver = oserver;
client->fde = tevent_add_fd(ev, client, client->fd,
state_flag_map[client->state],
service_client, client);
tevent_fd_set_auto_close(client->fde);
+ /* cdump knows nothing of talloc. */
+ talloc_steal(oserver, client);
+ talloc_steal(client, client->question);
+ talloc_steal(client, client->answer);
+ talloc_set_destructor(client, cleanup_client);
}
+ talloc_set_destructor(oserver, destroy_oserver);
if (!complete_server(ev, oserver, dumpfile)) {
talloc_free(oserver);
return NULL;
}
struct oserver *oserver_setup(struct tevent_context *ev, unsigned short port,
- const char *dumpfile)
+ const char *dumpfile, char *argv[])
{
struct oserver *oserver;
int one = 1;
} u;
oserver = talloc(ev, struct oserver);
+ oserver->argv = argv;
+ if (argv) {
+ /* Count the terminal NULL in argv_len. */
+ for (oserver->argv_len = 1;
+ argv[oserver->argv_len - 1];
+ oserver->argv_len++);
+ } else
+ oserver->argv_len = 0;
clear_clients(oserver);
oserver->fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (oserver->fd < 0) {