#include "pipe.h" #include #include #include #include #include #include #include #include "bardata.h" FILE *named_pipe; void init_pipe(void) { remove(PIPE_PATH); mkfifo(PIPE_PATH, 0666); named_pipe = fopen(PIPE_PATH, "r"); } void await_change(void) { char buff[1024]; while (true) { if (!fgets(buff, sizeof(buff), named_pipe)) { fclose(named_pipe); named_pipe = fopen(PIPE_PATH, "r"); // This blocks, 0% CPU, yay continue; } break; } // printf("Received: %s\n", buff); int argc = 0, chr_on = 0, i = 0; char argv[MAX_ARGS][MAX_ARG_LEN]; while (argc < MAX_ARGS) { char chr = buff[i]; if (chr == '\0' || chr == '\n') { break; } // octal 201 is an unused ascii character, so it's safe to use as a // delimiter if (chr == '\201') { if (chr_on == 0) { i++; continue; } argv[argc][chr_on] = '\0'; argc++; chr_on = 0; } else { argv[argc][chr_on] = chr; chr_on++; } i++; } if (chr_on > 0) { argv[argc][chr_on] = '\0'; argc++; } make_change(argv, argc); } void make_change(char argv[MAX_ARGS][MAX_ARG_LEN], int argc) { // printf("Making change with:\n"); // for (int i = 0; i < argc; i++) { // printf("Arg %d: %s\n", i + 1, argv[i]); // } char *cmd = argv[0]; if (strcmp(cmd, "set") == 0) { set_component(argv, argc); } if (strcmp(cmd, "layout") == 0) { set_layout(argv, argc); } if (strcmp(cmd, "config") == 0) { set_config(argv, argc); } }