- (bal) Migrated AIX getuserattr and usrinfo code to

openbsd-compat/port-aix.[c] to improve readilbity of do_child() and
   simplify our diffs against upstream source.
This commit is contained in:
Ben Lindstrom 2002-02-19 20:27:55 +00:00
parent f095a85882
commit a9c039cf04
6 changed files with 142 additions and 115 deletions

View File

@ -43,8 +43,11 @@
- deraadt@cvs.openbsd.org 2002/02/19 02:50:59
[sshd_config]
stategy is not an english word
- (bal) Migrate IRIX jobs/projects/audit/etc code to
- (bal) Migrated IRIX jobs/projects/audit/etc code to
openbsd-compat/port-irix.[ch] to improve readiblity of do_child()
- (bal) Migrated AIX getuserattr and usrinfo code to
openbsd-compat/port-aix.[c] to improve readilbity of do_child() and
simplify our diffs against upstream source.
20020218
- (tim) newer config.guess from ftp://ftp.gnu.org/gnu/config/config.guess
@ -7642,4 +7645,4 @@
- Wrote replacements for strlcpy and mkdtemp
- Released 1.0pre1
$Id: ChangeLog,v 1.1866 2002/02/19 20:02:48 mouring Exp $
$Id: ChangeLog,v 1.1867 2002/02/19 20:27:55 mouring Exp $

View File

@ -1,4 +1,4 @@
# $Id: Makefile.in,v 1.20 2002/02/19 20:02:49 mouring Exp $
# $Id: Makefile.in,v 1.21 2002/02/19 20:27:57 mouring Exp $
sysconfdir=@sysconfdir@
piddir=@piddir@
@ -20,7 +20,7 @@ OPENBSD=base64.o bindresvport.o daemon.o dirname.o getcwd.o getgrouplist.o getop
COMPAT=bsd-arc4random.o bsd-cray.o bsd-cygwin_util.o bsd-misc.o bsd-nextstep.o bsd-snprintf.o bsd-waitpid.o fake-getaddrinfo.o fake-getnameinfo.o
PORTS=port-irix.o
PORTS=port-irix.o port-aix.o
.c.o:
$(CC) $(CFLAGS) $(CPPFLAGS) -c $<

View File

@ -1,4 +1,4 @@
/* $Id: openbsd-compat.h,v 1.15 2002/02/19 20:02:49 mouring Exp $ */
/* $Id: openbsd-compat.h,v 1.16 2002/02/19 20:27:57 mouring Exp $ */
#ifndef _OPENBSD_H
#define _OPENBSD_H
@ -41,5 +41,6 @@
/* Routines for a single OS platform */
#include "bsd-cray.h"
#include "port-irix.h"
#include "port-aix.h"
#endif /* _OPENBSD_H */

122
openbsd-compat/port-aix.c Normal file
View File

