/* * Transform * * (case-lambda * ((<form1> <body1>) * (<form2> <body2>) * ...) * * to * * (lambda args * (cond * (((if (variadic? <form1>) >= =) (length args) <form1-min-args>) * (apply (lambda (<form1>) <body1>) args)) * ...)) */ cons_t* proc_case_lambda(cons_t* p, environment_t* e) { cons_t *cond_cases = list(); cons_t *cases = p; for ( cons_t* c = cases; !nullp(c); c = cdr(c) ) { cons_t *formals = caar(c); cons_t *body = cdar(c); // ((if (variadic? <form1>) >= =) argc <form1-min-args>) cons_t* cond_if = cons(symbol(variadicp(formals)? ">=" : "="), cons(cons(symbol("length"), cons(symbol("args"))), cons(integer(min_args(formals))))); // (apply (lambda (<form1>) <body1>) args) cons_t *cond_then = cons(symbol("apply"), cons(cons(symbol("lambda"), cons(formals, body)), cons(symbol("args")))); cond_cases = append(cond_cases, list(list(cond_if, cond_then))); } cond_cases = splice(cons(symbol("cond")), cond_cases); return make_closure(symbol("args"), cons(cond_cases), e); }
int main (int argc, char **argv) { #ifdef TRUSTED_USER_SECURITY struct passwd *p = getpwuid (getuid ()); #endif int i, valid = 0; /* Read dspam.conf */ agent_config = read_config(NULL); if (!agent_config) { LOG(LOG_ERR, ERR_AGENT_READ_CONFIG); exit(EXIT_FAILURE); } if (!_ds_read_attribute(agent_config, "Home")) { LOG(LOG_ERR, ERR_AGENT_DSPAM_HOME); _ds_destroy_config(agent_config); exit(EXIT_FAILURE); } libdspam_init(_ds_read_attribute(agent_config, "StorageDriver")); #ifndef _WIN32 #ifdef TRUSTED_USER_SECURITY if (!_ds_match_attribute(agent_config, "Trust", p->pw_name) && p->pw_uid) { fprintf(stderr, ERR_TRUSTED_MODE "\n"); _ds_destroy_config(agent_config); goto BAIL; } #endif #endif for(i=0;i<argc;i++) { if (!strncmp (argv[i], "--profile=", 10)) { if (!_ds_match_attribute(agent_config, "Profile", argv[i]+10)) { LOG(LOG_ERR, ERR_AGENT_NO_SUCH_PROFILE, argv[i]+10); _ds_destroy_config(agent_config); goto BAIL; } else { _ds_overwrite_attribute(agent_config, "DefaultProfile", argv[i]+10); } break; } } signal (SIGINT, dieout); signal (SIGPIPE, dieout); signal (SIGTERM, dieout); dspam_init_driver (NULL); if (argc < 3 || !strcmp(argv[1], "help")) { usage(); } /* PREFERENCE FUNCTIONS */ if (!strncmp(argv[2], "pref", 4)) { /* Delete */ if (!strncmp(argv[1], "d", 1)) { min_args(argc, 4); valid = 1; del_preference_attribute(argv[3], argv[4]); } /* Add, Change */ if (!strncmp(argv[1], "ch", 2) || !strncmp(argv[1], "ad", 2)) { min_args(argc, 5); valid = 1; set_preference_attribute(argv[3], argv[4], argv[5]); } /* List */ if (!strncmp(argv[1], "l", 1)) { min_args(argc, 3); valid = 1; list_preference_attributes(argv[3]); } /* Aggregate - Preference attr + AllowOverride attr + user prefs */ if (!strncmp(argv[1], "ag", 2)) { min_args(argc, 3); valid = 1; list_aggregate_preference_attributes(argv[3]); } } if (!valid) usage(); dspam_shutdown_driver (NULL); _ds_destroy_config(agent_config); libdspam_shutdown(); exit (EXIT_SUCCESS); BAIL: libdspam_shutdown(); exit(EXIT_FAILURE); }