aboutsummaryrefslogtreecommitdiff
path: root/src/pipe.c
blob: 997be2dd0f625fd155d7ed74c9b5ef0b0f6c7ffa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <string.h>
#include <ctype.h>

#include "pipe.h"
#include "bardata.h"

FILE *named_pipe;

void init_pipe() {
  mkfifo(PIPE_PATH, 0666);
  named_pipe = fopen(PIPE_PATH, "r");
}

void await_change() {
  char buff[1024];
  while (1) {
    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') {
      break;
    }

    if (isspace(chr)) {
      if (chr_on == 0) {
        i++;
        continue;
      }

      argv[argc][chr_on] = '\0';
      argc++;
      chr_on = 0;

    } else {
      argv[argc][chr_on] = chr;
      chr_on++;
    }

    i++;
  }
  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, "create") == 0) {
    new_component(argv[1]);
    return;
  }
  if (strcmp(cmd, "layout") == 0) {
    set_layout(argv, argc);
  }
  if (strcmp(cmd, "set") == 0) {
    set_var(argv, argc);
  }
}