@ -0,0 +1,122 @@
#include "includes.h"
#ifdef _AIX
#include <uinfo.h>
/* AIX limits */
#if defined(HAVE_GETUSERATTR) && !defined(S_UFSIZE_HARD) && defined(S_UFSIZE)
# define S_UFSIZE_HARD S_UFSIZE "_hard"
# define S_UCPU_HARD S_UCPU "_hard"
# define S_UDATA_HARD S_UDATA "_hard"
# define S_USTACK_HARD S_USTACK "_hard"
# define S_URSS_HARD S_URSS "_hard"
# define S_UCORE_HARD S_UCORE "_hard"
# define S_UNOFILE_HARD S_UNOFILE "_hard"
#endif
#if defined(HAVE_GETUSERATTR)
/*
* AIX-specific login initialisation
*/
void
set_limit(char *user, char *soft, char *hard, int resource, int mult)
{
struct rlimit rlim;
int slim, hlim;
getrlimit(resource, &rlim);
slim = 0;
if (getuserattr(user, soft, &slim, SEC_INT) != -1) {
if (slim < 0) {
rlim.rlim_cur = RLIM_INFINITY;
} else if (slim != 0) {
/* See the wackiness below */
if (rlim.rlim_cur == slim * mult)
slim = 0;
else
rlim.rlim_cur = slim * mult;
}
}
hlim = 0;
if (getuserattr(user, hard, &hlim, SEC_INT) != -1) {
if (hlim < 0) {
rlim.rlim_max = RLIM_INFINITY;
} else if (hlim != 0) {
rlim.rlim_max = hlim * mult;
}
}
/*
* XXX For cpu and fsize the soft limit is set to the hard limit
* if the hard limit is left at its default value and the soft limit
* is changed from its default value, either by requesting it
* (slim == 0) or by setting it to the current default. At least
* that's how rlogind does it. If you're confused you're not alone.
* Bug or feature? AIX 4.3.1.2
*/
if ((!strcmp(soft, "fsize") || !strcmp(soft, "cpu"))
&& hlim == 0 && slim != 0)
rlim.rlim_max = rlim.rlim_cur;
/* A specified hard limit limits the soft limit */
else if (hlim > 0 && rlim.rlim_cur > rlim.rlim_max)
rlim.rlim_cur = rlim.rlim_max;
/* A soft limit can increase a hard limit */
else if (rlim.rlim_cur > rlim.rlim_max)
rlim.rlim_max = rlim.rlim_cur;
if (setrlimit(resource, &rlim) != 0)
error("setrlimit(%.10s) failed: %.100s", soft, strerror(errno));
}
void
set_limits_from_userattr(char *user)
{
int mask;
char buf[16];
set_limit(user, S_UFSIZE, S_UFSIZE_HARD, RLIMIT_FSIZE, 512);
set_limit(user, S_UCPU, S_UCPU_HARD, RLIMIT_CPU, 1);
set_limit(user, S_UDATA, S_UDATA_HARD, RLIMIT_DATA, 512);
set_limit(user, S_USTACK, S_USTACK_HARD, RLIMIT_STACK, 512);
set_limit(user, S_URSS, S_URSS_HARD, RLIMIT_RSS, 512);
set_limit(user, S_UCORE, S_UCORE_HARD, RLIMIT_CORE, 512);
#if defined(S_UNOFILE)
set_limit(user, S_UNOFILE, S_UNOFILE_HARD, RLIMIT_NOFILE, 1);
#endif
if (getuserattr(user, S_UMASK, &mask, SEC_INT) != -1) {
/* Convert decimal to octal */
(void) snprintf(buf, sizeof(buf), "%d", mask);
if (sscanf(buf, "%o", &mask) == 1)
umask(mask);
}
}
#endif /* defined(HAVE_GETUSERATTR) */
/*
* AIX has a "usrinfo" area where logname and
* other stuff is stored - a few applications
* actually use this and die if it's not set
*/
void
aix_usrinfo(Session *s)
{
struct passwd *pw = s->pw;
u_int i;
const char *cp=NULL;
if (s->ttyfd == -1)
s->tty[0] = '\0';
cp = xmalloc(22 + strlen(s->tty) + 2 * strlen(pw->pw_name));
i = sprintf(cp, "LOGNAME=%s%cNAME=%s%cTTY=%s%c%c", pw->pw_name, 0,
pw->pw_name, 0, s->tty, 0, 0);
if (usrinfo(SETUINFO, cp, i) == -1)
fatal("Couldn't set usrinfo: %s", strerror(errno));
debug3("AIX/UsrInfo: set len %d", i);
xfree(cp);
}
#endif /* _AIX */

10
openbsd-compat/port-aix.h Normal file
View File

@ -0,0 +1,10 @@
#ifdef _AIX
#ifdef HAVE_GETUSERATTR
void set_limit(char *user, char *soft, char *hard, int resource, int mult);
void set_limits_from_userattr(char *user);
#endif /* HAVE_GETUSERATTR */
void aix_usrinfo(Session *s);
#endif /* _AIX */

111
session.c
View File

