PAM_EXTERN int pam_sm_open_session(pam_handle_t *pamh, int flags, int argc, const char **argv) { int retval = PAM_IGNORE; gray_slist_t slist; cntl_flags = 0; debug_level = 0; gray_log_init(0, MODULE_NAME, LOG_AUTHPRIV); gray_parseopt(pam_opt, argc, argv); if (la_str) { double max_la, la; if (fpread(la_str, &max_la)) return PAM_SERVICE_ERR; if (get_la(&la) == 0 && la >= max_la) { _pam_log(LOG_ERR, "load average too high: %.2g >= %.2g", la, max_la); return PAM_IGNORE; } } if (motd_file_name) { char *file; slist = gray_slist_create(); gray_expand_string(pamh, motd_file_name, slist); gray_slist_append_char(slist, 0); file = gray_slist_finish(slist); retval = read_file(pamh, file); gray_slist_free(&slist); } else if (optindex >= 0) { int i; char **xargv; argc -= optindex; argv += optindex; if (!argc) { _pam_log(LOG_INFO, "empty command line"); return retval; } xargv = gray_malloc((argc + 1) * sizeof (xargv[0])); slist = gray_slist_create(); for (i = 0; i < argc; i++) { gray_expand_string(pamh, argv[i], slist); gray_slist_append_char(slist, 0); xargv[i] = gray_slist_finish(slist); } xargv[i] = NULL; retval = exec_file(pamh, xargv, logfile_name); free(xargv); gray_slist_free(&slist); } else _pam_log(LOG_ERR, "invalid usage: either file or exec must be specified"); return retval; }
static void d_compact1(void) { register int b, i; VMHEAD HUGE *v; #ifdef NO_ALLOCA char dbuf[NO_ALLOCA]; unsigned bufsiz = NO_ALLOCA; #else char *dbuf; unsigned bufsiz = 2048; #endif long la = -1L, get_la(); unsigned int n; MAX_SIZ_TYP m; FNAME(d_compact1); #ifndef NO_ALLOCA while (NULL == (dbuf = alloca(bufsiz))) bufsiz /= 2; #endif for (b=0 ; b != VMBASESIZ && (v=VMbase[b]) ; ++b) for (i=b?0:1 ; i != VMLEGSIZ ; ++i) if (v[i].type & MT_MEMORY && v[i].diskadd != -1L) { if (la == -1L || v[i].diskadd < la) la = v[i].diskadd; v[i].diskadd = -1L; v[i].type |= MT_DIRTY; DMnfree += v[i].size; } la = get_la(la); while (v = get_dmem(la)) { n = bufsiz < v->size ? bufsiz : v->size; m = v->size; while (m) { n = n > m ? m : n; if (-1L == lseek(DMhandle, v->diskadd+v->size-m, SEEK_SET)) error(fun, "lseek"); if (n != read(DMhandle, dbuf, n)) error(fun, "read"); if (-1L == lseek(DMhandle, la+v->size-m, SEEK_SET)) error(fun, "lseek"); if (n != write(DMhandle, dbuf, n)) error(fun, "write"); m -= n; } v->diskadd = la; la += v->size; } dfree_free(); dfree_new(); DMflist->nfree[0] = DMnfree; DMflist->diskaddr[0] = la; DMnfblks = 1; }