home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <ssdef.h>
- #include <syidef.h>
- #include <jpidef.h>
- #include <uaidef.h>
- #include <starlet.h>
- #include <sys/time.h>
- #include <pwd.h>
- #include <grp.h>
-
- #define BRK$C_DEVICE 1
- #define BRK$C_USERNAME 2
- #define BRK$C_ALLUSERS 3
- #define BRK$C_ALLTERMS 4
-
- struct itemdesc {
- short int buffer_length;
- short int item_code;
- char *buffer;
- short int *ret_length;
- };
-
- static int debug = 0;
-
- static struct passwd password_struct;
- static char login_name[64] = "";
- static char login_password[64] = "";
- static char login_comment[64] = "";
- static char login_gecos[64] = "";
- static char login_dir[64] = "";
- static char login_shell[64] = "";
- static int login_priv[2];
-
- char *getlogin()
- {
- char *cuserid(), *p;
- p = cuserid(login_name);
- for(;*p != '\0';p++) if ((*p >= 'A') && (*p <= 'Z')) *p += 'a'-'A';
- return(login_name);
- }
-
- static setup_pw()
- {
- short int st, iosb[4], lgth[5];
- struct {
- struct itemdesc id[5];
- int eol;
- } itmlst;
- struct {
- int size;
- char *ptr;
- } namedesc;
- char s[64], t[64];
-
- password_struct.pw_name = login_name;
- password_struct.pw_passwd = login_password;
- password_struct.pw_comment = login_comment;
- password_struct.pw_gecos = login_gecos;
- password_struct.pw_dir = login_dir;
- password_struct.pw_shell = login_shell;
-
- itmlst.id[0].item_code = UAI$_PWD;
- itmlst.id[0].buffer_length = 8;
- itmlst.id[0].buffer = login_password;
- itmlst.id[0].ret_length = &lgth[0];
- itmlst.id[1].item_code = UAI$_DEFDIR;
- itmlst.id[1].buffer_length = 64;
- itmlst.id[1].buffer = s;
- itmlst.id[1].ret_length = &lgth[1];
- itmlst.id[2].item_code = UAI$_DEFDEV;
- itmlst.id[2].buffer_length = 64;
- itmlst.id[2].buffer = t;
- itmlst.id[2].ret_length = &lgth[2];
- itmlst.id[3].item_code = UAI$_UIC;
- itmlst.id[3].buffer_length = 4;
- itmlst.id[3].buffer = (char *)&(password_struct.pw_uid);
- itmlst.id[3].ret_length = &lgth[3];
- itmlst.id[4].item_code = UAI$_PRIV;
- itmlst.id[4].buffer_length = 8;
- itmlst.id[4].buffer = (char *)login_priv;
- itmlst.id[4].ret_length = &lgth[4];
- itmlst.eol = 0;
- namedesc.size = strlen(login_name);
- namedesc.ptr = login_name;
- if ((st=sys$getuai(0,0,&namedesc,&itmlst,0,0,0)) != SS$_NORMAL) {
- return(st);
- }
- password_struct.pw_gid = password_struct.pw_uid >> 16;
- login_password[8] = '\0';
- s[s[0]] = '\0';
- s[1] = '/';
- t[t[0]] = '\0';
- t[0] = '/';
- strcpy(login_dir,t);
- strcat(login_dir,s+1);
- login_comment[0] = '\0';
- login_gecos[0] = '\0';
- login_shell[0] = '\0';
- return(SS$_NORMAL);
- }
-
- static char result[64];
- char *crypt(key,salt)
- char *key, *salt;
- {
- short int st, iosb[4], lgth[3];
- struct {
- struct itemdesc id[3];
- int eol;
- } itmlst;
- struct {
- int size;
- char *ptr;
- } outdesc, fullnamedesc, namedesc, passwdesc;
- long encrypt, ssalt;
- char username[64];
- char *p;
-
- for(p=key;*p != '\0';p++) *p = toupper(*p);
- encrypt = 0;
- ssalt = 0;
- itmlst.id[0].item_code = UAI$_SALT;
- itmlst.id[0].buffer_length = 2;
- itmlst.id[0].buffer = (char *)&ssalt;
- itmlst.id[0].ret_length = &lgth[0];
- itmlst.id[1].item_code = UAI$_ENCRYPT;
- itmlst.id[1].buffer_length = 1;
- itmlst.id[1].buffer = (char *)&encrypt;
- itmlst.id[1].ret_length = &lgth[1];
- itmlst.id[2].item_code = UAI$_USERNAME;
- itmlst.id[2].buffer_length = 64;
- itmlst.id[2].buffer = username;
- itmlst.id[2].ret_length = &lgth[2];
- itmlst.eol = 0;
- namedesc.size = strlen(login_name);
- namedesc.ptr = login_name;
- if ((st=sys$getuai(0,0,&namedesc,&itmlst,0,0,0)) != SS$_NORMAL) {
- return((char *)st);
- }
- #if (VMSVER <= 53)
- /* undocumented library call used prior to VMS 5.4 (Purdy_V) */
- outdesc.size = 8;
- outdesc.ptr = result;
- passwdesc.size = strlen(key);
- passwdesc.ptr = key;
- fullnamedesc.size = lgth[2];
- fullnamedesc.ptr = username;
- st = lgi$hpwd(&outdesc, &passwdesc, encrypt, ssalt, &fullnamedesc);
- result[8] = '\0';
- #else
- /* VMS 5.4 documented (and changed) hash_password as the right thing to do */
- passwdesc.size = strlen(key);
- passwdesc.ptr = key;
- fullnamedesc.size = lgth[2];
- fullnamedesc.ptr = username;
- st = sys$hash_password(&passwdesc, encrypt, ssalt, &fullnamedesc, &result);
- result[8] = '\0';
- #endif
- return(result);
- }
-
- struct passwd *getpwnam(name)
- char *name;
- {
- char *p;
- if (debug) fprintf(stderr,"getpwnam called name=%s\n",name);
- strcpy(login_name,name);
- for(p=login_name;*p != '\0';p++) *p = toupper(*p);
- if (setup_pw() != SS$_NORMAL) return(NULL);
- return(&password_struct);
- }
-
- struct passwd *getpwuid(uid)
- int uid;
- {
- char *getlogin();
- if (debug) fprintf(stderr,"getpwuid called uid=%d\n",uid);
- password_struct.pw_name = getlogin();
- if (setup_pw() != SS$_NORMAL) return(NULL);
- return(&password_struct);
- }
-
- struct passwd *getpwent()
- {
- char *getlogin();
- password_struct.pw_name = getlogin();
- if (setup_pw() != SS$_NORMAL) return(NULL);
- return(&password_struct);
- }
-
- setpwent()
- {
- }
-
- endpwent()
- {
- }
-
- si_setuid(uid)
- int uid;
- {
- int st;
- short i;
- struct {
- int size;
- char *ptr;
- } userdesc;
- char name[64];
- if (debug) fprintf(stderr,"setuid called uid = %d\n",uid);
- if ((uid == 0) || (uid == 1)) getpwnam("SYSTEM");
- else {
- userdesc.size = 64;
- userdesc.ptr = name;
- st = sys$idtoasc(uid,&i,&userdesc,0,0,0);
- name[16] = '\0';
- getpwnam(name);
- }
- userdesc.size = strlen(login_name);
- userdesc.ptr = login_name;
- st = sys_set_username(&userdesc);
- if (st != SS$_NORMAL) return(-1);
- st = sys_set_uic(&(password_struct.pw_uid));
- if (st != SS$_NORMAL) return(-1);
- if (debug) fprintf(stderr,"setuid succeeded\n");
- return(0);
- }
-
- seteuid(euid)
- int euid;
- {
- int st;
- short i;
- struct {
- int size;
- char *ptr;
- } userdesc;
- char name[64];
- if (debug) fprintf(stderr,"seteuid called uid = %d\n",euid);
- if ((euid == 0) || (euid == 1)) getpwnam("SYSTEM");
- else {
- userdesc.size = 64;
- userdesc.ptr = name;
- st = sys$idtoasc(euid,&i,&userdesc,0,0,0);
- name[16] = '\0';
- getpwnam(name);
- }
- userdesc.size = strlen(login_name);
- userdesc.ptr = login_name;
- st = sys_set_username(&userdesc);
- if (st != SS$_NORMAL) return(-1);
- st = sys_set_uic(&(password_struct.pw_uid));
- if (st != SS$_NORMAL) return(-1);
- if (debug) fprintf(stderr,"seteuid succeeded\n");
- return(0);
- }
-
- setruid(uid)
- int uid;
- {
- int st;
- short i;
- struct {
- int size;
- char *ptr;
- } userdesc;
- char name[64];
- if (debug) fprintf(stderr,"setruid called uid = %d\n",uid);
- if ((uid == 0) || (uid == 1)) getpwnam("SYSTEM");
- else {
- userdesc.size = 64;
- userdesc.ptr = name;
- st = sys$idtoasc(uid,&i,&userdesc,0,0,0);
- name[16] = '\0';
- getpwnam(name);
- }
- userdesc.size = strlen(login_name);
- userdesc.ptr = login_name;
- st = sys_set_username(&userdesc);
- if (st != SS$_NORMAL) return(-1);
- st = sys_set_uic(&(password_struct.pw_uid));
- if (st != SS$_NORMAL) return(-1);
- if (debug) fprintf(stderr,"setruid succeeded\n");
- return(0);
- }
-
- si_setgid(gid)
- int gid;
- {
- if (debug) fprintf(stderr,"setgid called gid = %d\n",gid);
- return(0);
- }
-
- static char pwd[12];
- char *getpass(prompt)
- char * prompt;
- {
- set_noecho();
- printf("%s",prompt);
- gets(pwd);
- set_echo();
- return(pwd);
- }
-
- getdechostname(name, namelen)
- char *name;
- int namelen;
- {
- struct {
- struct itemdesc id;
- int eol;
- } itmlst;
- unsigned short int iosb[4];
- short int st, lgth, i;
- itmlst.id.item_code = SYI$_NODENAME;
- itmlst.id.buffer_length = namelen;
- itmlst.id.buffer = name;
- itmlst.id.ret_length = &lgth;
- itmlst.eol = 0;
- if ((st=sys$getsyiw(0,0,0,&itmlst,iosb,0,0)) != SS$_NORMAL) return(st);
- name[lgth] = '\0';
- for (i=0;i < lgth;i++) if ((name[i] >= 'A') && (name[i] <= 'Z')) name[i] += 'a'-'A';
- return(0);
- }
-
- getitimer(which, value)
- int which;
- struct itimerval *value;
- {
- return(-1);
- }
-
- setitimer(which, value, ovalue)
- int which;
- struct itimerval *value, *ovalue;
- {
- return(-1);
- }
-
- gettimeofday(tp,tzp)
- struct timeval *tp;
- struct timezone *tzp;
- {
- if (tp != NULL) {
- tp->tv_sec = time(0);
- tp->tv_usec = 0;
- }
- if (tzp != NULL) {
- tzp->tz_minuteswest = 0;
- tzp->tz_dsttime = 0;
- }
- return(0);
- }
-
- getusertty(name, tty)
- char *name, *tty;
- {
- struct {
- struct itemdesc id[3];
- int eol;
- } itmlst;
- unsigned short int iosb[4];
- char uname[12], sname[12], stty[7], *p, *q;
- short int i, st, lgth1, lgth2, lgth3;
- int pid, mode;
- for (p=name,q=uname;*p != '\0';p++,q++)
- if ((*p >= 'a') && (*p <= 'z')) *q = *p-'a'+'A'; else *q = *p;
- for (i=0;i<12-strlen(p);i++,q++) *q = ' ';
- itmlst.id[0].item_code = JPI$_TERMINAL;
- itmlst.id[0].buffer_length = 7;
- itmlst.id[0].buffer = stty;
- itmlst.id[0].ret_length = &lgth1;
- itmlst.id[1].item_code = JPI$_USERNAME;
- itmlst.id[1].buffer_length = 12;
- itmlst.id[1].buffer = sname;
- itmlst.id[1].ret_length = &lgth2;
- itmlst.id[2].item_code = JPI$_MODE;
- itmlst.id[2].buffer_length = 4;
- itmlst.id[2].buffer = (char *)&mode;
- itmlst.id[2].ret_length = &lgth3;
- itmlst.eol = 0;
- pid = -1;
- while (1) {
- if ((st=sys$getjpiw(0,&pid,0,&itmlst,iosb,0,0)) == SS$_NOMOREPROC) {
- return(-1);
- }
- if ((st == SS$_NORMAL) && (strncmp(sname,uname,12) == 0) && (mode == 3)) {
- strncpy(tty,stty,lgth1);
- tty[lgth1] = '\0';
- return(0);
- }
- }
- }
-
- sendmsguser(s,t)
- char *s, *t;
- {
- unsigned short int iosb[4];
- short int st, i;
- char upname[16], *p;
- struct {
- int length;
- char *ptr;
- } msgdesc, senddesc;
- strcpy(upname,t);
- for (p=upname;*p != '\0';p++) if ((*p >= 'a') && (*p <= 'z')) *p -= 'a'-'A';
- msgdesc.length = strlen(s);
- msgdesc.ptr = s;
- senddesc.length = strlen(upname);
- senddesc.ptr = upname;
- if ((st= sys$brkthruw(0,&msgdesc,&senddesc,BRK$C_USERNAME,iosb,0,0,0,0,0,0))
- != SS$_NORMAL) {
- return(-1);
- }
- return(0);
- }
-
- sendmsgtty(s,t)
- char *s, *t;
- {
- unsigned short int iosb[4];
- short int st;
- struct {
- int length;
- char *ptr;
- } msgdesc, senddesc;
- msgdesc.length = strlen(s);
- msgdesc.ptr = s;
- senddesc.length = strlen(t);
- senddesc.ptr = t;
- if ((st= sys$brkthruw(0,&msgdesc,&senddesc,BRK$C_DEVICE,iosb,0,0,0,0,0,0))
- != SS$_NORMAL) {
- return(-1);
- }
- return(0);
- }
-
- getdtablesize()
- {
- return(30);
- }
-
- getpagesize()
- {
- return(512);
- }
-
- struct group *getgrent()
- {
- return(NULL);
- }
-
- struct group *getgrgid(gid)
- int gid;
- {
- return(NULL);
- }
-
- struct group *getgrnam(name)
- char *name;
- {
- return(NULL);
- }
-
- setgrent()
- {
- }
-
- endgrent()
- {
- }
-
- initgroups(name,basegid)
- char *name;
- int basegid;
- {
- }
-
- getgroups(gidsetlen, gidset)
- int gidsetlen, *gidset;
- {
- return(1);
- }
-
-