diff options
Diffstat (limited to 'pseudo_util.c')
-rw-r--r-- | pseudo_util.c | 145 |
1 files changed, 81 insertions, 64 deletions
diff --git a/pseudo_util.c b/pseudo_util.c index 8d0969e..0d80008 100644 --- a/pseudo_util.c +++ b/pseudo_util.c @@ -84,14 +84,14 @@ static void dump_env(char **envp) { size_t i = 0; for (i = 0; envp[i]; i++) { - pseudo_debug(0,"dump_envp: [%d]%s\n", (int) i, envp[i]); + pseudo_debug(PDBGF_ENV, "dump_envp: [%d]%s\n", (int) i, envp[i]); } for (i = 0; pseudo_env[i].key; i++) { - pseudo_debug(0,"dump_envp: {%d}%s=%s\n", (int) i, pseudo_env[i].key, pseudo_env[i].value); + pseudo_debug(PDBGF_ENV, "dump_envp: {%d}%s=%s\n", (int) i, pseudo_env[i].key, pseudo_env[i].value); } - pseudo_debug(0, "dump_envp: _in_init %d\n", pseudo_util_initted); + pseudo_debug(PDBGF_ENV, "dump_envp: _in_init %d\n", pseudo_util_initted); } #endif @@ -175,21 +175,19 @@ pseudo_init_util(void) { if (env) { int i; int level = atoi(env); - for (i = 0; i < level; ++i) { - pseudo_debug_verbose(); - } + if (level > 0) { + for (i = 0; i < level; ++i) { + pseudo_debug_verbose(); + } + } else { + pseudo_debug_set(env); + } + pseudo_debug_flags_finalize(); } free(env); } -/* 5 = ridiculous levels of duplication - * 4 = exhaustive detail - * 3 = detailed protocol analysis - * 2 = higher-level protocol analysis - * 1 = stuff that might go wrong - * 0 = fire and arterial bleeding - */ -static int max_debug_level = 0; +unsigned long pseudo_util_debug_flags = 0; int pseudo_util_debug_fd = 2; static int debugged_newline = 1; static char pid_text[32]; @@ -335,63 +333,78 @@ with_libpseudo(char *list, char *libdir_path) { char *pseudo_version = PSEUDO_VERSION; +/* going away soon */ +static int max_debug_level = 0; + void pseudo_debug_terse(void) { - if (max_debug_level > 0) - --max_debug_level; + char s[2] = { pseudo_debug_type_symbolic(max_debug_level) }; - char s[16]; - snprintf(s, 16, "%d", max_debug_level); - pseudo_set_value("PSEUDO_DEBUG", s); + if (max_debug_level > 0) { + --max_debug_level; + pseudo_debug_clear(s); + } } void pseudo_debug_verbose(void) { - ++max_debug_level; + char s[2] = { pseudo_debug_type_symbolic(max_debug_level + 1) }; - char s[16]; - snprintf(s, 16, "%d", max_debug_level); - pseudo_set_value("PSEUDO_DEBUG", s); + if (s[0]) { + pseudo_debug_set(s); + ++max_debug_level; + } } -int -pseudo_diag(char *fmt, ...) { - va_list ap; - char debuff[8192]; - int len; - /* gcc on Ubuntu 8.10 requires that you examine the return from - * write(), and won't let you cast it to void. Of course, if you - * can't print error messages, there's nothing to do. - */ - int wrote = 0; - - va_start(ap, fmt); - len = vsnprintf(debuff, 8192, fmt, ap); - va_end(ap); - - if (len > 8192) - len = 8192; +/* This exists because we don't want to allocate a bunch of strings + * and free them immediately if you have several flags set. + */ +void +pseudo_debug_flags_finalize(void) { + char buf[PDBG_MAX + 1] = "", *s = buf; + for (int i = 0; i < PDBG_MAX; ++i) { + if (pseudo_util_debug_flags & (1 << i)) { + *s++ = pseudo_debug_type_symbolic(i); + } + } + pseudo_set_value("PSEUDO_DEBUG", buf); +} - if (debugged_newline && max_debug_level > 1) { - wrote += write(pseudo_util_debug_fd, pid_text, pid_len); +void +pseudo_debug_set(char *s) { + if (!s) + return; + for (; *s; ++s) { + int id = pseudo_debug_type_symbolic_id(*s); + if (id > 0) { + pseudo_util_debug_flags |= (1 << id); + } } - debugged_newline = (debuff[len - 1] == '\n'); +} - wrote += write(pseudo_util_debug_fd, "pseudo: ", 8); - wrote += write(pseudo_util_debug_fd, debuff, len); - return wrote; +void +pseudo_debug_clear(char *s) { + if (!s) + return; + for (; *s; ++s) { + int id = pseudo_debug_type_symbolic_id(*s); + if (id > 0) { + pseudo_util_debug_flags &= ~(1 << id); + } + } } int -pseudo_debug_real(int level, char *fmt, ...) { +pseudo_diag(char *fmt, ...) { va_list ap; char debuff[8192]; int len; + /* gcc on Ubuntu 8.10 requires that you examine the return from + * write(), and won't let you cast it to void. Of course, if you + * can't print error messages, there's nothing to do. + */ int wrote = 0; - if (max_debug_level < level) - return 0; - va_start(ap, fmt); len = vsnprintf(debuff, 8192, fmt, ap); va_end(ap); @@ -399,7 +412,7 @@ pseudo_debug_real(int level, char *fmt, ...) { if (len > 8192) len = 8192; - if (debugged_newline && max_debug_level > 1) { + if (debugged_newline && (pseudo_util_debug_flags & PDBGF_PID)) { wrote += write(pseudo_util_debug_fd, pid_text, pid_len); } debugged_newline = (debuff[len - 1] == '\n'); @@ -419,8 +432,9 @@ round_up(size_t n, size_t block) { /* store pid in text form for prepending to messages */ void pseudo_new_pid() { - pid_len = snprintf(pid_text, 32, "%d: ", getpid()); - pseudo_debug(2, "new pid.\n"); + int pid = getpid(); + pid_len = snprintf(pid_text, 32, "%d: ", pid); + pseudo_debug(PDBGF_PID, "new pid: %d\n", pid); } /* helper function for pseudo_fix_path @@ -637,7 +651,7 @@ pseudo_fix_path(const char *base, const char *path, size_t rootlen, size_t basel if (*current == '/' && current > effective_root) { *current = '\0'; } - pseudo_debug(5, "%s + %s => <%s>\n", + pseudo_debug(PDBGF_PATH, "%s + %s => <%s>\n", base ? base : "<nil>", path ? path : "<nil>", newpath ? newpath : "<nil>"); @@ -716,7 +730,7 @@ void pseudo_setupenv() { size_t i = 0; - pseudo_debug(2, "setting up pseudo environment.\n"); + pseudo_debug(PDBGF_CLIENT, "setting up pseudo environment.\n"); /* Make sure everything has been evaluated */ free(pseudo_get_prefix(NULL)); @@ -725,8 +739,11 @@ pseudo_setupenv() { free(pseudo_get_localstatedir()); while (pseudo_env[i].key) { - if (pseudo_env[i].value) + if (pseudo_env[i].value) { setenv(pseudo_env[i].key, pseudo_env[i].value, 0); + pseudo_debug(PDBGF_ENV | PDBGF_VERBOSE, "pseudo_env: %s => %s\n", + pseudo_env[i].key, pseudo_env[i].value); + } i++; } @@ -800,7 +817,7 @@ pseudo_setupenvp(char * const *envp) { char *ld_preload = NULL, *ld_library_path = NULL; - pseudo_debug(2, "setting up envp environment.\n"); + pseudo_debug(PDBGF_ENV, "setting up envp environment.\n"); /* Make sure everything has been evaluated */ free(pseudo_get_prefix(NULL)); @@ -1249,28 +1266,28 @@ pseudo_etc_file(const char *file, char *realname, int flags, char **search_dirs, if (rc >= 0) { if (realname) strcpy(realname, filename); - pseudo_debug(2, "using <%s> for <%s>\n", + pseudo_debug(PDBGF_CHROOT, "using <%s> for <%s>\n", filename, file); return rc; } else { - pseudo_debug(3, "didn't find <%s>\n", + pseudo_debug(PDBGF_CHROOT, "didn't find <%s>\n", filename); } } } else { - pseudo_debug(2, "pseudo_etc_file: no search dirs.\n"); + pseudo_debug(PDBGF_CHROOT, "pseudo_etc_file: no search dirs.\n"); } #if PSEUDO_PORT_DARWIN if (!strcmp("passwd", file)) { - pseudo_debug(2, "Darwin hackery: pseudo_etc_passwd returning magic passwd fd\n"); + pseudo_debug(PDBGF_CHROOT, "Darwin hackery: pseudo_etc_passwd returning magic passwd fd\n"); return pseudo_host_etc_passwd_fd; } else if (!strcmp("group", file)) { - pseudo_debug(2, "Darwin hackery: pseudo_etc_passwd returning magic group fd\n"); + pseudo_debug(PDBGF_CHROOT, "Darwin hackery: pseudo_etc_passwd returning magic group fd\n"); return pseudo_host_etc_group_fd; } #endif snprintf(filename, pseudo_path_max(), "/etc/%s", file); - pseudo_debug(2, "falling back on <%s> for <%s>\n", + pseudo_debug(PDBGF_CHROOT, "falling back on <%s> for <%s>\n", filename, file); rc = open(filename, flags, 0600); if (rc >= 0 && realname) @@ -1293,7 +1310,7 @@ pseudo_logfile(char *defname) { if (!filename) { if (!defname) { - pseudo_debug(3, "no special log file requested, using stderr.\n"); + pseudo_debug(PDBGF_INVOKE, "no special log file requested, using stderr.\n"); return -1; } pseudo_path = pseudo_localstatedir_path(defname); |