ftp.nice.ch/pub/next/developer/objc/appkit/RemoteCommand.1.s.tar.gz#/RemoteCommand1/execServer.subproj/userInfo.c

This is userInfo.c in view mode; [Download] [Up]

// -------------------------------------------------------------------------------------
// user information functions
// -------------------------------------------------------------------------------------
// Permission is granted to freely redistribute this source code, and to use fragments
// of this code in your own applications if you find them to be useful.  This class/module,
// along with the source code, come with no warranty of any kind, and the user assumes
// all responsibility for its use.
// -------------------------------------------------------------------------------------

#import <stdio.h>
#import <string.h>
#import <ctype.h>
#import <libc.h>
#import <pwd.h>
#import <sys/types.h>
#import <sys/stat.h>
#import <sys/param.h>
#import <sys/dir.h>
#import <mach/cthreads.h>
#import <mach/mach_traps.h>

// -----------------------------------------------------------------------------------------
// future use
#define	userLOCK		/* no-op */
#define	userUNLOCK		/* no-op */

// -----------------------------------------------------------------------------------------
// XUserGetpwnam() and XUserGetpwuid() are NOT thread safe!

/* wrapper for getpwnam */
struct passwd *XUserGetpwnam(const char *name)
{
	struct passwd	*pw;
	userLOCK;
	pw = name? getpwnam(name) : getpwuid(getuid());
	userUNLOCK;
	return pw;
}

/* wrapper for getpwuid */
struct passwd *XUserGetpwuid(uid_t uid)
{
	struct passwd	*pw;
	userLOCK;
	pw = getpwuid(uid);
	userUNLOCK;
	return pw;
}

// -----------------------------------------------------------------------------------------

/* return true if euid == root */
int XUserIsRootEuid()
{
	int	isRoot;
	userLOCK;
	isRoot = (getpwnam("root")->pw_uid == geteuid())? 1 : 0;
	userUNLOCK;
	return isRoot;
}

// -----------------------------------------------------------------------------------------

/* return true if user is valid */
int XUserIsValid(const char *user)
{
	struct passwd	*pw;
	userLOCK;
	pw = user? getpwnam((char*)user) : getpwuid(getuid());
	userUNLOCK;
	return pw? 1: 0;
}

/* return current user name */
char *XUserRealName(const char *user, char *realName)
{
	char	*rtn = (char*)NULL;
	if (realName) {
		struct passwd *pw;
		userLOCK;
		if (!(pw = user? getpwnam((char*)user) : getpwuid(getuid()))) *realName = 0;
		else {
			char *bp = realName, *gp = pw->pw_gecos;
			while (*gp == '*') gp++;
			while (*gp && (*gp != ',')) *bp++ = *gp++;
			*bp = 0;
			rtn = realName;
		}
		userUNLOCK;
	}
	return rtn;
}

/* return user uid */
uid_t XUserUid(const char *userName)
{
	uid_t	uid = -1;
	if (userName) {
		struct passwd *pw;
		userLOCK;
		if (pw = getpwnam(userName)) uid = pw->pw_uid;
		userUNLOCK;
	}
	return uid;
}

/* return user home directory */
char *XUserHomeDirectory(const char *user, char *dir)
{
	char	*rtn = (char*)NULL;
	if (dir) {
		struct passwd *pw;
		userLOCK;
		if (!(pw = user? getpwnam((char*)user) : getpwuid(getuid()))) *dir = 0;
		else rtn = strcpy(dir, pw->pw_dir);
		userUNLOCK;
	}
	return rtn;
}

/* return current user name */
char *XMyUserName(char *userName)
{
	char	*rtn = (char*)NULL;
	if (userName) {
		struct passwd *pw;
		userLOCK;
		if (!(pw = getpwuid(getuid()))) *userName = 0;
		else rtn = strcpy(userName, pw->pw_name);
		userUNLOCK;
	}
	return rtn;
}

/* return true if specified user is current user */
int XIsCurrentUser(const char *userName)
{
	int	isCurrent = 0;
	if (userName) {
		struct passwd *pw;
		userLOCK;
		if ((pw = getpwnam(userName)) && (pw->pw_uid == getuid())) isCurrent = 1;
		userUNLOCK;
	}
	return isCurrent;
}

/* verify user password */
int XUserVerifyPassword(const char *user, const char *password)
{
	int				ok = 0;
	struct passwd	*pw;
	userLOCK;
	if (user && (pw = getpwnam((char*)user)) && pw->pw_passwd && *pw->pw_passwd &&
		!strcmp(crypt((char*)password, pw->pw_passwd), pw->pw_passwd)) ok = 1;
	userUNLOCK;
	return ok;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.