-rw-r--r-- src/wimptool.c
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <sys/socket.h> 4 #include <sys/un.h> 5 #include <unistd.h> 6 7 #define SOCKET_PATH "/tmp/wimpy-sock-%s" 8 9 10 void usage() { 11 fprintf(stdout, "Usage: wimptool <command> <arguments>\n"); 12 } 13 14 15 int main(int argc, char *argv[]) { 16 if (argc < 2) { 17 usage(); 18 return EXIT_FAILURE; 19 } 20 21 char *display = getenv("WAYLAND_DISPLAY"); 22 if (!display) { 23 fprintf(stderr, "WAYLAND_DISPLAY not set.\n"); 24 return EXIT_FAILURE; 25 } 26 27 int sock; 28 if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { 29 fprintf(stderr, "Failed to create socket.\n"); 30 return EXIT_FAILURE; 31 } 32 33 struct sockaddr_un addr; 34 snprintf(addr.sun_path, sizeof(addr.sun_path), SOCKET_PATH, display); 35 addr.sun_family = AF_UNIX; 36 37 if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) { 38 fprintf(stderr, "Failed to connect to wimp.\n"); 39 return EXIT_FAILURE; 40 } 41 42 char buffer[BUFSIZ] = {0}; 43 for (int i = 1; i < argc; i++) { 44 strcat(buffer, argv[i]); 45 strcat(buffer, " "); 46 } 47 48 if (send(sock, buffer, strlen(buffer), 0) == -1) { 49 fprintf(stderr, "Failed to send message to wimp.\n"); 50 return EXIT_FAILURE; 51 } 52 53 char response[BUFSIZ] = {0}; 54 ssize_t len = recv(sock, response, sizeof(response) - 1, 0); 55 if (len < 0) { 56 fprintf(stderr, "Error receiving a response.\n"); 57 return EXIT_FAILURE; 58 } 59 60 if (len > 0) { 61 response[len] = '\0'; 62 fprintf(stdout, "wimp: %s\n", response); 63 } 64 close(sock); 65 return EXIT_SUCCESS; 66 } 67