static void do_cache(const char *socket, const char *action, int timeout, int flags) { struct strbuf buf = STRBUF_INIT; strbuf_addf(&buf, "action=%s\n", action); strbuf_addf(&buf, "timeout=%d\n", timeout); if (flags & FLAG_RELAY) { if (strbuf_read(&buf, 0, 0) < 0) die_errno("unable to relay credential"); } if (send_request(socket, &buf) < 0) { if (errno != ENOENT && errno != ECONNREFUSED) die_errno("unable to connect to cache daemon"); if (flags & FLAG_SPAWN) { spawn_daemon(socket); if (send_request(socket, &buf) < 0) die_errno("unable to connect to cache daemon"); } } strbuf_release(&buf); }
int main(int argc, char const *argv[]) { shmem *mem; const char *geometry; int lemon_in, lemon_out; int tries=0; struct pollfd fds[1]; fds[0].events = POLLIN; geometry = (argc < 2) ? DEFAULT_GEOM : argv[1]; if (validate_geometry(geometry) < 0){ fprintf(stderr, "please provide a valid window geometry. E.g. 1920x22+0+0 (widthxheight+X+Y)\n"); return -1; } if ((mem = setup_memory(0)) == MEM_FAILED){ printf("Spawning data daemon\n"); if (spawn_daemon() < 0){ fprintf(stderr, "failed to start daemon\n"); exit(-1); } while ((mem = setup_memory(0)) == MEM_FAILED){ if (tries++ > 10){ fprintf(stderr, "failed to connect to daemon\n"); exit(-1); } sleep(1); } printf("connected to new data source\n"); } else { printf("Connected to running data source.\n"); } spawn_bar(&lemon_in, &lemon_out, geometry); fds[0].fd = lemon_out; notify_server(mem->server); catch_signals(); //@todo allow an escape for when server dies while (1) { DEBUG_(printf("waiting for wakeup signal\n")); //block. wait here for lemonbar click output, or update signal from server //we could block with read() or something, but let's plan for multiple //sources for the future. if (poll(fds, 1, -1) < 0){ if (errno != EINTR){ perror("poll"); break; } } if (fds[0].revents & POLLIN) { fds[0].revents = 0; //clear for next round //something was clicked process_click(fds[0].fd); } else { //must have gotten pinged by server //@todo verify SIGUSR1 vs other signals (which generally just exit anyway) update_bar(mem,lemon_in); } } return -1; }