static void log_cmd (const char *op, s_symtable *cmd) { char msg[2048]; assert(cmd); stracat(msg, sizeof(msg), cmd->sym, cmd->count); syslog(LOG_INFO, "%s %s", op, msg); }
static void log_rule (const char *op, s_symtable *cmd) { char msg[2048]; size_t m = 0; assert(cmd); m += strlcpy(msg + m, ENV_AUTH_ID, sizeof(msg) - m); msg[m++] = '='; stracat(msg + m, sizeof(msg) - m, cmd->sym, cmd->count); syslog(LOG_INFO, "%s %s", op, msg); }
static void exec_cmd (const s_symtable *cmd) { s_symtable xc; char buf[2048]; assert(cmd); symtable_init(&xc); symtable_add(&xc, SHELL); symtable_add(&xc, "-c"); stracat(buf, sizeof(buf), cmd->sym + 1, cmd->count - 1); symtable_add(&xc, buf); log_cmd("EXEC", &xc); cleanup(); execvp(xc.sym[0], (char **)xc.sym); syslog(LOG_ERR, "execvp: %s", strerror(errno)); err(2, "execvp"); }
void dfsch_load(dfsch_object_t* env, char* name, dfsch_object_t* path_list, int as_toplevel){ struct stat st; dfsch_object_t* path; char *pathpart; char *fname; str_list_t* l; int i; for (i = 0; i < sizeof(builtin_modules) / sizeof(builtin_module_t); i++){ if (strcmp(builtin_modules[i].name, name) == 0){ builtin_modules[i].register_proc(env); return; } } if (path_list){ path = path_list; } else { path = dfsch_env_get_cstr(env, "*load-path*"); if (path == DFSCH_INVALID_OBJECT){ path = NULL; } } while (DFSCH_PAIR_P(path)){ dfsch_object_t* pp = DFSCH_FAST_CAR(path); if (!dfsch_string_p(pp)){ if (dfsch_apply(pp, dfsch_list(2, env, dfsch_make_string_cstr(name)))){ return; } path = DFSCH_FAST_CDR(path); continue; } l = sl_create(); sl_append(l, dfsch_string_to_cstr(DFSCH_FAST_CAR(path))); sl_append(l, "/"); sl_append(l, name); pathpart = sl_value(l); if (stat(pathpart, &st) == 0){ if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)){ for (i = 0; i < sizeof(loaders) / sizeof(module_loader_t); i++){ if (strcmp(pathpart + strlen(pathpart) - strlen(loaders[i].path_ext), loaders[i].path_ext) == 0){ loaders[i].load(pathpart, env, as_toplevel); return; } } dfsch_load_scm(env, pathpart, 0); return; } } for (i = 0; i < sizeof(loaders) / sizeof(module_loader_t); i++){ fname = stracat(pathpart, loaders[i].path_ext); if (stat(fname, &st) == 0 && (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode))){ loaders[i].load(fname, env, as_toplevel); return; } } path = dfsch_cdr(path); } dfsch_error("Module not found", dfsch_make_string_cstr(name)); }
static void log_args (const char *op, int argc, const char **argv) { char msg[2048]; stracat(msg, sizeof(msg), argv, argc); syslog(LOG_INFO, "%s %s", op, msg); }