home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 22 gnu / 22-gnu.zip / rcs567s.zip / rcs / src / ms / logindos.c < prev    next >
C/C++ Source or Header  |  1994-04-08  |  3KB  |  159 lines

  1. /* getlogin for DOS */
  2.  
  3. /* NetWare code by Rich Braun @ Kronos, 1991/03/13 */
  4. /* further hacking by Paul Eggert and Frank Whaley */
  5. /* LAN Server/Manager & WfW code by Kai Uwe Rommel 1994/04/08 */
  6.  
  7. /* $Id: logindos.c,v 1.2 1992/01/06 03:18:25 eggert Exp $ */
  8.  
  9. #ifdef __32BIT__
  10.  
  11. /* dummy code for 32-bit mode */
  12.  
  13. char *getlogin()
  14. {
  15.   return (char *) 0;
  16. }
  17.  
  18. #else
  19.  
  20. /* real code for 16-bit mode */
  21.  
  22. #include <dos.h>
  23. #include <string.h>
  24.  
  25. void doscall(union REGS *regs)
  26. {
  27.   struct SREGS sregs;
  28.   segread(&sregs);
  29.   sregs.es = sregs.ds;
  30.   int86x(0x21, regs, regs, &sregs);
  31. }
  32.  
  33. /* ----- Novell NetWare ----- */
  34.  
  35. #pragma pack(1)
  36.  
  37. /* Get Connection Information E3(16) */
  38.  
  39. struct _gcireq 
  40. {
  41.   unsigned short len;
  42.   unsigned char func;
  43.   unsigned char number;
  44. };
  45.  
  46. struct _gcirep 
  47. {
  48.   unsigned short len;
  49.   unsigned long objectID;
  50.   unsigned short objecttype;
  51.   char objectname[48];
  52.   unsigned char logintime[7];
  53.   unsigned char reserved[39];
  54. };
  55.  
  56. #pragma pack()
  57.  
  58. char *nw_getlogin()
  59. {
  60.   static struct _gcirep gcirep;
  61.   static struct _gcireq gcireq;
  62.  
  63.   union REGS r;
  64.  
  65.   /* Load Get Connection Number function code.   */
  66.   r.x.ax = 0xDC00;
  67.   doscall(&r);
  68.  
  69.   if (0 < r.h.al && r.h.al <= 100)
  70.   {
  71.     /* If the connection number is in range 1-100,
  72.      * invoke Get Connection Information to get the user name. */
  73.  
  74.     gcireq.len = sizeof(gcireq) - sizeof(gcireq.len);
  75.     gcireq.func = 0x16;
  76.     gcireq.number = r.h.al;
  77.     gcirep.len = sizeof(gcirep) - sizeof(gcirep.len);
  78.  
  79.     r.h.ah = 0xE3;
  80.     r.x.si = (unsigned short) &gcireq;
  81.     r.x.di = (unsigned short) &gcirep;
  82.     doscall(&r);
  83.  
  84.     if (r.h.al == 0) 
  85.     {
  86.       strlwr(gcirep.objectname);
  87.       return gcirep.objectname;
  88.     }
  89.   }
  90.  
  91.   return 0;
  92. }
  93.  
  94. /* ----- Microsoft LAN Manager, Windows for Workgroups, IBM LAN Server ----- */
  95.  
  96. #pragma pack(1)
  97.  
  98. struct wksta_info_10
  99. {
  100.   char _far *computername;
  101.   char _far *username;
  102.   char _far *langroup;
  103.   unsigned char ver_major;
  104.   unsigned char ver_minor;
  105.   char _far *logon_domain;
  106.   char _far *oth_domains;
  107.   char filler[32];
  108. };
  109.  
  110. #pragma pack()
  111.  
  112. char *lan_getlogin()
  113. {
  114.   static struct wksta_info_10 wksta;
  115.   static char name[32];
  116.   union REGS r;
  117.  
  118.   r.x.ax = 0x5F44;
  119.   r.x.bx = 10;
  120.   r.x.cx = sizeof(wksta);
  121.   r.x.di = (unsigned short) &wksta;
  122.   doscall(&r);
  123.  
  124.   if (r.x.ax == 0 || r.x.ax == 0x5F44)
  125.   {
  126.     _fstrcpy(name, wksta.username);
  127.     strlwr(name);
  128.     return name;
  129.   }
  130.  
  131.   return 0;
  132. }
  133.  
  134. #ifdef TEST
  135.  
  136. /* ----- testing code ----- */
  137.  
  138. void main(void)
  139. {
  140.   printf("NetWare: <%s>\nLAN Manager: <%s>\n",
  141.      nw_getlogin(), lan_getlogin());
  142. }
  143.  
  144. #else
  145.  
  146. /* ----- main entry point ----- */
  147.  
  148. char *getlogin()
  149. {
  150.   char *lm = lan_getlogin();
  151.   char *nw = nw_getlogin();
  152.   return lm ? lm : nw ? nw : (char *) 0;
  153. }
  154.  
  155. #endif
  156.  
  157. #endif
  158.  
  159.