diff --git a/src/main/lkt.c b/src/main/lkt.c index 0f5350ebdfe032a9e96e631e64d7067dc98d8b22..232633e81bdd38f010bb6a2cc53c5d295083f186 100644 --- a/src/main/lkt.c +++ b/src/main/lkt.c @@ -28,8 +28,6 @@ #define LKT_KEY_VALUE_SEP ": \n\t\0" #define fail_if(cond, msg) { if (cond) { LOG_ERROR("%s", msg); exit(EXIT_FAILURE); } } #define fail(msg) { LOG_ERROR("%s", msg); exit(EXIT_FAILURE); } -#define lkt_send_and_exit(buffer, len) exit(write_socket(lkt_connect(), buffer, len)) -#define write_socket(sock, buff, len) (fwrite(buff, sizeof(char), len, sock) != len) #define exit_with_status(sock, buff) { \ read_socket(sock, buff, 2); \ @@ -82,29 +80,6 @@ read_socket(FILE *sock, char *buff, size_t max_len) return i; } -static int -write_socket_format(FILE *sock, const char *format, ...) -{ - int ret = 1, size; - char buff[LKT_MESSAGE_MAX]; - va_list ap; - - va_start(ap, format); - size = vsnprintf(buff, LKT_MESSAGE_MAX - 1, format, ap); - buff[LKT_MESSAGE_MAX - 1] = 0; - - if (size < 0) - goto err; - - if (fwrite(buff, sizeof(char), size, sock) < (unsigned int) size) - goto err; - - ret = 0; -err: - va_end(ap); - return ret; -} - static FILE * create_socket(const char *host, const char *port) { @@ -143,6 +118,33 @@ lkt_connect(void) return sock; } +static void +write_socket(FILE *sock, const char *format, ...) +{ + int size; + char buff[LKT_MESSAGE_MAX]; + va_list ap; + + va_start(ap, format); + size = vsnprintf(buff, LKT_MESSAGE_MAX - 1, format, ap); + buff[LKT_MESSAGE_MAX - 1] = 0; + + if (size < 0) + fail("Connexion error") + + if (fwrite(buff, sizeof(char), size, sock) < (unsigned int) size) + fail("Connexion error") + + va_end(ap); +} + +noreturn static inline void +lkt_send_and_exit(const char *buffer, size_t len) +{ + write_socket(lkt_connect(), buffer, len); + exit(EXIT_SUCCESS); +} + static char * lkt_skip_key(char *buffer) { @@ -163,7 +165,7 @@ send_cmd_with_uri(FILE *sock, char *cmd, int argc, const char **argv) } strncat(buf, argv[i], LKT_MESSAGE_MAX - 1); strncat(buf, "\n", LKT_MESSAGE_MAX - 1); - (void) write_socket_format(sock, "%s %s://%s", cmd, argv[0], buf); + write_socket(sock, "%s %s://%s", cmd, argv[0], buf); } /* Functions implementing options. */ @@ -188,7 +190,8 @@ simple_send_with_password__(const char *cmd) fail("Password not provided"); static const char cmd__[] = "password %s\n%s\nclose\n"; FILE *sock = lkt_connect(); - exit(write_socket_format(sock, cmd__, password, cmd)); + write_socket(sock, cmd__, password, cmd); + exit(EXIT_SUCCESS); } noreturn void @@ -218,17 +221,17 @@ rescan_or_update__(struct lkt_cmd_args *args, const char *cmd) /* All the db */ if (args->argc == 0) - exit(write_socket_format(sock, "password %s\n%s\n", password, cmd)); + write_socket(sock, "password %s\n%s\n", password, cmd); /* With a query */ else { memset(buff, 0, LKT_MESSAGE_MAX * sizeof(char)); for (i = 0; i < args->argc; ++i) strncat(buff, args->argv[i], LKT_MESSAGE_MAX - 1); - exit(write_socket_format(sock, "password %s\n%s %s\n", password, cmd, buff)); + write_socket(sock, "password %s\n%s %s\n", password, cmd, buff); } - abort(); + exit(EXIT_SUCCESS); } noreturn void @@ -259,11 +262,8 @@ play__(struct lkt_cmd_args *args) static const char cmd_pause__[] = "pause\nclose\n"; char buff[LKT_MESSAGE_MAX]; - FILE *sock = lkt_connect(); - - if (write_socket(sock, status__, sizeof(status__))) /* In bytes. */ - exit(EXIT_FAILURE); + write_socket(sock, status__); for (;;) { memset(buff, 0, LKT_MESSAGE_MAX * sizeof(char)); @@ -276,8 +276,10 @@ play__(struct lkt_cmd_args *args) if (STR_NMATCH(lkt_skip_key(buff), "stop", 4)) { if (!pos) lkt_send_and_exit(cmd_play__, sizeof(cmd_play__)); /* In bytes. */ - else - exit(write_socket_format(lkt_connect(), cmd_play_from__, pos)); + else { + write_socket(lkt_connect(), cmd_play_from__, pos); + exit(EXIT_SUCCESS); + } } else @@ -295,8 +297,7 @@ ping__(struct lkt_cmd_args *args) fail("Invalid argument, the ping command takes no arguments"); char buff[6] = {0}; FILE *sock = lkt_connect(); - if (write_socket(sock, "ping\nclose\n", sizeof("ping\n"))) - fail("Failed to send the ping to lektord"); + write_socket(sock, "ping\nclose\n"); read_socket(sock, buff, 6 * sizeof(char)); if (!STR_NMATCH(buff, "OK", 2)) fail("ACK"); @@ -316,9 +317,7 @@ current__(struct lkt_cmd_args *args) char *mem = NULL; FILE *sock = lkt_connect(); - if (write_socket(sock, current_song__, sizeof(current_song__))) /* In bytes. */ - exit(EXIT_FAILURE); - + write_socket(sock, current_song__); assert(mem = calloc(6 * LKT_MESSAGE_MAX, sizeof(char))); assert(memset(mem, 0, 6 * LKT_MESSAGE_MAX * sizeof(char))); @@ -382,9 +381,7 @@ queue_pop__(struct lkt_cmd_args *args) FILE *sock = lkt_connect(); /* Get lektor's status. */ - - if (write_socket(sock, "status\n", sizeof("status\n"))) - exit(EXIT_FAILURE); + write_socket(sock, "status\n"); #define assign_int(str, var) if (STR_NMATCH(buff, str, len)) { var = (atoi(lkt_skip_key(buff))); continue; } for (;;) { @@ -405,7 +402,7 @@ queue_pop__(struct lkt_cmd_args *args) sock = lkt_connect(); if (!songid) exit(EXIT_FAILURE); - write_socket_format(sock, "next\ndeleteid %d\n", songid); + write_socket(sock, "next\ndeleteid %d\n", songid); exit_with_status(sock, buff); } @@ -429,8 +426,7 @@ status__(struct lkt_cmd_args *args) /* Get lektor's status. */ - if (write_socket(sock, status_str__, strlen(status_str__))) - goto error; + write_socket(sock, status_str__); #define assign_flag(str, f) if (STR_NMATCH(buff, str, len) && (atoi(lkt_skip_key(buff)) == 1)) { flags[it++] = f; continue; } #define assign_int(str, var) if (STR_NMATCH(buff, str, len)) { var = (atoi(lkt_skip_key(buff))); continue; } @@ -497,7 +493,7 @@ queue_delete__(struct lkt_cmd_args *args) sscanf(args->argv[0], "%d", &dumy); if (dumy != 0) { - fail_if(write_socket_format(sock, cmd_id__, dumy), "ACK"); + write_socket(sock, cmd_id__, dumy); exit_with_status(sock, buff); } @@ -543,7 +539,7 @@ queue_seek__(struct lkt_cmd_args *args) fail("Invalid argument, must be only one integer"); FILE *sock = lkt_connect(); - fail_if(write_socket_format(sock, "playid %ld\n", id), "ACK"); + write_socket(sock, "playid %ld\n", id); exit_with_status(sock, buf); } @@ -573,8 +569,10 @@ queue_pos__(struct lkt_cmd_args *args) FILE *sock = NULL; redo: sock = lkt_connect(); - fail_if(up != 0 && write_socket_format(sock, "playlist %d:%d\n", continuation, up), "ACK"); - fail_if(up == 0 && write_socket_format(sock, "playlist %d\n", continuation), "ACK"); + if (up != 0) + write_socket(sock, "playlist %d:%d\n", continuation, up); + else + write_socket(sock, "playlist %d\n", continuation); for (;;) { memset(buff, 0, LKT_MESSAGE_MAX * sizeof(char)); @@ -622,8 +620,7 @@ queue_list__(struct lkt_cmd_args *args) /* Get the current pos to get limits for the playlist command. */ sock = lkt_connect(); - if (write_socket(sock, "status\n", sizeof("status\n"))) - fail("Communication error"); + write_socket(sock, "status\n"); #define assign_int(str, var) if (STR_NMATCH(buff, str, len)) { var = (atoi(lkt_skip_key(buff))); continue; } for (;;) { @@ -680,7 +677,7 @@ plt_destroy__(struct lkt_cmd_args *args) fail_if(args->argc != 1, "Invalid argument"); FILE *sock = lkt_connect(); char buff[2]; - write_socket_format(sock, "rm %s\n", args->argv[0]); + write_socket(sock, "rm %s\n", args->argv[0]); exit_with_status(sock, buff); } @@ -691,7 +688,7 @@ plt_create__(struct lkt_cmd_args *args) FILE *sock = lkt_connect(); char buff[2]; - write_socket_format(sock, "playlistadd %s\n", args->argv[0]); + write_socket(sock, "playlistadd %s\n", args->argv[0]); exit_with_status(sock, buff); } @@ -701,15 +698,13 @@ stickers_get__(struct lkt_cmd_args *args) char buff[LKT_MESSAGE_MAX]; FILE *sock; if (args->argc == 2) - write_socket_format(sock = lkt_connect(), "sticker get %s %s\n", - args->argv[0], args->argv[1]); + write_socket(sock = lkt_connect(), "sticker get %s %s\n", args->argv[0], args->argv[1]); else if (args->argc == 3) - write_socket_format(sock = lkt_connect(), "sticker get %s %s %s\n", - args->argv[0], args->argv[1], args->argv[2]); + write_socket(sock = lkt_connect(), "sticker get %s %s %s\n", args->argv[0], args->argv[1], + args->argv[2]); else if (args->argc == 5) - write_socket_format(sock = lkt_connect(), "sticker get %s %s %s %s %s\n", - args->argv[0], args->argv[1], args->argv[2], - args->argv[3], args->argv[4]); + write_socket(sock = lkt_connect(), "sticker get %s %s %s %s %s\n", args->argv[0], + args->argv[1], args->argv[2], args->argv[3], args->argv[4]); else fail("Invalid argument"); @@ -730,7 +725,7 @@ stickers_set__(struct lkt_cmd_args *args) fail_if(args->argc != 4, "Invalid argument"); FILE *sock = lkt_connect(); char buff[2]; - write_socket_format(sock, "sticker set %s %s %s %s\n", args->argv[0], + write_socket(sock, "sticker set %s %s %s %s\n", args->argv[0], args->argv[1], args->argv[2], args->argv[3]); exit_with_status(sock, buff); } @@ -741,10 +736,10 @@ stickers_delete__(struct lkt_cmd_args *args) FILE *sock; char buff[2]; if (args->argc == 2) - write_socket_format(sock = lkt_connect(), "sticker delete %s %s", + write_socket(sock = lkt_connect(), "sticker delete %s %s", args->argv[0], args->argv[1]); else if (args->argc == 3) - write_socket_format(sock = lkt_connect(), "sticker delete %s %s %s", + write_socket(sock = lkt_connect(), "sticker delete %s %s %s", args->argv[0], args->argv[1], args->argv[2]); else fail("Invalid argument"); @@ -765,10 +760,10 @@ search_with_cmd__(struct lkt_cmd_args *args, const char *cmd) redo: sock = lkt_connect(); - write_socket_format(sock, "%d %s", continuation, cmd); + write_socket(sock, "%d %s", continuation, cmd); for (i = 0; i < args->argc; ++i) - write_socket_format(sock, " %s", args->argv[i]); - (void) write_socket(sock, "\n", sizeof("\n") / sizeof(char)); + write_socket(sock, " %s", args->argv[i]); + write_socket(sock, "\n"); for (;;) { memset(buff, 0, LKT_MESSAGE_MAX * sizeof(char));