Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}