X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;ds=sidebyside;f=bspc.c;h=416edd727a7595991a33eb28c09d24da4ef29721;hb=390a6c1ee7fc1fdf32d23da611f7724bb120943a;hp=d861a94d4a72d27f1a0df8851da30c5bc77ed7a9;hpb=5ca8e69d024be1b9c43cef6d301f47cebbd70d3c;p=bspwm.git diff --git a/bspc.c b/bspc.c index d861a94..416edd7 100644 --- a/bspc.c +++ b/bspc.c @@ -1,48 +1,94 @@ -#include +/* Copyright (c) 2012, Bastien Dejean + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + #include -#include +#ifdef __OpenBSD__ +#include +#endif #include #include #include +#include +#include "helpers.h" #include "common.h" int main(int argc, char *argv[]) { - int sock_fd, nbr, i; - struct sockaddr_un sock_address; - char socket_path[BUFSIZ]; - char msg[BUFSIZ]; - char rsp[BUFSIZ]; + int fd; + struct sockaddr_un sock_address; + char msg[BUFSIZ], rsp[BUFSIZ]; - if (argc < 2) - return -1; + if (argc < 2) + err("No arguments given.\n"); - char *sp = getenv(SOCKET_ENV_VAR); + sock_address.sun_family = AF_UNIX; + char *sp; - strcpy(socket_path, (sp == NULL ? DEFAULT_SOCKET_PATH : sp)); + if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) + err("Failed to create the socket.\n"); - msg[0] = '\0'; + sp = getenv(SOCKET_ENV_VAR); + if (sp != NULL) { + snprintf(sock_address.sun_path, sizeof(sock_address.sun_path), "%s", sp); + } else { + char *host = NULL; + int dn = 0, sn = 0; + if (xcb_parse_display(NULL, &host, &dn, &sn) != 0) + snprintf(sock_address.sun_path, sizeof(sock_address.sun_path), SOCKET_PATH_TPL, host, dn, sn); + free(host); + } - for (i = 1; i < argc; i++) { - strcat(msg, argv[i]); - if (i < (argc - 1)) - strcat(msg, TOKEN_SEP); - } + if (connect(fd, (struct sockaddr *) &sock_address, sizeof(sock_address)) == -1) + err("Failed to connect to the socket.\n"); - sock_address.sun_family = AF_UNIX; - strcpy(sock_address.sun_path, socket_path); + argc--, argv++; + int msg_len = 0; - sock_fd = socket(AF_UNIX, SOCK_STREAM, 0); - connect(sock_fd, (struct sockaddr *) &sock_address, sizeof(sock_address)); + for (int offset = 0, rem = sizeof(msg), n = 0; argc > 0 && rem > 0; offset += n, rem -= n, argc--, argv++) { + n = snprintf(msg + offset, rem, "%s%c", *argv, 0); + msg_len += n; + } - send(sock_fd, msg, strlen(msg), 0); + if (send(fd, msg, msg_len, 0) == -1) + err("Failed to send the data.\n"); - if ((nbr = recv(sock_fd, rsp, sizeof(rsp), 0)) > 0) { - rsp[nbr] = '\0'; - if (strcmp(rsp, EMPTY_RESPONSE) != 0) - printf("%s", rsp); - } + int ret = 0, nb; + while ((nb = recv(fd, rsp, sizeof(rsp)-1, 0)) > 0) { + if (nb == 1 && rsp[0] < MSG_LENGTH) { + ret = rsp[0]; + if (ret == MSG_UNKNOWN) { + warn("Unknown command.\n"); + } else if (ret == MSG_SYNTAX) { + warn("Invalid syntax.\n"); + } + } else { + rsp[nb] = '\0'; + printf("%s", rsp); + fflush(stdout); + } + } - close(sock_fd); - return 0; + close(fd); + return ret; }