int main(int argc, char *argv[]) { // Initialise the cfg structure (this sets up a linked list // of key / value pairs) struct Config *cfg = cfg_init("settings.cfg"); // Search for a key. Note that the return value is a pointer // in the cfg structure so should NOT be freed (it is freed // eventually by cfg_free.); char *value = cfg_get_string(cfg, "barney", "The default value"); printf("\"%s\"\n", value); // Search for a non-existent key to show default value being returned char *value2 = cfg_get_string(cfg, "non-existent", "A default value"); printf("\"%s\"\n", value2); // Get a number long num = cfg_get_long(cfg, "NuMbEr", 69); printf("Number is %ld\n", num); // Dump everything - showing the cfg_foreach() function printf("DEBUG dump all:\n"); cfg_foreach(cfg, callback); // Finally tear down the cfg structure. This will invalidate any // strings we've been returned, so we should make copies of // anything we want to keep first. cfg_free(cfg); return 0; }
int device_script(int fd, const char *section, struct gn_statemachine *state) { pid_t pid; const char *scriptname; int status; if (!strcmp(section, "connect_script")) scriptname = state->config.connect_script; else scriptname = state->config.disconnect_script; if (scriptname[0] == '\0') return 0; errno = 0; switch ((pid = fork())) { case -1: fprintf(stderr, _("device_script(\"%s\"): fork() failure: %s!\n"), scriptname, strerror(errno)); return -1; case 0: /* child */ cfg_foreach(section, device_script_cfgfunc); errno = 0; if (dup2(fd, 0) != 0 || dup2(fd, 1) != 1 || close(fd)) { fprintf(stderr, _("device_script(\"%s\"): file descriptor preparation failure: %s\n"), scriptname, strerror(errno)); _exit(-1); } /* FIXME: close all open descriptors - how to track them? */ execl("/bin/sh", "sh", "-c", scriptname, NULL); fprintf(stderr, _("device_script(\"%s\"): script execution failure: %s\n"), scriptname, strerror(errno)); _exit(-1); /* NOTREACHED */ default: if (pid == waitpid(pid, &status, 0 /* options */) && WIFEXITED(status) && !WEXITSTATUS(status)) return 0; fprintf(stderr, _("device_script(\"%s\"): child script execution failure: %s, exit code=%d\n"), scriptname, (WIFEXITED(status) ? _("normal exit") : _("abnormal exit")), (WIFEXITED(status) ? WEXITSTATUS(status) : -1)); errno = EIO; return -1; } /* NOTREACHED */ }