#include "daemon-client.h" #include "daemon-shared.h" #include #include #include #include #include #include // ENOMEM daemon_handle daemon_open(daemon_info i) { daemon_handle h; struct sockaddr_un sockaddr; if ((h.socket_fd = socket(PF_UNIX, SOCK_STREAM /* | SOCK_NONBLOCK */, 0)) < 0) { perror("socket"); goto error; } memset(&sockaddr, 0, sizeof(sockaddr)); fprintf(stderr, "[C] connecting to %s\n", i.socket); strcpy(sockaddr.sun_path, i.socket); sockaddr.sun_family = AF_UNIX; if (connect(h.socket_fd,(struct sockaddr *) &sockaddr, sizeof(sockaddr))) { perror("connect"); goto error; } h.protocol = 0; return h; error: if (h.socket_fd >= 0) close(h.socket_fd); h.socket_fd = -1; return h; } daemon_reply daemon_send(daemon_handle h, daemon_request rq) { daemon_reply reply; assert(h.socket_fd >= 0); if (!rq.buffer) { /* TODO: build the buffer from rq.cft */ } assert(rq.buffer); write_buffer(h.socket_fd, rq.buffer, strlen(rq.buffer)); if (read_buffer(h.socket_fd, &reply.buffer)) { /* TODO: parse reply.buffer into reply.cft */ } else reply.error = 1; return reply; } daemon_reply daemon_send_simple(daemon_handle h, char *id, ...) { va_list ap; va_start(ap, id); daemon_request rq = { .buffer = format_buffer(id, ap) }; if (!rq.buffer) { daemon_reply err = { .error = ENOMEM, .buffer = NULL, .cft = NULL }; return err; } daemon_reply repl = daemon_send(h, rq); dm_free(rq.buffer); return repl; } void daemon_close(daemon_handle h) { }