Annotation of coherent/g/usr/lib/uucp/tay104/conn.c, revision 1.1.1.1

1.1       root        1: /* conn.c
                      2:    Connection routines for the Taylor UUCP package.
                      3: 
                      4:    Copyright (C) 1991, 1992 Ian Lance Taylor
                      5: 
                      6:    This file is part of the Taylor UUCP package.
                      7: 
                      8:    This program is free software; you can redistribute it and/or
                      9:    modify it under the terms of the GNU General Public License as
                     10:    published by the Free Software Foundation; either version 2 of the
                     11:    License, or (at your option) any later version.
                     12: 
                     13:    This program is distributed in the hope that it will be useful, but
                     14:    WITHOUT ANY WARRANTY; without even the implied warranty of
                     15:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     16:    General Public License for more details.
                     17: 
                     18:    You should have received a copy of the GNU General Public License
                     19:    along with this program; if not, write to the Free Software
                     20:    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                     21: 
                     22:    The author of the program may be contacted at [email protected] or
                     23:    c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
                     24:    */
                     25: 
                     26: #include "uucp.h"
                     27: 
                     28: #if USE_RCS_ID
                     29: const char conn_rcsid[] = "$Id: conn.c,v 1.1 93/07/30 07:52:56 bin Exp Locker: bin $";
                     30: #endif
                     31: 
                     32: #include <ctype.h>
                     33: 
                     34: #include "uudefs.h"
                     35: #include "uuconf.h"
                     36: #include "conn.h"
                     37: 
                     38: static boolean fcdo_dial P((struct sconnection *qconn, pointer puuconf,
                     39:                            struct uuconf_dialer *qdialer,
                     40:                            const char *zphone, boolean ftranslate));
                     41: 
                     42: /* Create a new connection.  This relies on system dependent functions
                     43:    to set the qcmds and psysdep fields.  If qport is NULL, it opens a
                     44:    standard input port.  */
                     45: 
                     46: boolean
                     47: fconn_init (qport, qconn)
                     48:      struct uuconf_port *qport;
                     49:      struct sconnection *qconn;
                     50: {
                     51:   qconn->qport = qport;
                     52:   switch (qport == NULL ? UUCONF_PORTTYPE_STDIN : qport->uuconf_ttype)
                     53:     {
                     54:     case UUCONF_PORTTYPE_STDIN:
                     55:       return fsysdep_stdin_init (qconn);
                     56:     case UUCONF_PORTTYPE_MODEM:
                     57:       return fsysdep_modem_init (qconn);
                     58:     case UUCONF_PORTTYPE_DIRECT:
                     59:       return fsysdep_direct_init (qconn);
                     60: #if HAVE_TCP
                     61:     case UUCONF_PORTTYPE_TCP:
                     62:       return fsysdep_tcp_init (qconn);
                     63: #endif
                     64: #if HAVE_TLI
                     65:     case UUCONF_PORTTYPE_TLI:
                     66:       return fsysdep_tli_init (qconn);
                     67: #endif
                     68:     default:
                     69:       ulog (LOG_ERROR, "Unknown port type");
                     70:       return FALSE;
                     71:     }
                     72: }
                     73: 
                     74: /* Connection dispatch routines.  */
                     75: 
                     76: /* Free a connection.  */
                     77: 
                     78: void
                     79: uconn_free (qconn)
                     80:      struct sconnection *qconn;
                     81: {
                     82:   (*qconn->qcmds->pufree) (qconn);
                     83: }
                     84: 
                     85: /* Lock a connection.   */
                     86: 
                     87: boolean
                     88: fconn_lock (qconn, fin)
                     89:      struct sconnection *qconn;
                     90:      boolean fin;
                     91: {
                     92:   boolean (*pflock) P((struct sconnection *, boolean));
                     93: 
                     94:   pflock = qconn->qcmds->pflock;
                     95:   if (pflock == NULL)
                     96:     return TRUE;
                     97:   return (*pflock) (qconn, fin);
                     98: }
                     99: 
                    100: /* Unlock a connection.  */
                    101: 
                    102: boolean
                    103: fconn_unlock (qconn)
                    104:      struct sconnection *qconn;
                    105: {
                    106:   boolean (*pfunlock) P((struct sconnection *));
                    107: 
                    108:   pfunlock = qconn->qcmds->pfunlock;
                    109:   if (pfunlock == NULL)
                    110:     return TRUE;
                    111:   return (*pfunlock) (qconn);
                    112: }
                    113: 
                    114: /* Open a connection.  */
                    115: 
                    116: boolean
                    117: fconn_open (qconn, ibaud, ihighbaud, fwait)
                    118:      struct sconnection *qconn;
                    119:      long ibaud;
                    120:      long ihighbaud;
                    121:      boolean fwait;
                    122: {
                    123:   boolean fret;
                    124: 
                    125: #if DEBUG > 1
                    126:   if (FDEBUGGING (DEBUG_PORT))
                    127:     {
                    128:       char abspeed[20];
                    129: 
                    130:       if (ibaud == (long) 0)
                    131:        strcpy (abspeed, "default speed");
                    132:       else
                    133:        sprintf (abspeed, "speed %ld", ibaud);
                    134: 
                    135:       if (qconn->qport == NULL)
                    136:        ulog (LOG_DEBUG, "fconn_open: Opening stdin port (%s)",
                    137:              abspeed);
                    138:       else if (qconn->qport->uuconf_zname == NULL)
                    139:        ulog (LOG_DEBUG, "fconn_open: Opening unnamed port (%s)",
                    140:              abspeed);
                    141:       else
                    142:        ulog (LOG_DEBUG, "fconn_open: Opening port %s (%s)",
                    143:              qconn->qport->uuconf_zname, abspeed);
                    144:     }
                    145: #endif
                    146: 
                    147:   /* If the system provides a range of baud rates, we select the
                    148:      highest baud rate supported by the port.  */
                    149:   if (ihighbaud != 0 && qconn->qport != NULL)
                    150:     {
                    151:       struct uuconf_port *qport;
                    152: 
                    153:       qport = qconn->qport;
                    154:       ibaud = ihighbaud;
                    155:       if (qport->uuconf_ttype == UUCONF_PORTTYPE_MODEM)
                    156:        {
                    157:          if (qport->uuconf_u.uuconf_smodem.uuconf_ilowbaud != 0)
                    158:            {
                    159:              if (qport->uuconf_u.uuconf_smodem.uuconf_ihighbaud < ibaud)
                    160:                ibaud = qport->uuconf_u.uuconf_smodem.uuconf_ihighbaud;
                    161:            }
                    162:          else if (qport->uuconf_u.uuconf_smodem.uuconf_ibaud != 0)
                    163:            ibaud = qport->uuconf_u.uuconf_smodem.uuconf_ibaud;
                    164:        }
                    165:       else if (qport->uuconf_ttype == UUCONF_PORTTYPE_DIRECT)
                    166:        {
                    167:          if (qport->uuconf_u.uuconf_sdirect.uuconf_ibaud != 0)
                    168:            ibaud = qport->uuconf_u.uuconf_sdirect.uuconf_ibaud;
                    169:        }
                    170:     }
                    171: 
                    172:   /* This will normally be overridden by the port specific open
                    173:      routine.  */
                    174:   if (qconn->qport == NULL)
                    175:     ulog_device ("stdin");
                    176:   else
                    177:     ulog_device (qconn->qport->uuconf_zname);
                    178: 
                    179:   fret = (*qconn->qcmds->pfopen) (qconn, ibaud, fwait);
                    180: 
                    181:   if (! fret)
                    182:     ulog_device ((const char *) NULL);
                    183: 
                    184:   return fret;
                    185: }
                    186: 
                    187: /* Close a connection.  */
                    188: 
                    189: boolean
                    190: fconn_close (qconn, puuconf, qdialer, fsuccess)
                    191:      struct sconnection *qconn;
                    192:      pointer puuconf;
                    193:      struct uuconf_dialer *qdialer;
                    194:      boolean fsuccess;
                    195: {
                    196:   boolean fret;
                    197: 
                    198:   DEBUG_MESSAGE0 (DEBUG_PORT, "fconn_close: Closing connection");
                    199: 
                    200:   /* Don't report hangup signals while we're closing.  */
                    201:   fLog_sighup = FALSE;
                    202: 
                    203:   fret = (*qconn->qcmds->pfclose) (qconn, puuconf, qdialer, fsuccess);
                    204: 
                    205:   /* Make sure any signal reporting has been done before we set
                    206:      fLog_sighup back to TRUE.  */
                    207:   ulog (LOG_ERROR, (const char *) NULL);
                    208:   fLog_sighup = TRUE;
                    209: 
                    210:   ulog_device ((const char *) NULL);
                    211: 
                    212:   return fret;
                    213: }
                    214: 
                    215: /* Reset the connection.  */
                    216: 
                    217: boolean
                    218: fconn_reset (qconn)
                    219:      struct sconnection *qconn;
                    220: {
                    221:   DEBUG_MESSAGE0 (DEBUG_PORT, "fconn_reset: Resetting connection");
                    222: 
                    223:   return (*qconn->qcmds->pfreset) (qconn);
                    224: }
                    225: 
                    226: /* Dial out on the connection.  */
                    227: 
                    228: boolean
                    229: fconn_dial (qconn, puuconf, qsys, zphone, qdialer, ptdialerfound)
                    230:      struct sconnection *qconn;
                    231:      pointer puuconf;
                    232:      const struct uuconf_system *qsys;
                    233:      const char *zphone;
                    234:      struct uuconf_dialer *qdialer;
                    235:      enum tdialerfound *ptdialerfound;
                    236: {
                    237:   struct uuconf_dialer sdialer;
                    238:   enum tdialerfound tfound;
                    239:   boolean (*pfdial) P((struct sconnection *, pointer,
                    240:                       const struct uuconf_system *, const char *,
                    241:                       struct uuconf_dialer *, enum tdialerfound *));
                    242: 
                    243:   if (qdialer == NULL)
                    244:     qdialer = &sdialer;
                    245:   if (ptdialerfound == NULL)
                    246:     ptdialerfound = &tfound;
                    247:       
                    248:   qdialer->uuconf_zname = NULL;
                    249:   *ptdialerfound = DIALERFOUND_FALSE;
                    250: 
                    251:   pfdial = qconn->qcmds->pfdial;
                    252:   if (pfdial == NULL)
                    253:     return TRUE;
                    254:   return (*pfdial) (qconn, puuconf, qsys, zphone, qdialer, ptdialerfound);
                    255: }
                    256: 
                    257: /* Read data from the connection.  */
                    258: 
                    259: boolean
                    260: fconn_read (qconn, zbuf, pclen, cmin, ctimeout, freport)
                    261:      struct sconnection *qconn;
                    262:      char *zbuf;
                    263:      size_t *pclen;
                    264:      size_t cmin;
                    265:      int ctimeout;
                    266:      boolean freport;
                    267: {
                    268:   boolean fret;
                    269: 
                    270:   fret = (*qconn->qcmds->pfread) (qconn, zbuf, pclen, cmin, ctimeout,
                    271:                                  freport);
                    272: 
                    273: #if DEBUG > 1
                    274:   if (FDEBUGGING (DEBUG_INCOMING))
                    275:     udebug_buffer ("fconn_read: Read", zbuf, *pclen);
                    276:   else if (FDEBUGGING (DEBUG_PORT))
                    277:     ulog (LOG_DEBUG, "fconn_read: Read %lu", (unsigned long) *pclen);
                    278: #endif
                    279: 
                    280:   return fret;
                    281: }
                    282: 
                    283: /* Write data to the connection.  */
                    284: 
                    285: boolean
                    286: fconn_write (qconn, zbuf, clen)
                    287:      struct sconnection *qconn;
                    288:      const char *zbuf;
                    289:      size_t clen;
                    290: {
                    291: #if DEBUG > 1
                    292:   if (FDEBUGGING (DEBUG_OUTGOING))
                    293:     udebug_buffer ("fconn_write: Writing", zbuf, clen);
                    294:   else if (FDEBUGGING (DEBUG_PORT))
                    295:     ulog (LOG_DEBUG, "fconn_write: Writing %lu", (unsigned long) clen);
                    296: #endif
                    297: 
                    298:   return (*qconn->qcmds->pfwrite) (qconn, zbuf, clen);
                    299: }
                    300: 
                    301: /* Read and write data.  */
                    302: 
                    303: boolean
                    304: fconn_io (qconn, zwrite, pcwrite, zread, pcread)
                    305:      struct sconnection *qconn;
                    306:      const char *zwrite;
                    307:      size_t *pcwrite;
                    308:      char *zread;
                    309:      size_t *pcread;
                    310: {
                    311:   boolean fret;
                    312: #if DEBUG > 1
                    313:   size_t cwrite = *pcwrite;
                    314:   size_t cread = *pcread;
                    315: 
                    316:   if (cread == 0 || cwrite == 0)
                    317:     ulog (LOG_FATAL, "fconn_io: cread %lu; cwrite %lu",
                    318:          (unsigned long) cread, (unsigned long) cwrite);
                    319: #endif
                    320: 
                    321: #if DEBUG > 1
                    322:   if (FDEBUGGING (DEBUG_OUTGOING))
                    323:     udebug_buffer ("fconn_io: Writing", zwrite, cwrite);
                    324: #endif
                    325: 
                    326:   fret = (*qconn->qcmds->pfio) (qconn, zwrite, pcwrite, zread, pcread);
                    327: 
                    328:   DEBUG_MESSAGE4 (DEBUG_PORT,
                    329:                  "fconn_io: Wrote %lu of %lu, read %lu of %lu",
                    330:                  (unsigned long) *pcwrite, (unsigned long) cwrite,
                    331:                  (unsigned long) *pcread, (unsigned long) cread);
                    332: 
                    333: #if DEBUG > 1
                    334:   if (*pcread > 0 && FDEBUGGING (DEBUG_INCOMING))
                    335:     udebug_buffer ("fconn_io: Read", zread, *pcread);
                    336: #endif
                    337: 
                    338:   return fret;
                    339: }
                    340: 
                    341: /* Send a break character to a connection.  Some port types may not
                    342:    support break characters, in which case we just return TRUE.  */
                    343: 
                    344: boolean
                    345: fconn_break (qconn)
                    346:      struct sconnection *qconn;
                    347: {
                    348:   boolean (*pfbreak) P((struct sconnection *));
                    349: 
                    350:   pfbreak = *qconn->qcmds->pfbreak;
                    351:   if (pfbreak == NULL)
                    352:     return TRUE;
                    353: 
                    354:   DEBUG_MESSAGE0 (DEBUG_PORT, "fconn_break: Sending break character");
                    355: 
                    356:   return (*pfbreak) (qconn);
                    357: }
                    358: 
                    359: /* Change the setting of a connection.  Some port types may not
                    360:    support this, in which case we just return TRUE.  */
                    361: 
                    362: boolean
                    363: fconn_set (qconn, tparity, tstrip, txonxoff)
                    364:      struct sconnection *qconn;
                    365:      enum tparitysetting tparity;
                    366:      enum tstripsetting tstrip;
                    367:      enum txonxoffsetting txonxoff;
                    368: {
                    369:   boolean (*pfset) P((struct sconnection *, enum tparitysetting,
                    370:                      enum tstripsetting, enum txonxoffsetting));
                    371: 
                    372:   pfset = qconn->qcmds->pfset;
                    373:   if (pfset == NULL)
                    374:     return TRUE;
                    375: 
                    376:   DEBUG_MESSAGE3 (DEBUG_PORT,
                    377:                  "fconn_set: Changing setting to %d, %d, %d",
                    378:                  (int) tparity, (int) tstrip, (int) txonxoff);
                    379: 
                    380:   return (*pfset) (qconn, tparity, tstrip, txonxoff);
                    381: }
                    382: 
                    383: /* Require or ignore carrier on a connection.  */
                    384: 
                    385: boolean
                    386: fconn_carrier (qconn, fcarrier)
                    387:      struct sconnection *qconn;
                    388:      boolean fcarrier;
                    389: {
                    390:   boolean (*pfcarrier) P((struct sconnection *, boolean));
                    391: 
                    392:   pfcarrier = qconn->qcmds->pfcarrier;
                    393:   if (pfcarrier == NULL)
                    394:     return TRUE;
                    395:   return (*pfcarrier) (qconn, fcarrier);
                    396: }
                    397: 
                    398: /* Run a chat program on a connection.  */
                    399: 
                    400: boolean
                    401: fconn_run_chat (qconn, pzprog)
                    402:      struct sconnection *qconn;
                    403:      char **pzprog;
                    404: {
                    405:   return (*qconn->qcmds->pfchat) (qconn, pzprog);
                    406: }
                    407: 
                    408: /* Get the baud rate of a connection.  */
                    409: 
                    410: long
                    411: iconn_baud (qconn)
                    412:      struct sconnection *qconn;
                    413: {
                    414:   long (*pibaud) P((struct sconnection *));
                    415: 
                    416:   pibaud = qconn->qcmds->pibaud;
                    417:   if (pibaud == NULL)
                    418:     return 0;
                    419:   return (*pibaud) (qconn);
                    420: }
                    421: 
                    422: /* Modem dialing routines.  */
                    423: 
                    424: /*ARGSUSED*/
                    425: boolean
                    426: fmodem_dial (qconn, puuconf, qsys, zphone, qdialer, ptdialerfound)
                    427:      struct sconnection *qconn;
                    428:      pointer puuconf;
                    429:      const struct uuconf_system *qsys;
                    430:      const char *zphone;
                    431:      struct uuconf_dialer *qdialer;
                    432:      enum tdialerfound *ptdialerfound;
                    433: {
                    434:   *ptdialerfound = DIALERFOUND_FALSE;
                    435: 
                    436:   if (qconn->qport->uuconf_u.uuconf_smodem.uuconf_pzdialer != NULL)
                    437:     {
                    438:       char **pz;
                    439:       boolean ffirst;
                    440: 
                    441:       /* The pzdialer field is a sequence of dialer/token pairs.  The
                    442:         dialer portion names a dialer to use.  The token portion is
                    443:         what \D and \T in the chat script expand to.  If there is no
                    444:         token for the last dialer, the phone number for the system is
                    445:         used.  */
                    446:       ffirst = TRUE;
                    447:       pz = qconn->qport->uuconf_u.uuconf_smodem.uuconf_pzdialer;
                    448:       while (*pz != NULL)
                    449:        {
                    450:          int iuuconf;
                    451:          struct uuconf_dialer *q;
                    452:          struct uuconf_dialer s;
                    453:          const char *ztoken;
                    454:          boolean ftranslate;
                    455: 
                    456:          if (! ffirst)
                    457:            q = &s;
                    458:          else
                    459:            q = qdialer;
                    460: 
                    461:          iuuconf = uuconf_dialer_info (puuconf, *pz, q);
                    462:          if (iuuconf == UUCONF_NOT_FOUND)
                    463:            {
                    464:              ulog (LOG_ERROR, "%s: Dialer not found", *pz);
                    465:              return FALSE;
                    466:            }
                    467:          else if (iuuconf != UUCONF_SUCCESS)
                    468:            {
                    469:              ulog_uuconf (LOG_ERROR, puuconf, iuuconf);
                    470:              return FALSE;
                    471:            }
                    472: 
                    473:          ++pz;
                    474:          ztoken = *pz;
                    475: 
                    476:          ftranslate = FALSE;
                    477:          if (ztoken == NULL
                    478:              || strcmp (ztoken, "\\D") == 0)
                    479:            ztoken = zphone;
                    480:          else if (strcmp (ztoken, "\\T") == 0)
                    481:            {
                    482:              ztoken = zphone;
                    483:              ftranslate = TRUE;
                    484:            }
                    485: 
                    486:          if (! fcdo_dial (qconn, puuconf, q, ztoken, ftranslate))
                    487:            {
                    488:              (void) uuconf_dialer_free (puuconf, q);
                    489:              if (! ffirst)
                    490:                (void) uuconf_dialer_free (puuconf, qdialer);
                    491:              return FALSE;
                    492:            }
                    493: 
                    494:          if (ffirst)
                    495:            {
                    496:              *ptdialerfound = DIALERFOUND_FREE;
                    497:              ffirst = FALSE;
                    498:            }
                    499:          else
                    500:            (void) uuconf_dialer_free (puuconf, q);
                    501: 
                    502:          if (*pz != NULL)
                    503:            ++pz;
                    504:        }
                    505: 
                    506:       return TRUE;
                    507:     }
                    508:   else if (qconn->qport->uuconf_u.uuconf_smodem.uuconf_qdialer != NULL)
                    509:     {
                    510:       struct uuconf_dialer *q;
                    511: 
                    512:       q = qconn->qport->uuconf_u.uuconf_smodem.uuconf_qdialer;
                    513:       *qdialer = *q;
                    514:       *ptdialerfound = DIALERFOUND_TRUE;
                    515:       return fcdo_dial (qconn, puuconf, q, zphone, FALSE);
                    516:     }
                    517:   else
                    518:     {
                    519:       ulog (LOG_ERROR, "No dialer information");
                    520:       return FALSE;
                    521:     }
                    522: }
                    523: 
                    524: /* Actually use a dialer.  We set up the modem (which may include
                    525:    opening the dialer device), run the chat script, and finish dealing
                    526:    with the modem.  */
                    527: 
                    528: static boolean
                    529: fcdo_dial (qconn, puuconf, qdial, zphone, ftranslate)
                    530:      struct sconnection *qconn;
                    531:      pointer puuconf;
                    532:      struct uuconf_dialer *qdial;
                    533:      const char *zphone;
                    534:      boolean ftranslate;
                    535: {
                    536:   const char *zname;
                    537: 
                    538:   if (! fsysdep_modem_begin_dial (qconn, qdial))
                    539:     return FALSE;
                    540: 
                    541:   if (qconn->qport == NULL)
                    542:     zname = NULL;
                    543:   else
                    544:     zname = qconn->qport->uuconf_zname;
                    545: 
                    546:   if (! fchat (qconn, puuconf, &qdial->uuconf_schat,
                    547:               (const struct uuconf_system *) NULL, qdial,
                    548:               zphone, ftranslate, zname, iconn_baud (qconn)))
                    549:     return FALSE;
                    550: 
                    551:   return fsysdep_modem_end_dial (qconn, qdial);
                    552: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.