home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / modempool / part01 / dialup.c < prev    next >
C/C++ Source or Header  |  1993-04-05  |  6KB  |  267 lines

  1. /*******************************************************************
  2.  * 
  3.  * Module: @(#)dialup.c    4.2 92/04/16
  4.  *
  5.  * Description:
  6.  *    Dialup routines.
  7.  *
  8.  * Revision:
  9.  *    Date    By            Reason    
  10.  *    ----    --            ------    
  11.  *    920309    Lars Berntzon        Created
  12.  *
  13.  *******************************************************************/
  14. static char SccsId[] = "@(#)dialup.c    4.2 92/04/16";
  15.  
  16. #include <stdio.h>
  17. #ifndef NOSTDLIB
  18. #include <stdlib.h>
  19. #endif
  20. #include <unistd.h>
  21. #include <string.h>
  22. #include <signal.h>
  23. #include <fcntl.h>
  24. #include <termios.h>
  25. #include <ctype.h>
  26.  
  27. #include "modempool.h"
  28.  
  29. #ifdef RLOGIN
  30. #include <pwd.h>
  31. #endif
  32.  
  33. /*******************************************************************
  34.  *
  35.  *         callback
  36.  *        --------
  37.  *
  38.  * Description:
  39.  *    Does the actual calling.
  40.  *
  41.  *******************************************************************/
  42. callback(slot_t *sp)
  43. {
  44.     struct slot free_slot;
  45.     int main_port = 0;
  46.     int fd;
  47.     int id;
  48.     int rc;
  49.  
  50.     /*
  51.      * Find free available line.
  52.      */
  53.     slot_lock();
  54.     slot_open();
  55.     while((rc = slot_traverse(&free_slot)) == E_OK) {
  56.  
  57.     /* I will only use myself in last resort */
  58.     if (free_slot.pid == getpid()) {
  59.          continue;
  60.     }
  61.  
  62.     /* Of cause don't use a busy server */
  63.     if (free_slot.status != SLOT_FREE) {
  64.          continue;
  65.     }
  66.  
  67.     /* Maybe the port us taken by someone else, dont use it then */
  68.     if (lock_line(free_slot.line, free_slot.pid) != E_OK) {
  69.        continue;
  70.     }
  71.  
  72.     /* Now a free server is found */
  73.     break;
  74.     }
  75.  
  76.     /*
  77.      * Use myself if no other servers was found.
  78.      */
  79.     if (rc != E_OK) {
  80.     debug("callback: using myself");
  81.     memcpy(&free_slot, &slot, sizeof free_slot);
  82.     }
  83.  
  84.     mod_put(MSG_CALLING);
  85.  
  86.     /*
  87.      * Write command to slot e.i. tell server to dial.
  88.      */
  89.     free_slot.status = SLOT_BUSY;
  90.     strncpy(free_slot.phone, sp->phone, sizeof free_slot.phone);
  91.     strncpy(free_slot.name, sp->name, sizeof free_slot.name);
  92. #ifdef RLOGIN
  93.     strncpy(free_slot.host, sp->host, sizeof free_slot.host);
  94. #endif
  95.     free_slot.baud = sp->baud;
  96.     debug("calling: slotid: %d, phone: %s, name: %s, baud: %d", 
  97.     free_slot.id, free_slot.phone, free_slot.name, free_slot.baud);    
  98.  
  99.     /*
  100.      * Write the data and unlock server database.
  101.      */
  102.     slot_write(&free_slot);
  103.     slot_unlock();
  104.     
  105.     /* Send signal to server to read its database (dont signal myself) */
  106.     if (free_slot.pid != getpid()) {
  107.     kill(free_slot.pid, SIG_SERVER);
  108.     }
  109.     else {
  110.     if ( dialup() != E_OK) {
  111.         log("dialup failed");
  112.         return E_FAIL;
  113.     }
  114.     }
  115.     
  116.     return E_OK;
  117. }    
  118.  
  119. /*******************************************************************
  120.  *
  121.  *         DIALUP
  122.  *        ------
  123.  *
  124.  * Description:
  125.  *    Dials a number for this server.
  126.  *
  127.  *******************************************************************/
  128. dialup()
  129. {
  130. #ifdef RLOGIN   
  131.     char name[NAME_SIZE];    /* Temporary name        */
  132.     struct passwd *pw;        /* Pointer to passwd struct */
  133. #endif
  134.     int retry;            /* Retry counter        */
  135.     int baud = 0;        /* Connected baudrate        */
  136.     int rc;
  137.  
  138.     /* Turn of signalled flag */
  139.     signalled = 0;
  140.  
  141.     /* Hangup line before dialing */
  142.     tty_hangup();
  143.     tty_close();
  144.  
  145.     /* Wait some before dialing */
  146.     sleep(DIALUP_DELAY);
  147.  
  148.     /* Read baudrate and phone number to dial */
  149.     if (slot_read(&slot) != E_OK) {
  150.         logerr("dialup: failed to read slot");
  151.         return E_FAIL;
  152.     }
  153.     
  154.     /* log dialing */
  155.     log("dialup: dialing #%s baud %d", slot.phone, slot.baud);
  156.  
  157.     /* Open port again */
  158.     if (tty_open(portname, slot.baud, O_NDELAY) != E_OK) {
  159.     logerr("dialup: failed to open port");
  160.     return E_FAIL;
  161.     }
  162.  
  163.     /* Try three times to dialup */
  164.     for(retry = 0; retry < 3; retry++)
  165.     {
  166.         /* Send modem command */
  167.     mod_put("ATDT");
  168.     mod_put(prefix);
  169.     mod_put(slot.phone);
  170.     mod_put("\r");
  171.     
  172.     /* Expect connection in 20 sec */
  173.     rc = mod_exp(MOD_ANY, DIALUP_TMOUT);
  174.     debug("dial: got %d\n", rc);
  175.  
  176.     switch(rc)
  177.     {
  178.     case MOD_CONNECT:
  179.     case MOD_CONNECT_300:
  180.         baud = 300;
  181.     case MOD_CONNECT_1200:
  182.         if (baud == 0) baud = 1200;
  183.     case MOD_CONNECT_2400:
  184.         if (baud == 0) baud = 2400;
  185.     case MOD_CONNECT_4800:
  186.         if (baud == 0) baud = 4800;
  187.     case MOD_CONNECT_9600:
  188.         if (baud == 0) baud = 9600;
  189.  
  190.         sleep(2); /* Let modem settle */
  191.         tty_flush();
  192.         tty_local(0);
  193.         tty_baud(baud);
  194.         tty_sane();
  195.         log("dialup: connected");
  196.         mod_put("\r\n\r\n");
  197.  
  198.         /*
  199.          * Mark current baudrate in the server database.
  200.          */
  201.         slot.baud = baud;
  202.         slot_write(&slot);
  203.  
  204. #ifdef RLOGIN
  205.         /*
  206.          * Get login name.
  207.          */
  208.         retry = 0;
  209.         do {
  210.         rc = prompt(MSG_LOGIN, name, NAME_SIZE, LOGIN_TMOUT);
  211.         } while(rc == E_OK && strlen(name) == 0);
  212.  
  213.         if ((pw = getpwnam(name)) == NULL) {
  214.         mod_put(MSG_LOGINFAIL);
  215.         return E_FAIL;
  216.         }
  217.  
  218.         /*
  219.          * Don't even try to login as same uid as this process.
  220.          */
  221.         if (pw->pw_uid < 10 || pw->pw_uid == getuid()) {
  222.         log("pseudouser '%s' tried to log in as '%s'", slot.name, name);
  223.         mod_put(MSG_LOGINFAIL);
  224.         return E_FAIL;
  225.         }
  226. #endif
  227.  
  228.         /*
  229.          * Redirect port to stdin, stdout and stderr.
  230.          */
  231.         if (tty_redirect() != E_OK) {
  232.            logerr("redirection failed");
  233.            return E_FAIL;
  234.         }
  235.  
  236. #ifdef RLOGIN
  237.         execl("/usr/ucb/rlogin", "rlogin", "-l", name, slot.host, NULL);
  238.         logerr("dialup: failed to exec rlogin");
  239. #else
  240.         execl("/bin/login", "login", NULL);
  241.         logerr("dialup: failed to exec login");
  242. #endif
  243.         return E_FAIL;
  244.         
  245.     case MOD_NO_CARRIER:
  246.         logerr("dialup: got no carrier for number '%s'", slot.phone);
  247.         break; /* Retry */
  248.  
  249.     case MOD_BUSY:
  250.         sleep(7);
  251.         break; /* Retry */
  252.         
  253.     case MOD_OK:
  254.     default:
  255.         logerr("dialup: got %d from modem", rc);
  256.         break; /* Retry */
  257.     }
  258.     sleep(5);
  259.     }
  260.  
  261.    /*
  262.     * Failed to dialup.
  263.     */
  264.  
  265.     return E_FAIL;
  266. }
  267.