static int pseudo_client_setup(void) { char * pseudo_pidfile; FILE *fp; server_pid = 0; /* avoid descriptor leak, I hope */ if (connect_fd >= 0) { close(connect_fd); connect_fd = -1; } pseudo_pidfile = pseudo_localstatedir_path(PSEUDO_PIDFILE); fp = fopen(pseudo_pidfile, "r"); if (fp) { if (fscanf(fp, "%d", &server_pid) != 1) { pseudo_debug(1, "Opened server PID file, but didn't get a pid.\n"); } fclose(fp); } if (server_pid) { if (kill(server_pid, 0) == -1) { pseudo_debug(1, "couldn't find server at pid %d: %s\n", server_pid, strerror(errno)); server_pid = 0; } } if (!server_pid) { if (client_spawn_server()) { return 1; } } if (!client_connect() && !client_ping()) { return 0; } pseudo_debug(2, "server seems to be gone, trying to restart\n"); if (client_spawn_server()) { pseudo_debug(1, "failed to spawn server, giving up.\n"); return 1; } else { pseudo_debug_verbose(); pseudo_debug(2, "restarted, new pid %d\n", server_pid); if (!client_connect() && !client_ping()) { pseudo_debug_terse(); return 0; } pseudo_debug_terse(); } pseudo_debug(1, "couldn't get a server, giving up.\n"); return 1; }
/* You can either create a query or create a log entry. They use very * similar syntax, but: * - if you're making a query, you can use >, <, etc. * - if you're logging, you can't. * This is tracked by recording whether any non-exact relations * have been requested ("query_only"), and refusing to set the -l * flag if they have, and refusing to accept any such relation * if the -l flag is already set. */ int main(int argc, char **argv) { pseudo_query_t *traits = 0, *current = 0, *new_trait = 0; char *s; log_history history; int query_only = 0; int o; int bad_args = 0; char *format = "%s %-12.12R %-4y %7o: [mode %04m, %2a] %p %T"; while ((o = getopt(argc, argv, "vla:c:d:DE:f:F:g:G:hi:I:m:M:o:O:p:P:r:R:s:S:t:T:u:Ux:y:")) != -1) { switch (o) { case 'P': s = PSEUDO_ROOT_PATH(AT_FDCWD, optarg, AT_SYMLINK_NOFOLLOW); if (!s) pseudo_diag("Can't resolve prefix path '%s'\n", optarg); pseudo_set_value("PSEUDO_PREFIX", s); break; case 'v': pseudo_debug_verbose(); break; case 'x': pseudo_debug_set(optarg); break; case 'l': opt_l = 1; break; case 'D': opt_D = 1; query_only = 1; break; case 'E': timeformat = strdup(optarg); break; case 'F': /* disallow specifying -F with -l */ format = strdup(optarg); query_only = 1; break; case 'U': opt_U = 1; query_only = 1; break; case 'I': /* PSQF_ID */ query_only = 1; /* FALLTHROUGH */ case 'a': /* PSQF_ACCESS */ case 'c': /* PSQF_CLIENT */ case 'd': /* PSQF_DEV */ case 'f': /* PSQF_FD */ case 'g': /* PSQF_GID */ case 'G': /* PSQF_TAG */ case 'i': /* PSQF_INODE */ case 'm': /* PSQF_PERM */ case 'M': /* PSQF_MODE */ case 'o': /* PSQF_OP */ case 'O': /* PSQF_ORDER */ case 'p': /* PSQF_PATH */ case 'r': /* PSQF_RESULT */ case 'R': /* PSQF_PROGRAM */ case 's': /* PSQF_STAMP */ case 'S': /* PSQF_SEVERITY */ case 't': /* PSQF_FTYPE */ case 'T': /* PSQF_TEXT */ case 'u': /* PSQF_UID */ case 'y': /* PSQF_TYPE */ new_trait = plog_trait(o, optarg); if (!new_trait) { bad_args = 1; } break; case 'h': usage(EXIT_SUCCESS); break; case '?': /* FALLTHROUGH */ default: fprintf(stderr, "unknown option '%c'\n", optopt); usage(EXIT_FAILURE); break; } if (new_trait) { if (current) { current->next = new_trait; current = current->next; } else { traits = new_trait; current = new_trait; } new_trait = 0; } } pseudo_debug_flags_finalize(); if (optind < argc) { pseudo_diag("Error: Extra arguments not associated with any option.\n"); usage(EXIT_FAILURE); } if (query_only && opt_l) { pseudo_diag("Error: -l cannot be used with query-only options or flags.\n"); bad_args = 1; } /* should be set only if we have already diagnosed the bad arguments. */ if (bad_args) exit(EXIT_FAILURE); if (!pseudo_get_prefix(argv[0])) { pseudo_diag("Can't figure out prefix. Set PSEUDO_PREFIX or invoke with full path.\n"); exit(EXIT_FAILURE); } if (!pseudo_get_bindir()) { pseudo_diag("Can't figure out bindir. Set PSEUDO_BINDIR.\n"); exit(EXIT_FAILURE); } if (!pseudo_get_libdir()) { pseudo_diag("Can't figure out libdir. Set PSEUDO_LIBDIR.\n"); exit(EXIT_FAILURE); } if (!pseudo_get_localstatedir()) { pseudo_diag("Can't figure out localstatedir. Set PSEUDO_LOCALSTATEDIR.\n"); exit(EXIT_FAILURE); } if (opt_l) { pdb_log_traits(traits); } else { int fields; fields = format_scan(format); if (fields == -1) { pseudo_diag("couldn't parse format string (%s).\n", format); return EXIT_FAILURE; } if (opt_D) { if (pdb_delete(traits, fields)) { pseudo_diag("errors occurred trying to delete entries.\n"); } } else { history = pdb_history(traits, fields, opt_U); if (history) { log_entry *e; while ((e = pdb_history_entry(history)) != NULL) { display(e, format); log_entry_free(e); } pdb_history_free(history); } else { pseudo_diag("could not retrieve history.\n"); return EXIT_FAILURE; } } } return 0; }