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.