summaryrefslogtreecommitdiffstats
path: root/driver/vms-getpwnam.c
diff options
context:
space:
mode:
Diffstat (limited to 'driver/vms-getpwnam.c')
-rw-r--r--driver/vms-getpwnam.c129
1 files changed, 129 insertions, 0 deletions
diff --git a/driver/vms-getpwnam.c b/driver/vms-getpwnam.c
new file mode 100644
index 0000000..ec0650c
--- /dev/null
+++ b/driver/vms-getpwnam.c
@@ -0,0 +1,129 @@
+/*
+ * 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 <stdio.h>
+#include <descrip.h>
+#include <uaidef.h>
+#include <string.h>
+#include <stdlib.h>
+#include <starlet.h>
+#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);
+}