int main(int argc, char **argv) { int ret, i; FILE *cfg = cfg_open(); char *statedir = cfg_get_default(cfg, "statedir", STATEDIR); cfg_close(cfg); for (i = 0; gpios[i].dev; i++) { int err = gpio_init(&gpios[i]); if (err) { fprintf(stderr, "could not init gpio \"%s\": %d!\n", gpios[i].name, err); return 1; } } char buffer[EVENT_BUF_LEN]; state.fd = inotify_init(); if(state.fd < 0) { fprintf(stderr, "Could not init inotify!\n"); return 1; } ret = mkdir(statedir, 0775); if (ret < 0 && errno != EEXIST) { fprintf(stderr, "Could not create statedir: %d\n", ret); return 1; } ret = chmod(statedir, 0775); if (ret < 0) { fprintf(stderr, "Cannot fix rights on statedir: %d\n", ret); return 1; } state.wd = inotify_add_watch(state.fd, statedir, IN_MODIFY | IN_DELETE); state.doorstate = DOOR_UNKNOWN; for(;;) { int len = read(state.fd, buffer, EVENT_BUF_LEN); sleep(1); len = read(state.fd, buffer, EVENT_BUF_LEN); if(!state_read(statedir, &state.keyholder_id, &state.keyholder_name, &state.status, &state.message)) { fprintf(stderr, "Could not read state!\n"); return 1; } printf("new state: id=%d name=%s status=%d message=%s\n", state.keyholder_id, state.keyholder_name, state.status, state.message); switch(state.status) { case STATE_NONE: lock(); state.doorstate = DOOR_LOCKED; break; case STATE_KEYHOLDER: case STATE_MEMBER: case STATE_OPEN: case STATE_OPEN_PLUS: unlock(); state.doorstate = DOOR_UNLOCKED; break; case STATE_UNKNOWN: default: state.doorstate = DOOR_UNKNOWN; break; } free(state.keyholder_name); free(state.message); } inotify_rm_watch(state.fd, state.wd); close(state.fd); }
static quik_err_t get_params(char **kernel, char **initrd, char **params, env_dev_t *cur_dev) { char *p; char *q; int n; char *buf; char *endp; key_t lastkey; char *label = NULL; int timeout = DEFAULT_TIMEOUT; if ((bi->flags & TRIED_AUTO) == 0) { bi->flags ^= TRIED_AUTO; *params = bi->bootargs; *kernel = *params; word_split(kernel, params); if (!*kernel) { *kernel = cfg_get_default(); /* * Timeout only makes sense * if we don't have an image name already * passed. */ if ((bi->flags & CONFIG_VALID) && (q = cfg_get_strg(0, "timeout")) != 0 && *q != 0) { timeout = strtol(q, NULL, 0); } } else { /* * We have something, boot immediately. */ timeout = 0; } } printk(PROMPT); lastkey = KEY_NONE; if (timeout != -1) { lastkey = wait_for_key(timeout, '\n'); } if (lastkey == '\n') { printk("%s", *kernel); if (*params) { printk(" %s", *params); } printk("\n"); } else { *kernel = NULL; buf = cmd_edit(maintabfunc, lastkey); if (buf == NULL) { return ERR_NOT_READY; } *kernel = buf; word_split(kernel, params); } if (bi->flags & CONFIG_VALID) { *initrd = cfg_get_strg(0, "initrd"); p = cfg_get_strg(*kernel, "image"); if (p && *p) { label = *kernel; *kernel = p; p = cfg_get_strg(label, "device"); if (p) { cur_dev->device = p; } p = cfg_get_strg(label, "partition"); if (p) { n = strtol(p, &endp, 10); if (endp != p && *endp == 0) { env_dev_set_part(cur_dev, n); } } p = cfg_get_strg(label, "initrd"); if (p) { *initrd = p; } if (cfg_get_strg(label, "old-kernel")) { bi->flags |= BOOT_PRE_2_4; } else { bi->flags &= ~BOOT_PRE_2_4; } *params = make_params(label, *params); if (*params == NULL) { return ERR_NO_MEM; } } } if (*kernel == NULL) { printk("<TAB> for list of bootable images, or !help\n"); return ERR_NOT_READY; } /* * If we manually entered kernel path, the initrd could * be following in the param list... */ if (label == NULL) { *params = chomp(*params); if (memcmp(*params, "-- ", 3) != 0) { *initrd = *params; word_split(initrd, params); } else { /* * No initrd, just kernel args. */ *params = *params + 3; } } return ERR_NONE; }