@ -67,21 +67,6 @@ RCSID("$OpenBSD: session.c,v 1.126 2002/02/14 23:28:00 markus Exp $");
#define is_winnt (GetVersion() < 0x80000000)
#endif
/* AIX limits */
#if defined(HAVE_GETUSERATTR) && !defined(S_UFSIZE_HARD) && defined(S_UFSIZE)
# define S_UFSIZE_HARD S_UFSIZE "_hard"
# define S_UCPU_HARD S_UCPU "_hard"
# define S_UDATA_HARD S_UDATA "_hard"
# define S_USTACK_HARD S_USTACK "_hard"
# define S_URSS_HARD S_URSS "_hard"
# define S_UCORE_HARD S_UCORE "_hard"
# define S_UNOFILE_HARD S_UNOFILE "_hard"
#endif
#ifdef _AIX
# include <uinfo.h>
#endif
/* types */
#define TTYSZ 64
@ -898,85 +883,6 @@ void copy_environment(char **source, char ***env, u_int *envsize)
}
}
#if defined(HAVE_GETUSERATTR)
/*
* AIX-specific login initialisation
*/
void set_limit(char *user, char *soft, char *hard, int resource, int mult)
{
struct rlimit rlim;
int slim, hlim;
getrlimit(resource, &rlim);
slim = 0;
if (getuserattr(user, soft, &slim, SEC_INT) != -1) {
if (slim < 0) {
rlim.rlim_cur = RLIM_INFINITY;
} else if (slim != 0) {
/* See the wackiness below */
if (rlim.rlim_cur == slim * mult)
slim = 0;
else
rlim.rlim_cur = slim * mult;
}
}
hlim = 0;
if (getuserattr(user, hard, &hlim, SEC_INT) != -1) {
if (hlim < 0) {
rlim.rlim_max = RLIM_INFINITY;
} else if (hlim != 0) {
rlim.rlim_max = hlim * mult;
}
}
/*
* XXX For cpu and fsize the soft limit is set to the hard limit
* if the hard limit is left at its default value and the soft limit
* is changed from its default value, either by requesting it
* (slim == 0) or by setting it to the current default. At least
* that's how rlogind does it. If you're confused you're not alone.
* Bug or feature? AIX 4.3.1.2
*/
if ((!strcmp(soft, "fsize") || !strcmp(soft, "cpu"))
&& hlim == 0 && slim != 0)
rlim.rlim_max = rlim.rlim_cur;
/* A specified hard limit limits the soft limit */
else if (hlim > 0 && rlim.rlim_cur > rlim.rlim_max)
rlim.rlim_cur = rlim.rlim_max;
/* A soft limit can increase a hard limit */
else if (rlim.rlim_cur > rlim.rlim_max)
rlim.rlim_max = rlim.rlim_cur;
if (setrlimit(resource, &rlim) != 0)
error("setrlimit(%.10s) failed: %.100s", soft, strerror(errno));
}
void set_limits_from_userattr(char *user)
{
int mask;
char buf[16];
set_limit(user, S_UFSIZE, S_UFSIZE_HARD, RLIMIT_FSIZE, 512);
set_limit(user, S_UCPU, S_UCPU_HARD, RLIMIT_CPU, 1);
set_limit(user, S_UDATA, S_UDATA_HARD, RLIMIT_DATA, 512);
set_limit(user, S_USTACK, S_USTACK_HARD, RLIMIT_STACK, 512);
set_limit(user, S_URSS, S_URSS_HARD, RLIMIT_RSS, 512);
set_limit(user, S_UCORE, S_UCORE_HARD, RLIMIT_CORE, 512);
#if defined(S_UNOFILE)
set_limit(user, S_UNOFILE, S_UNOFILE_HARD, RLIMIT_NOFILE, 1);
#endif
if (getuserattr(user, S_UMASK, &mask, SEC_INT) != -1) {
/* Convert decimal to octal */
(void) snprintf(buf, sizeof(buf), "%d", mask);
if (sscanf(buf, "%o", &mask) == 1)
umask(mask);
}
}
#endif /* defined(HAVE_GETUSERATTR) */
/*
* Performs common processing for the child, such as setting up the
* environment, closing extra file descriptors, setting the user and group
@ -1082,22 +988,7 @@ do_child(Session *s, const char *command)
irix_setusercontext(pw);
# endif /* defined(WITH_IRIX_PROJECT) || defined(WITH_IRIX_JOBS) || defined(WITH_IRIX_ARRAY) */
#ifdef _AIX
/*
* AIX has a "usrinfo" area where logname and
* other stuff is stored - a few applications
* actually use this and die if it's not set
*/
if (s->ttyfd == -1)
s->tty[0] = '\0';
cp = xmalloc(22 + strlen(s->tty) +
2 * strlen(pw->pw_name));
i = sprintf(cp, "LOGNAME=%s%cNAME=%s%cTTY=%s%c%c",
pw->pw_name, 0, pw->pw_name, 0, s->tty, 0, 0);
if (usrinfo(SETUINFO, cp, i) == -1)
fatal("Couldn't set usrinfo: %s",
strerror(errno));
debug3("AIX/UsrInfo: set len %d", i);
xfree(cp);
aix_usrinfo(s)
#endif
/* Permanently switch to the desired uid. */