return -1;
}
+ D_NOTICE("listening on %s\n", sockpath);
+
return fd;
}
static int sock_socket_init(TALLOC_CTX *mem_ctx, const char *sockpath,
struct sock_socket_funcs *funcs,
void *private_data,
- bool remove_before_use,
struct sock_socket **result)
{
struct sock_socket *sock;
sock->sockpath = sockpath;
sock->funcs = funcs;
sock->private_data = private_data;
-
- sock->fd = socket_setup(sockpath, remove_before_use);
- if (sock->fd == -1) {
- talloc_free(sock);
- return EIO;
- }
+ sock->fd = -1;
talloc_set_destructor(sock, sock_socket_destructor);
static struct tevent_req *sock_socket_start_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
- struct sock_socket *sock)
+ struct sock_socket *sock,
+ bool remove_before_use)
{
struct tevent_req *req, *subreq;
struct sock_socket_start_state *state;
state->ev = ev;
state->sock = sock;
+ sock->fd = socket_setup(sock->sockpath, remove_before_use);
+ if (sock->fd == -1) {
+ tevent_req_error(req, EIO);
+ return tevent_req_post(req, ev);
+ }
+
talloc_set_destructor(state, sock_socket_start_state_destructor);
subreq = accept_send(state, ev, sock->fd);
{
struct sock_socket *sock;
int ret;
- bool remove_before_use = false;
- remove_before_use = (sockd->pid_ctx != NULL) ? true : false;
-
- ret = sock_socket_init(sockd, sockpath, funcs, private_data,
- remove_before_use, &sock);
+ ret = sock_socket_init(sockd, sockpath, funcs, private_data, &sock);
if (ret != 0) {
return ret;
}
- D_NOTICE("listening on %s\n", sockpath);
DLIST_ADD(sockd->socket_list, sock);
return 0;
struct sock_daemon_run_state *state;
struct tevent_signal *se;
struct sock_socket *sock;
+ bool remove_before_use = false;
req = tevent_req_create(mem_ctx, &state,
struct sock_daemon_run_state);
tevent_req_error(req, EEXIST);
return tevent_req_post(req, ev);
}
+ remove_before_use = true;
}
state->ev = ev;
}
for (sock = sockd->socket_list; sock != NULL; sock = sock->next) {
- subreq = sock_socket_start_send(state, ev, sock);
+ subreq = sock_socket_start_send(state, ev, sock,
+ remove_before_use);
if (tevent_req_nomem(subreq, req)) {
return tevent_req_post(req, ev);
}
#include "common/sock_daemon.c"
#include "common/sock_io.c"
+struct dummy_wait_state {
+};
+
+static struct tevent_req *dummy_wait_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ void *private_data)
+{
+ struct tevent_req *req;
+ struct dummy_wait_state *state;
+ const char *sockpath = (const char *)private_data;
+ struct stat st;
+ int ret;
+
+ ret = stat(sockpath, &st);
+ assert(ret == 0);
+ assert(S_ISSOCK(st.st_mode));
+
+ req = tevent_req_create(mem_ctx, &state, struct dummy_wait_state);
+ if (req == NULL) {
+ return NULL;
+ }
+
+ tevent_req_done(req);
+ return tevent_req_post(req, ev);
+}
+
+static bool dummy_wait_recv(struct tevent_req *req, int *perr)
+{
+ return true;
+}
+
+static struct sock_daemon_funcs test1_funcs = {
+ .wait_send = dummy_wait_send,
+ .wait_recv = dummy_wait_recv,
+};
+
static struct tevent_req *dummy_read_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
struct sock_client_context *client,
static void test1(TALLOC_CTX *mem_ctx, const char *pidfile,
const char *sockpath)
{
+ struct tevent_context *ev;
struct sock_daemon_context *sockd;
struct stat st;
int ret;
ret = sock_daemon_setup(mem_ctx, "test1", "file:", "NOTICE",
- NULL, NULL, &sockd);
+ &test1_funcs, discard_const(sockpath), &sockd);
assert(ret == 0);
assert(sockd != NULL);
assert(ret == 0);
ret = stat(sockpath, &st);
- assert(ret == 0);
- assert(S_ISSOCK(st.st_mode));
+ assert(ret == -1);
- talloc_free(sockd);
+ ev = tevent_context_init(mem_ctx);
+ assert(ev != NULL);
- ret = stat(pidfile, &st);
- assert(ret == -1);
+ ret = sock_daemon_run(ev, sockd, NULL, false, false, -1);
+ assert(ret == 0);
- ret = stat(sockpath, &st);
- assert(ret == -1);
+ talloc_free(mem_ctx);
}
/*