/* * getpwnam(name) - retrieves a UAF entry * * Author: Patrick L. Mahan * Location: TGV, Inc * Date: 15-Nov-1991 * * Purpose: Provides emulation for the UNIX getpwname routine. * * Modification History * * Date | Who | Version | Reason * ------------+-----------+---------------+--------------------------- * 15-Nov-1991 | PLM | 1.0 | First Write */ #define PASSWDROUTINES #include #include #include #include #include #include #include "vms-pwd.h" struct uic { unsigned short uid; unsigned short gid; }; #define TEST(ptr, str) { if (ptr == NULL) { \ fprintf(stderr, "getpwnam: memory allocation failure for \"%s\"\n", \ str); \ return ((struct passwd *)(NULL)); \ } } struct passwd *getpwnam(name) char *name; { int istatus; int UserNameLen; int UserOwnerLen; int UserDeviceLen; int UserDirLen; static char UserName[13]; static char UserOwner[32]; static char UserDevice[32]; static char UserDir[64]; char *cptr, *sptr; unsigned long int UserPwd[2]; unsigned short int UserSalt; unsigned long int UserEncrypt; struct uic UicValue; struct passwd *entry; struct dsc$descriptor_s VMSNAME = {strlen(name), DSC$K_DTYPE_T, DSC$K_CLASS_S, name}; struct itmlist3 { unsigned short int length; unsigned short int item; unsigned long int addr; unsigned long int retaddr; } ItemList[] = { {12, UAI$_USERNAME, (unsigned long)&UserName, (unsigned long)&UserNameLen}, {8, UAI$_PWD, (unsigned long)&UserPwd, 0}, {4, UAI$_UIC, (unsigned long)&UicValue, 0}, {32, UAI$_OWNER, (unsigned long)&UserOwner, (unsigned long)&UserOwnerLen}, {32, UAI$_DEFDEV, (unsigned long)&UserDevice, (unsigned long)&UserDeviceLen}, {64, UAI$_DEFDIR, (unsigned long)&UserDir, (unsigned long)&UserDirLen}, {2, UAI$_SALT, (unsigned long)&UserSalt, 0}, {4, UAI$_ENCRYPT, (unsigned long)&UserEncrypt, 0}, {0, 0, 0, 0} }; UserNameLen = 0; istatus = sys$getuai (0, 0, &VMSNAME, &ItemList, 0, 0, 0); if (!(istatus & 1)) { fprintf (stderr, "getpwnam: unable to retrieve passwd entry for %s\n", name); fprintf (stderr, "getpwnam: vms error number is 0x%x\n", istatus); return ((struct passwd *)NULL); } entry = (struct passwd *) calloc (1, sizeof(struct passwd)); TEST(entry, "PASSWD_ENTRY"); entry->pw_uid = UicValue.uid; entry->pw_gid = UicValue.gid; entry->pw_salt = UserSalt; entry->pw_encrypt = UserEncrypt; sptr = UserName; cptr = calloc (UserNameLen+1, sizeof(char)); TEST(cptr, "USERNAME"); strncpy (cptr, sptr, UserNameLen); cptr[UserNameLen] = '\0'; entry->pw_name = cptr; cptr = calloc(8, sizeof(char)); TEST(cptr, "PASSWORD"); memcpy(cptr, UserPwd, 8); entry->pw_passwd = cptr; sptr = UserOwner; sptr++; cptr = calloc ((int)UserOwner[0]+1, sizeof(char)); TEST(cptr, "FULLNAME"); strncpy (cptr, sptr, (int)UserOwner[0]); cptr[(int)UserOwner[0]] = '\0'; entry->pw_gecos = cptr; cptr = calloc ((int)UserDevice[0]+(int)UserDir[0]+1, sizeof(char)); TEST(cptr, "HOME"); sptr = UserDevice; sptr++; strncpy (cptr, sptr, (int)UserDevice[0]); sptr = UserDir; sptr++; strncat (cptr, sptr, (int)UserDir[0]); cptr[(int)UserDevice[0]+(int)UserDir[0]] = '\0'; entry->pw_dir = cptr; cptr = calloc (strlen("SYS$SYSTEM:LOGINOUT.EXE")+1, sizeof(char)); TEST(cptr,"SHELL"); strcpy (cptr, "SYS$SYSTEM:LOGINOUT.EXE"); entry->pw_shell = cptr; return (entry); }