home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / lan / alogin12 / alogin.c next >
C/C++ Source or Header  |  1989-10-13  |  6KB  |  269 lines

  1.  
  2. #include <ctype.h>
  3. #include <stdlib.h>
  4. #include <dos.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <conio.h>
  8.  
  9. /* LANOS defined device types (for use() function)  */
  10. #define PRINTER  3
  11. #define DRIVE    4
  12.  
  13. static union REGS rg;
  14. struct SREGS sg;
  15.  
  16. char far *error, far *eptr;
  17. char err[120], *bptr;
  18.  
  19. char buf[81];
  20. char garb[80];
  21.  
  22. FILE *fp;
  23.  
  24.  
  25. main()
  26. {
  27. char user[17];
  28. char pswrd[17];
  29. char filename[23];
  30. char bool;
  31. int pos, pos1, ch, n;
  32.  
  33.    /*  Print logo, get user name and password  */
  34.    printf("          --- AutoLogin 1.1 for LANtastic (tm) ---");
  35.    printf("\n                    by J Gerring\n");
  36.    printf("\nEnter username: ");
  37.    scanf("%s",user);
  38.  
  39.    /* get password (a little more complicated that you might think!)  */
  40.    printf("password: ");
  41.    pos = 0;
  42.    ch = getch();
  43.    while (1) {
  44.       if (ch == 13)
  45.      break;
  46.       if (isgraph(ch)) {
  47.     putchar('*');
  48.     pswrd[pos++] = ch;
  49.     }
  50.       else if (ch == '\b' && pos != 0) {
  51.     pswrd[--pos] = '\0';
  52.     printf("\b \b");
  53.     }
  54.       ch = getch();
  55.       }
  56.    pswrd[pos] = '\0';
  57.    towupper(user);
  58.  
  59.    /* set up filename, open the user's file */
  60.    strcpy(filename,"\\LANTASTI\\");
  61.    if ((pos = strlen(user)) >= 9) {       /* if username is > 9  use first 4   */
  62.       strncat(filename, user, 4);         /* characters and last 4 characters  */
  63.       strncat(filename, (user+pos-4), 4);
  64.       }
  65.    else
  66.       strcat(filename, user);
  67.    strcat(filename, ".DAT");
  68.    if ((fp = fopen(filename, "r")) == NULL) {
  69.       printf("\n\n\aERROR: Cannot open file - %s... Exiting Login\n\n", filename);
  70.       exit(1);
  71.       }
  72.  
  73.    /* read file, take indicated action. */
  74.    printf("\nLogging in to all defined servers for your username...\n");
  75.    bool = 0;
  76.    for(;;) {
  77.       /* read line of input from user's file */
  78.       if (!fill_buf()) {
  79.      if (!bool)
  80.         printf("\n\aWarning: no data found in file %s\n",filename);
  81.      printf("\nLogin finished!\n\n");
  82.      fclose(fp);
  83.      exit(0);
  84.      }
  85.      bool = 1;
  86.      switch (*buf) {
  87.         case 'L' : login(user,pswrd);
  88.                    break;
  89.         case 'U' : use();
  90.                    break;
  91.         case ';' : break;        /* ignore comment lines */
  92.  
  93.         default  : printf("\n\aError: invalid command statment ->%s<-\n",buf);
  94.                    break;
  95.         }
  96.      }
  97. }
  98.  
  99.  
  100. login(user,pswrd)
  101. char *user, *pswrd;
  102. {
  103. char login[52];
  104. char server[17];
  105. int pos, pos1, ch, i, ad_no;
  106.  
  107.    ad_no=4;         /* initialize adapter number */
  108.  
  109.    /* log into server name found in current line of user's data file */
  110.    if (sscanf(buf, "LOGIN %s%s", server, garb) != 1)
  111.       if ((i =sscanf(buf, "LOGIN %s%d", server, &ad_no)) != 2) {
  112.          printf("\n\aWarning: Badly formatted LOGIN statement ->%s<-", buf);
  113.          return(1);
  114.          }
  115.  
  116.    /* check for valid adapter number.  4 indicates none specified */
  117.    if (ad_no < 0 || ad_no > 4) {
  118.       printf("\n\aWarning: Invalid adapter number specified ->%s<-",buf);
  119.       return(1);
  120.       }
  121.  
  122.    /* set up login string and do interrupt  */
  123.    strcpy(login,"\\\\");
  124.    strcat(login,server);
  125.    strcat(login,"\\");
  126.    strcat(login,user);
  127.    pos=strlen(login);
  128.    login[pos]='*';
  129.    login[pos+1]='\0';
  130.    strcat(login,pswrd);
  131.    pos1=strlen(login);
  132.    login[pos]=0;
  133.    login[pos1+1]=0;
  134.  
  135.    /* ad_no == 4 => no ad. no. specified, try login on all possible adapters */
  136.    if (ad_no == 4)
  137.       for (i=0; i <= 3; i++) {
  138.          rg.x.ax=0x5f81;
  139.          rg.x.di=(unsigned int)login;
  140.          rg.h.bl=i;
  141.          segread(&sg);
  142.          sg.es=sg.ds;
  143.          intdosx(&rg,&rg,&sg);
  144.          if (rg.x.cflag && rg.x.ax == 0x35)    /* break if error is other than  */
  145.             ;                                  /*  "Cannot locate network name" */
  146.          else
  147.             break;
  148.          }
  149.    else {
  150.       rg.x.ax=0x5f81;
  151.       rg.x.di=(unsigned int)login;
  152.       rg.h.bl=ad_no;
  153.       segread(&sg);
  154.       sg.es=sg.ds;
  155.       intdosx(&rg,&rg,&sg);
  156.       }
  157.  
  158.       if (!rg.x.cflag)
  159.          printf("\nLogged into: %-s",server);
  160.       else {
  161.          get_err();
  162.          printf("\nError logging into %-s -> %s",server,err);
  163.          }
  164. }
  165.  
  166.  
  167. use()
  168. {
  169. char locname[17], netname[129];
  170. int type;
  171.  
  172.    /* get local device to redirect and network device name */
  173.    if (sscanf(buf, "USE %s%s%s", locname, netname, garb) != 2) {
  174.       printf("\n\aWarning: Badly fomatted USE statement ->%s<-", buf);
  175.       return(1);
  176.       }
  177.  
  178.    /* decide type of use, set up registers, do interrupt */
  179.    if (strncmp(locname, "PRN", 3) == 0 || strncmp(locname, "LPT", 3) == 0)
  180.       type = PRINTER;
  181.    else
  182.       type = DRIVE;
  183.  
  184.    rg.x.ax=0x5f03;
  185.    rg.h.bl=type;
  186.    rg.x.cx=0;
  187.    rg.x.si=(unsigned int)locname;
  188.    rg.x.di=(unsigned int)netname;
  189.    segread(&sg);
  190.    sg.es=sg.ds;
  191.    intdosx(&rg,&rg,&sg);
  192.  
  193.    /* if carry flag set == error, give message  */
  194.    if (!rg.x.cflag)
  195.       printf("\nDevice %-s redirected to %-s ",locname, netname);
  196.    else {
  197.       get_err();
  198.       printf("\nError redirecting %-s -> %s",locname,err);
  199.       }
  200.  
  201. }
  202.  
  203.  
  204. /* get_err() - Expand LANOS error code to string */
  205. get_err()
  206. {
  207.    /* set up the registers */
  208.    rg.x.bx = rg.x.ax;
  209.    rg.h.al = (unsigned char)rg.x.ax;
  210.    rg.h.ah = 5;                         /* 5 = LANOS funct # to expand error number */
  211.    segread(&sg);
  212.    sg.es=sg.ds;
  213.    int86x(0x2f,&rg,&rg,&sg);
  214.  
  215.    /* ES:DI now points to a read only string containing expanded error message */
  216.    FP_SEG(error) = sg.es;
  217.    FP_OFF(error) = rg.x.di;
  218.    eptr = error;
  219.    bptr = err;
  220.    do {                 /* read system string to local buffer */
  221.       *bptr = *eptr;
  222.       ++bptr;
  223.       ++eptr;
  224.       } while (*eptr != '\0');
  225.    *bptr = '\0';
  226. }
  227.  
  228.  
  229. /* convert entire word to uppercase  */
  230. towupper(wrd)
  231. char *wrd;
  232. {
  233.    do {
  234.    *wrd = toupper(*wrd);
  235.    ++wrd;
  236.       } while (*wrd != '\0');
  237.  
  238. }
  239.  
  240.  
  241. /* fill_buf - read a line from user's data file into global BUF
  242.       returns: 0 - if EOF encountered
  243.            1 - if buffer was filled                          */
  244. int fill_buf()
  245. {
  246.    int ch, pos;
  247.  
  248.    /* initialize buffer */
  249.    for (pos = 0; pos <= sizeof(buf); pos++)
  250.       buf[pos] = '\0';
  251.  
  252.    /* skip white space */
  253.    do {
  254.       ch = fgetc(fp);
  255.       } while (isspace(ch));
  256.    if (ch == EOF)
  257.      return 0;
  258.  
  259.    pos = 0;
  260.    while (ch != '\n') {
  261.       buf[pos++] = ch;
  262.       ch = fgetc(fp);
  263.       }
  264.    towupper(buf);
  265.    return 1;
  266. }
  267.  
  268.  
  269.