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);
}
Exemple #2
0
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;
}