X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;ds=sidebyside;f=bspc.c;h=b50a8fcee57a20a290a82eb887f5aae1b38a08c9;hb=8be590395568e5de74a8ed8a76f164ceaa44c899;hp=ee6432d523c2337a1d9cf56e37f0956be2965b5f;hpb=71a9457905b7c7050504319947838303504b15d1;p=bspwm.git diff --git a/bspc.c b/bspc.c index ee6432d..b50a8fc 100644 --- a/bspc.c +++ b/bspc.c @@ -1,59 +1,97 @@ +/* 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; - struct sockaddr_un sock_address; - size_t msglen = 0; - char msg[BUFSIZ]; - char rsp[BUFSIZ]; - - if (argc < 2) - err("No arguments given.\n"); - - char *sock_path = getenv(SOCKET_ENV_VAR); - if (sock_path == NULL || strlen(sock_path) == 0) - warn("The environment variable '%s' is not set or empty, we will use: '%s'.\n", SOCKET_ENV_VAR, DEFAULT_SOCKET_PATH); - else if (sizeof(sock_address.sun_path) <= strlen(sock_path)) - err("The string can't fit in the socket address: '%s'.\n", sock_path); - - sock_address.sun_family = AF_UNIX; - strncpy(sock_address.sun_path, (sock_path == NULL ? DEFAULT_SOCKET_PATH : sock_path), sizeof(sock_address.sun_path)); - sock_address.sun_path[sizeof(sock_address.sun_path) - 1] = 0; - - for (int offset = 0, len = sizeof(msg), n = 0; --argc && ++argv && len > 0; offset += n, len -= n) - n = snprintf(msg + offset, len, "%s ", *argv); - - msglen = strlen(msg); - if (msg[msglen - 1] == ' ') - msg[--msglen] = '\0'; - - sock_fd = socket(AF_UNIX, SOCK_STREAM, 0); - if (sock_fd == -1) - err("Failed to create the socket.\n"); - - if (connect(sock_fd, (struct sockaddr *) &sock_address, sizeof(sock_address)) == -1) - err("Failed to connect to the socket.\n"); - - if (send(sock_fd, msg, msglen, 0) == -1) - err("Failed to send the data.\n"); - - int n = recv(sock_fd, rsp, sizeof(rsp), 0); - if (n == -1) { - err("Failed to get the response.\n"); - } else if (n > 0) { - rsp[n] = '\0'; - printf("%s\n", rsp); - } - - if (sock_fd) - close(sock_fd); - - return EXIT_SUCCESS; + int fd; + struct sockaddr_un sock_address; + char msg[BUFSIZ], rsp[BUFSIZ]; + + if (argc < 2) + err("No arguments given.\n"); + + sock_address.sun_family = AF_UNIX; + char *sp; + + if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) + err("Failed to create the socket.\n"); + + 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); + } + + if (connect(fd, (struct sockaddr *) &sock_address, sizeof(sock_address)) == -1) + err("Failed to connect to the socket.\n"); + + argc--, argv++; + int msg_len = 0; + + 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; + } + + if (send(fd, msg, msg_len, 0) == -1) + err("Failed to send the data.\n"); + + int ret = 0, nb; + while ((nb = recv(fd, rsp, sizeof(rsp), 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 { + int end = MIN(nb, (int) sizeof(rsp) - 1); + rsp[end--] = '\0'; + while (end >= 0 && isspace(rsp[end])) + rsp[end--] = '\0'; + printf("%s\n", rsp); + fflush(stdout); + } + } + + close(fd); + return ret; }