home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1995 April / Internet Tools.iso / osi / isode / vmsisode / vmsisode80_tar.Z / vmsisode80_tar / sockit / source / get.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-09-24  |  10.5 KB  |  484 lines

  1. #include <stdio.h>
  2. #include <ssdef.h>
  3. #include <syidef.h>
  4. #include <jpidef.h>
  5. #include <uaidef.h>
  6. #include <starlet.h>
  7. #include <sys/time.h>
  8. #include <pwd.h>
  9. #include <grp.h>
  10.  
  11. #define    BRK$C_DEVICE    1
  12. #define    BRK$C_USERNAME    2
  13. #define    BRK$C_ALLUSERS    3
  14. #define    BRK$C_ALLTERMS    4
  15.  
  16. struct itemdesc {
  17.   short int buffer_length;
  18.   short int item_code;
  19.   char *buffer;
  20.   short int *ret_length;
  21.   };
  22.  
  23. static int debug = 0;
  24.  
  25. static struct passwd password_struct;
  26. static char login_name[64] = "";
  27. static char login_password[64] = "";
  28. static char login_comment[64] = "";
  29. static char login_gecos[64] = "";
  30. static char login_dir[64] = "";
  31. static char login_shell[64] = "";
  32. static int login_priv[2];
  33.  
  34. char *getlogin()
  35. {
  36.    char *cuserid(), *p;
  37.    p = cuserid(login_name);
  38.    for(;*p != '\0';p++) if ((*p >= 'A') && (*p <= 'Z')) *p += 'a'-'A';
  39.    return(login_name);
  40. }
  41.  
  42. static setup_pw()
  43. {
  44.    short int st, iosb[4], lgth[5];
  45.    struct {
  46.       struct itemdesc id[5];
  47.       int eol;
  48.    } itmlst;
  49.    struct {
  50.       int size;
  51.       char *ptr;
  52.    } namedesc;
  53.    char s[64], t[64];
  54.  
  55.    password_struct.pw_name = login_name;
  56.    password_struct.pw_passwd = login_password;
  57.    password_struct.pw_comment = login_comment;
  58.    password_struct.pw_gecos = login_gecos;
  59.    password_struct.pw_dir = login_dir;
  60.    password_struct.pw_shell = login_shell;
  61.  
  62.    itmlst.id[0].item_code = UAI$_PWD;
  63.    itmlst.id[0].buffer_length = 8;
  64.    itmlst.id[0].buffer = login_password;
  65.    itmlst.id[0].ret_length = &lgth[0];
  66.    itmlst.id[1].item_code = UAI$_DEFDIR;
  67.    itmlst.id[1].buffer_length = 64;
  68.    itmlst.id[1].buffer = s;
  69.    itmlst.id[1].ret_length = &lgth[1];
  70.    itmlst.id[2].item_code = UAI$_DEFDEV;
  71.    itmlst.id[2].buffer_length = 64;
  72.    itmlst.id[2].buffer = t;
  73.    itmlst.id[2].ret_length = &lgth[2];
  74.    itmlst.id[3].item_code = UAI$_UIC;
  75.    itmlst.id[3].buffer_length = 4;
  76.    itmlst.id[3].buffer = (char *)&(password_struct.pw_uid);
  77.    itmlst.id[3].ret_length = &lgth[3];
  78.    itmlst.id[4].item_code = UAI$_PRIV;
  79.    itmlst.id[4].buffer_length = 8;
  80.    itmlst.id[4].buffer = (char *)login_priv;
  81.    itmlst.id[4].ret_length = &lgth[4];
  82.    itmlst.eol = 0;
  83.    namedesc.size = strlen(login_name);
  84.    namedesc.ptr = login_name;
  85.    if ((st=sys$getuai(0,0,&namedesc,&itmlst,0,0,0)) != SS$_NORMAL) {
  86.       return(st);
  87.    }
  88.    password_struct.pw_gid = password_struct.pw_uid >> 16;
  89.    login_password[8] = '\0';
  90.    s[s[0]] = '\0';
  91.    s[1] = '/';
  92.    t[t[0]] = '\0';
  93.    t[0] = '/';
  94.    strcpy(login_dir,t);
  95.    strcat(login_dir,s+1);
  96.    login_comment[0]  = '\0';
  97.    login_gecos[0]    = '\0';
  98.    login_shell[0]    = '\0';
  99.    return(SS$_NORMAL);
  100.  }
  101.  
  102. static char result[64];
  103. char *crypt(key,salt)
  104. char *key, *salt;
  105. {
  106.    short int st, iosb[4], lgth[3];
  107.    struct {
  108.       struct itemdesc id[3];
  109.       int eol;
  110.    } itmlst;
  111.    struct {
  112.       int size;
  113.       char *ptr;
  114.    } outdesc, fullnamedesc, namedesc, passwdesc;
  115.    long encrypt, ssalt;
  116.    char username[64];
  117.    char *p;
  118.  
  119.    for(p=key;*p != '\0';p++) *p = toupper(*p);
  120.    encrypt = 0;
  121.    ssalt = 0;
  122.    itmlst.id[0].item_code = UAI$_SALT;
  123.    itmlst.id[0].buffer_length = 2;
  124.    itmlst.id[0].buffer = (char *)&ssalt;
  125.    itmlst.id[0].ret_length = &lgth[0];
  126.    itmlst.id[1].item_code = UAI$_ENCRYPT;
  127.    itmlst.id[1].buffer_length = 1;
  128.    itmlst.id[1].buffer = (char *)&encrypt;
  129.    itmlst.id[1].ret_length = &lgth[1];
  130.    itmlst.id[2].item_code = UAI$_USERNAME;
  131.    itmlst.id[2].buffer_length = 64;
  132.    itmlst.id[2].buffer = username;
  133.    itmlst.id[2].ret_length = &lgth[2];
  134.    itmlst.eol = 0;
  135.    namedesc.size = strlen(login_name);
  136.    namedesc.ptr = login_name;
  137.    if ((st=sys$getuai(0,0,&namedesc,&itmlst,0,0,0)) != SS$_NORMAL) {
  138.       return((char *)st);
  139.    }
  140. #if (VMSVER <= 53)
  141. /* undocumented library call used prior to VMS 5.4 (Purdy_V) */
  142.    outdesc.size = 8;
  143.    outdesc.ptr = result;
  144.    passwdesc.size = strlen(key);
  145.    passwdesc.ptr = key;
  146.    fullnamedesc.size = lgth[2];
  147.    fullnamedesc.ptr = username;
  148.    st = lgi$hpwd(&outdesc, &passwdesc, encrypt, ssalt, &fullnamedesc);
  149.    result[8] = '\0';
  150. #else
  151. /* VMS 5.4 documented (and changed) hash_password as the right thing to do */
  152.    passwdesc.size = strlen(key);
  153.    passwdesc.ptr = key;
  154.    fullnamedesc.size = lgth[2];
  155.    fullnamedesc.ptr = username;
  156.    st = sys$hash_password(&passwdesc, encrypt, ssalt, &fullnamedesc, &result);
  157.    result[8] = '\0';
  158. #endif
  159.    return(result);
  160. }
  161.  
  162. struct passwd *getpwnam(name)
  163. char *name;
  164. {
  165.    char *p;
  166. if (debug) fprintf(stderr,"getpwnam called name=%s\n",name);
  167.    strcpy(login_name,name);
  168.    for(p=login_name;*p != '\0';p++) *p = toupper(*p);
  169.    if (setup_pw() != SS$_NORMAL) return(NULL);
  170.    return(&password_struct);
  171. }
  172.  
  173. struct passwd *getpwuid(uid)
  174. int uid;
  175. {
  176.    char *getlogin();
  177. if (debug) fprintf(stderr,"getpwuid called uid=%d\n",uid);
  178.    password_struct.pw_name = getlogin();
  179.    if (setup_pw() != SS$_NORMAL) return(NULL);
  180.    return(&password_struct);
  181. }
  182.  
  183. struct passwd *getpwent()
  184. {
  185.    char *getlogin();
  186.    password_struct.pw_name = getlogin();
  187.    if (setup_pw() != SS$_NORMAL) return(NULL);
  188.    return(&password_struct);
  189. }
  190.  
  191. setpwent()
  192. {
  193. }
  194.  
  195. endpwent()
  196. {
  197. }
  198.  
  199. si_setuid(uid)
  200. int uid;
  201. {
  202.   int st;
  203.   short i;
  204.   struct {
  205.      int size;
  206.      char *ptr;
  207.   } userdesc;
  208.   char name[64];
  209. if (debug) fprintf(stderr,"setuid called uid = %d\n",uid);
  210.   if ((uid == 0) || (uid == 1)) getpwnam("SYSTEM");
  211.   else {
  212.      userdesc.size = 64;
  213.      userdesc.ptr = name;
  214.      st = sys$idtoasc(uid,&i,&userdesc,0,0,0);
  215.      name[16] = '\0';
  216.      getpwnam(name);
  217.   }
  218.   userdesc.size = strlen(login_name);
  219.   userdesc.ptr  = login_name;
  220.   st = sys_set_username(&userdesc);
  221.   if (st != SS$_NORMAL) return(-1);
  222.   st = sys_set_uic(&(password_struct.pw_uid));
  223.   if (st != SS$_NORMAL) return(-1);
  224. if (debug) fprintf(stderr,"setuid succeeded\n");
  225.   return(0);
  226. }
  227.  
  228. seteuid(euid)
  229. int euid;
  230. {
  231.   int st;
  232.   short i;
  233.   struct {
  234.      int size;
  235.      char *ptr;
  236.   } userdesc;
  237.   char name[64];
  238. if (debug) fprintf(stderr,"seteuid called uid = %d\n",euid);
  239.   if ((euid == 0) || (euid == 1)) getpwnam("SYSTEM");
  240.   else {
  241.      userdesc.size = 64;
  242.      userdesc.ptr = name;
  243.      st = sys$idtoasc(euid,&i,&userdesc,0,0,0);
  244.      name[16] = '\0';
  245.      getpwnam(name);
  246.   }
  247.   userdesc.size = strlen(login_name);
  248.   userdesc.ptr  = login_name;
  249.   st = sys_set_username(&userdesc);
  250.   if (st != SS$_NORMAL) return(-1);
  251.   st = sys_set_uic(&(password_struct.pw_uid));
  252.   if (st != SS$_NORMAL) return(-1);
  253. if (debug) fprintf(stderr,"seteuid succeeded\n");
  254.   return(0);
  255. }
  256.  
  257. setruid(uid)
  258. int uid;
  259. {
  260.   int st;
  261.   short i;
  262.   struct {
  263.      int size;
  264.      char *ptr;
  265.   } userdesc;
  266.   char name[64];
  267. if (debug) fprintf(stderr,"setruid called uid = %d\n",uid);
  268.   if ((uid == 0) || (uid == 1)) getpwnam("SYSTEM");
  269.   else {
  270.      userdesc.size = 64;
  271.      userdesc.ptr = name;
  272.      st = sys$idtoasc(uid,&i,&userdesc,0,0,0);
  273.      name[16] = '\0';
  274.      getpwnam(name);
  275.   }
  276.   userdesc.size = strlen(login_name);
  277.   userdesc.ptr  = login_name;
  278.   st = sys_set_username(&userdesc);
  279.   if (st != SS$_NORMAL) return(-1);
  280.   st = sys_set_uic(&(password_struct.pw_uid));
  281.   if (st != SS$_NORMAL) return(-1);
  282. if (debug) fprintf(stderr,"setruid succeeded\n");
  283.   return(0);
  284. }
  285.  
  286. si_setgid(gid)
  287. int gid;
  288. {
  289. if (debug) fprintf(stderr,"setgid called gid = %d\n",gid);
  290.   return(0);
  291. }
  292.  
  293. static char pwd[12];
  294. char *getpass(prompt)
  295. char * prompt;
  296. {
  297.    set_noecho();
  298.    printf("%s",prompt);
  299.    gets(pwd);
  300.    set_echo();
  301.    return(pwd);
  302. }
  303.  
  304. getdechostname(name, namelen)
  305. char *name;
  306. int namelen;
  307. {
  308.    struct {
  309.       struct itemdesc id;
  310.       int eol;
  311.    } itmlst;
  312.    unsigned short int iosb[4];
  313.    short int st, lgth, i;
  314.    itmlst.id.item_code = SYI$_NODENAME;
  315.    itmlst.id.buffer_length = namelen;
  316.    itmlst.id.buffer = name;
  317.    itmlst.id.ret_length = &lgth;
  318.    itmlst.eol = 0;
  319.    if ((st=sys$getsyiw(0,0,0,&itmlst,iosb,0,0)) != SS$_NORMAL) return(st);
  320.    name[lgth] = '\0';
  321.    for (i=0;i < lgth;i++) if ((name[i] >= 'A') && (name[i] <= 'Z')) name[i] += 'a'-'A';
  322.    return(0);
  323. }
  324.  
  325. getitimer(which, value)
  326. int which;
  327. struct itimerval *value;
  328. {
  329.    return(-1);
  330. }
  331.  
  332. setitimer(which, value, ovalue)
  333. int which;
  334. struct itimerval *value, *ovalue;
  335. {
  336.    return(-1);
  337. }
  338.  
  339. gettimeofday(tp,tzp)
  340. struct timeval *tp;
  341. struct timezone *tzp;
  342. {
  343.    if (tp != NULL) {
  344.       tp->tv_sec = time(0);
  345.       tp->tv_usec = 0;
  346.    }
  347.    if (tzp != NULL) {
  348.       tzp->tz_minuteswest = 0;
  349.       tzp->tz_dsttime = 0;
  350.    }
  351.    return(0);
  352. }
  353.  
  354. getusertty(name, tty)
  355. char *name, *tty;
  356. {
  357.    struct {
  358.       struct itemdesc id[3];
  359.       int eol;
  360.    } itmlst;
  361.    unsigned short int iosb[4];
  362.    char uname[12], sname[12], stty[7], *p, *q;
  363.    short int i, st, lgth1, lgth2, lgth3;
  364.    int pid, mode;
  365.    for (p=name,q=uname;*p != '\0';p++,q++)
  366.     if ((*p >= 'a') && (*p <= 'z')) *q = *p-'a'+'A'; else *q = *p;
  367.    for (i=0;i<12-strlen(p);i++,q++) *q = ' ';
  368.    itmlst.id[0].item_code = JPI$_TERMINAL;
  369.    itmlst.id[0].buffer_length = 7;
  370.    itmlst.id[0].buffer = stty;
  371.    itmlst.id[0].ret_length = &lgth1;
  372.    itmlst.id[1].item_code = JPI$_USERNAME;
  373.    itmlst.id[1].buffer_length = 12;
  374.    itmlst.id[1].buffer = sname;
  375.    itmlst.id[1].ret_length = &lgth2;
  376.    itmlst.id[2].item_code = JPI$_MODE;
  377.    itmlst.id[2].buffer_length = 4;
  378.    itmlst.id[2].buffer = (char *)&mode;
  379.    itmlst.id[2].ret_length = &lgth3;
  380.    itmlst.eol = 0;
  381.    pid = -1;
  382.    while (1) {
  383.       if ((st=sys$getjpiw(0,&pid,0,&itmlst,iosb,0,0)) == SS$_NOMOREPROC) {
  384.          return(-1);
  385.       }
  386.       if ((st == SS$_NORMAL) && (strncmp(sname,uname,12) == 0) && (mode == 3)) {
  387.          strncpy(tty,stty,lgth1);
  388.          tty[lgth1] = '\0';
  389.          return(0);
  390.       }
  391.    }
  392. }
  393.  
  394. sendmsguser(s,t)
  395. char *s, *t;
  396. {
  397.    unsigned short int iosb[4];
  398.    short int st, i;
  399.    char upname[16], *p;
  400.    struct {
  401.       int length;
  402.       char *ptr;
  403.    } msgdesc, senddesc;
  404.    strcpy(upname,t);
  405.    for (p=upname;*p != '\0';p++) if ((*p >= 'a') && (*p <= 'z')) *p -= 'a'-'A';
  406.    msgdesc.length = strlen(s);
  407.    msgdesc.ptr = s;
  408.    senddesc.length = strlen(upname);
  409.    senddesc.ptr = upname;
  410.    if ((st= sys$brkthruw(0,&msgdesc,&senddesc,BRK$C_USERNAME,iosb,0,0,0,0,0,0))
  411.     != SS$_NORMAL) {
  412.       return(-1);
  413.    }
  414.    return(0);
  415. }
  416.  
  417. sendmsgtty(s,t)
  418. char *s, *t;
  419. {
  420.    unsigned short int iosb[4];
  421.    short int st;
  422.    struct {
  423.       int length;
  424.       char *ptr;
  425.    } msgdesc, senddesc;
  426.    msgdesc.length = strlen(s);
  427.    msgdesc.ptr = s;
  428.    senddesc.length = strlen(t);
  429.    senddesc.ptr = t;
  430.    if ((st= sys$brkthruw(0,&msgdesc,&senddesc,BRK$C_DEVICE,iosb,0,0,0,0,0,0))
  431.     != SS$_NORMAL) {
  432.       return(-1);
  433.    }
  434.    return(0);
  435. }
  436.  
  437. getdtablesize()
  438. {
  439.    return(30);
  440. }
  441.  
  442. getpagesize()
  443. {
  444.    return(512);
  445. }
  446.  
  447. struct group *getgrent()
  448. {
  449.    return(NULL);
  450. }
  451.  
  452. struct group *getgrgid(gid)
  453. int gid;
  454. {
  455.    return(NULL);
  456. }
  457.  
  458. struct group *getgrnam(name)
  459. char *name;
  460. {
  461.    return(NULL);
  462. }
  463.  
  464. setgrent()
  465. {
  466. }
  467.  
  468. endgrent()
  469. {
  470. }
  471.  
  472. initgroups(name,basegid)
  473. char *name;
  474. int basegid;
  475. {
  476. }
  477.  
  478. getgroups(gidsetlen, gidset)
  479. int gidsetlen, *gidset;
  480. {
  481.    return(1);
  482. }
  483.  
  484.