Annotation of coherent/g/usr/lib/uucp/tay104/tli.c, revision 1.1

1.1     ! root        1: /* tli.c
        !             2:    Code to handle TLI connections.
        !             3: 
        !             4:    Copyright (C) 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 tli_rcsid[] = "$Id: tli.c,v 1.1 93/07/30 07:54:19 bin Exp Locker: bin $";
        !            30: #endif
        !            31: 
        !            32: #if HAVE_TLI
        !            33: 
        !            34: #include "sysdep.h"
        !            35: #include "uudefs.h"
        !            36: #include "uuconf.h"
        !            37: #include "conn.h"
        !            38: #include "system.h"
        !            39: 
        !            40: #include <errno.h>
        !            41: 
        !            42: #if HAVE_SYS_IOCTL_H
        !            43: #include <sys/ioctl.h>
        !            44: #endif
        !            45: 
        !            46: #if HAVE_TIUSER_H
        !            47: #include <tiuser.h>
        !            48: #else
        !            49: #if HAVE_XTI_H
        !            50: #include <xti.h>
        !            51: #else
        !            52: #if HAVE_SYS_TLI_H
        !            53: #include <sys/tli.h>
        !            54: #endif
        !            55: #endif
        !            56: #endif
        !            57: 
        !            58: #if HAVE_STROPTS_H
        !            59: #include <stropts.h>
        !            60: #endif
        !            61: 
        !            62: #if HAVE_FCNTL_H
        !            63: #include <fcntl.h>
        !            64: #else
        !            65: #if HAVE_SYS_FILE_H
        !            66: #include <sys/file.h>
        !            67: #endif
        !            68: #endif
        !            69: 
        !            70: #ifndef O_RDONLY
        !            71: #define O_RDONLY 0
        !            72: #define O_WRONLY 1
        !            73: #define O_RDWR 2
        !            74: #endif
        !            75: 
        !            76: #ifndef FD_CLOEXEC
        !            77: #define FD_CLOEXEC 1
        !            78: #endif
        !            79: 
        !            80: /* The arguments to t_alloca have two different names.  I want the
        !            81:    SVID ones, not the XPG3 ones.  */
        !            82: #ifndef T_BIND
        !            83: #define T_BIND T_BIND_STR
        !            84: #endif
        !            85: #ifndef T_CALL
        !            86: #define T_CALL T_CALL_STR
        !            87: #endif
        !            88: 
        !            89: /* Hopefully these externs will not cause any trouble.  This is how
        !            90:    they are shown in the SVID.  */
        !            91: extern int t_errno;
        !            92: extern char *t_errlist[];
        !            93: extern int t_nerr;
        !            94: 
        !            95: #ifndef t_alloc
        !            96: extern pointer t_alloc ();
        !            97: #endif
        !            98: 
        !            99: /* This code handles TLI connections.  It's Unix specific.  It's
        !           100:    largely based on code from Unix Network Programming, by W. Richard
        !           101:    Stevens.  */
        !           102: 
        !           103: /* Local functions.  */
        !           104: static const char *ztlierror P((void));
        !           105: static void utli_free P((struct sconnection *qconn));
        !           106: static boolean ftli_push P((struct sconnection *qconn));
        !           107: static boolean ftli_open P((struct sconnection *qconn, long ibaud,
        !           108:                            boolean fwait));
        !           109: static boolean ftli_close P((struct sconnection *qconn,
        !           110:                             pointer puuconf,
        !           111:                             struct uuconf_dialer *qdialer,
        !           112:                             boolean fsuccess));
        !           113: static boolean ftli_reset P((struct sconnection *qconn));
        !           114: static boolean ftli_dial P((struct sconnection *qconn, pointer puuconf,
        !           115:                            const struct uuconf_system *qsys,
        !           116:                            const char *zphone,
        !           117:                            struct uuconf_dialer *qdialer,
        !           118:                            enum tdialerfound *ptdialer));
        !           119: 
        !           120: /* The command table for a TLI connection.  */
        !           121: static const struct sconncmds stlicmds =
        !           122: {
        !           123:   utli_free,
        !           124:   NULL, /* pflock */
        !           125:   NULL, /* pfunlock */
        !           126:   ftli_open,
        !           127:   ftli_close,
        !           128:   ftli_reset,
        !           129:   ftli_dial,
        !           130:   fsysdep_conn_read,
        !           131:   fsysdep_conn_write,
        !           132:   fsysdep_conn_io,
        !           133:   NULL, /* pfbreak */
        !           134:   NULL, /* pfset */
        !           135:   NULL, /* pfcarrier */
        !           136:   fsysdep_conn_chat,
        !           137:   NULL /* pibaud */
        !           138: };
        !           139: 
        !           140: /* Get a TLI error string.  */
        !           141: 
        !           142: static const char *
        !           143: ztlierror ()
        !           144: {
        !           145:   if (t_errno == TSYSERR)
        !           146:     return strerror (errno);
        !           147:   if (t_errno < 0 || t_errno >= t_nerr)
        !           148:     return "Unknown TLI error";
        !           149:   return t_errlist[t_errno];
        !           150: } 
        !           151: 
        !           152: /* Initialize a TLI connection.  */
        !           153: 
        !           154: boolean
        !           155: fsysdep_tli_init (qconn)
        !           156:      struct sconnection *qconn;
        !           157: {
        !           158:   struct ssysdep_conn *q;
        !           159: 
        !           160:   q = (struct ssysdep_conn *) xmalloc (sizeof (struct ssysdep_conn));
        !           161:   q->o = -1;
        !           162:   q->zdevice = NULL;
        !           163:   q->iflags = -1;
        !           164:   q->istdout_flags = -1;
        !           165:   q->fterminal = FALSE;
        !           166:   q->ftli = TRUE;
        !           167:   q->ibaud = 0;
        !           168: 
        !           169:   qconn->psysdep = (pointer) q;
        !           170:   qconn->qcmds = &stlicmds;
        !           171:   return TRUE;
        !           172: }
        !           173: 
        !           174: /* Free a TLI connection.  */
        !           175: 
        !           176: static void
        !           177: utli_free (qconn)
        !           178:      struct sconnection *qconn;
        !           179: {
        !           180:   xfree (qconn->psysdep);
        !           181: }
        !           182: 
        !           183: /* Push all desired modules onto a TLI stream.  If the user requests a
        !           184:    STREAMS connection without giving a list of modules, we just push
        !           185:    tirdwr.  If the I_PUSH ioctl is not defined on this system, we just
        !           186:    ignore any list of modules.  */
        !           187: 
        !           188: static boolean
        !           189: ftli_push (qconn)
        !           190:      struct sconnection *qconn;
        !           191: {
        !           192: #ifdef I_PUSH
        !           193: 
        !           194:   struct ssysdep_conn *qsysdep;
        !           195: 
        !           196:   qsysdep = (struct ssysdep_conn *) qconn->psysdep;
        !           197: 
        !           198:   if (qconn->qport->uuconf_u.uuconf_stli.uuconf_pzpush != NULL)
        !           199:     {
        !           200:       char **pz;
        !           201: 
        !           202:       for (pz = qconn->qport->uuconf_u.uuconf_stli.uuconf_pzpush;
        !           203:           *pz != NULL;
        !           204:           pz++)
        !           205:        {
        !           206:          if (ioctl (qsysdep->o, I_PUSH, *pz) < 0)
        !           207:            {
        !           208:              ulog (LOG_ERROR, "ioctl (I_PUSH, %s): %s", *pz,
        !           209:                    strerror (errno));
        !           210:              return FALSE;
        !           211:            }
        !           212:        }
        !           213:     }
        !           214:   else if (qconn->qport->uuconf_u.uuconf_stli.uuconf_fstream)
        !           215:     {
        !           216:       if (ioctl (qsysdep->o, I_PUSH, "tirdwr") < 0)
        !           217:        {
        !           218:          ulog (LOG_ERROR, "ioctl (I_PUSH, tirdwr): %s",
        !           219:                strerror (errno));
        !           220:          return FALSE;
        !           221:        }
        !           222:     }
        !           223: 
        !           224:   /* If we have just put the connection into stream mode, we must turn
        !           225:      off the TLI flag to avoid using TLI calls on it.  */
        !           226:   if (qconn->qport->uuconf_u.uuconf_stli.uuconf_fstream)
        !           227:     qsysdep->ftli = FALSE;
        !           228: 
        !           229: #endif /* defined (I_PUSH) */
        !           230:   
        !           231:   return TRUE;
        !           232: }
        !           233: 
        !           234: /* Open a TLI connection.  If the fwait argument is TRUE, we are
        !           235:    running as a server.  Otherwise we are just trying to reach another
        !           236:    system.  */
        !           237: 
        !           238: static boolean
        !           239: ftli_open (qconn, ibaud, fwait)
        !           240:      struct sconnection *qconn;
        !           241:      long ibaud;
        !           242:      boolean fwait;
        !           243: {
        !           244:   struct ssysdep_conn *qsysdep;
        !           245:   const char *zdevice;
        !           246:   char *zfreedev;
        !           247:   const char *zservaddr;
        !           248:   char *zfreeaddr;
        !           249:   struct t_bind *qtbind;
        !           250:   struct t_call *qtcall;
        !           251: 
        !           252:   /* Unlike most other device types, we don't bother to call
        !           253:      ulog_device here, because fconn_open calls it with the name of
        !           254:      the port anyhow.  */
        !           255: 
        !           256:   qsysdep = (struct ssysdep_conn *) qconn->psysdep;
        !           257: 
        !           258:   zdevice = qconn->qport->uuconf_u.uuconf_stli.uuconf_zdevice;
        !           259:   if (zdevice == NULL)
        !           260:     zdevice = qconn->qport->uuconf_zname;
        !           261: 
        !           262:   zfreedev = NULL;
        !           263:   if (*zdevice != '/')
        !           264:     {
        !           265:       zfreedev = zbufalc (sizeof "/dev/" + strlen (zdevice));
        !           266:       sprintf (zfreedev, "/dev/%s", zdevice);
        !           267:       zdevice = zfreedev;
        !           268:     }
        !           269: 
        !           270:   qsysdep->o = t_open (zdevice, O_RDWR, (struct t_info *) NULL);
        !           271:   if (qsysdep->o < 0)
        !           272:     {
        !           273:       ulog (LOG_ERROR, "t_open (%s): %s", zdevice, ztlierror ());
        !           274:       ubuffree (zfreedev);
        !           275:       return FALSE;
        !           276:     }
        !           277: 
        !           278:   if (fcntl (qsysdep->o, F_SETFD,
        !           279:             fcntl (qsysdep->o, F_GETFD, 0) | FD_CLOEXEC) < 0)
        !           280:     {
        !           281:       ulog (LOG_ERROR, "fcntl (FD_CLOEXEC): %s", strerror (errno));
        !           282:       ubuffree (zfreedev);
        !           283:       (void) t_close (qsysdep->o);
        !           284:       qsysdep->o = -1;
        !           285:       return FALSE;
        !           286:     }
        !           287: 
        !           288:   qsysdep->iflags = fcntl (qsysdep->o, F_GETFL, 0);
        !           289:   if (qsysdep->iflags < 0)
        !           290:     {
        !           291:       ulog (LOG_ERROR, "fcntl: %s", strerror (errno));
        !           292:       ubuffree (zfreedev);
        !           293:       (void) t_close (qsysdep->o);
        !           294:       qsysdep->o = -1;
        !           295:       return FALSE;
        !           296:     }
        !           297: 
        !           298:   /* If we aren't waiting for a connection, we can bind to any local
        !           299:      address, and then we're finished.  */
        !           300:   if (! fwait)
        !           301:     {
        !           302:       ubuffree (zfreedev);
        !           303:       if (t_bind (qsysdep->o, (struct t_bind *) NULL,
        !           304:                  (struct t_bind *) NULL) < 0)
        !           305:        {
        !           306:          ulog (LOG_ERROR, "t_bind: %s", ztlierror ());
        !           307:          (void) t_close (qsysdep->o);
        !           308:          qsysdep->o = -1;
        !           309:          return FALSE;
        !           310:        }
        !           311:       return TRUE;
        !           312:     }
        !           313: 
        !           314:   /* Run as a server and wait for a new connection.  The code in
        !           315:      uucico.c has already detached us from our controlling terminal.
        !           316:      From this point on if the server gets an error we exit; we only
        !           317:      return if we have received a connection.  It would be more robust
        !           318:      to respawn the server if it fails; someday.  */
        !           319:   qtbind = (struct t_bind *) t_alloc (qsysdep->o, T_BIND, T_ALL);
        !           320:   if (qtbind == NULL)
        !           321:     ulog (LOG_FATAL, "t_alloc (T_BIND): %s", ztlierror ());
        !           322: 
        !           323:   zservaddr = qconn->qport->uuconf_u.uuconf_stli.uuconf_zservaddr;
        !           324:   if (zservaddr == NULL)
        !           325:     ulog (LOG_FATAL, "Can't run as TLI server; no server address");
        !           326:       
        !           327:   zfreeaddr = zbufcpy (zservaddr);
        !           328:   qtbind->addr.len = cescape (zfreeaddr);
        !           329:   if (qtbind->addr.len > qtbind->addr.maxlen)
        !           330:     ulog (LOG_FATAL, "%s: TLI server address too long (max %d)",
        !           331:          zservaddr, qtbind->addr.maxlen);
        !           332:   memcpy (qtbind->addr.buf, zfreeaddr, qtbind->addr.len);
        !           333:   ubuffree (zfreeaddr);
        !           334: 
        !           335:   qtbind->qlen = 5;
        !           336: 
        !           337:   if (t_bind (qsysdep->o, qtbind, (struct t_bind *) NULL) < 0)
        !           338:     ulog (LOG_FATAL, "t_bind (%s): %s", zservaddr, ztlierror ());
        !           339: 
        !           340:   (void) t_free ((pointer) qtbind, T_BIND);
        !           341: 
        !           342:   qtcall = (struct t_call *) t_alloc (qsysdep->o, T_CALL, T_ALL);
        !           343:   if (qtcall == NULL)
        !           344:     ulog (LOG_FATAL, "t_alloc (T_CALL): %s", ztlierror ());
        !           345: 
        !           346:   while (! FGOT_SIGNAL ())
        !           347:     {
        !           348:       int onew;
        !           349:       pid_t ipid;
        !           350: 
        !           351:       DEBUG_MESSAGE0 (DEBUG_PORT,
        !           352:                      "ftli_open: Waiting for connections");
        !           353: 
        !           354:       if (t_listen (qsysdep->o, qtcall) < 0)
        !           355:        ulog (LOG_FATAL, "t_listen: %s", ztlierror ());
        !           356: 
        !           357:       onew = t_open (zdevice, O_RDWR, (struct t_info *) NULL);
        !           358:       if (onew < 0)
        !           359:        ulog (LOG_FATAL, "t_open (%s): %s", zdevice, ztlierror ());
        !           360:          
        !           361:       if (fcntl (onew, F_SETFD,
        !           362:                 fcntl (onew, F_GETFD, 0) | FD_CLOEXEC) < 0)
        !           363:        ulog (LOG_FATAL, "fcntl (FD_CLOEXEC): %s", strerror (errno));
        !           364: 
        !           365:       if (t_bind (onew, (struct t_bind *) NULL, (struct t_bind *) NULL) < 0)
        !           366:        ulog (LOG_FATAL, "t_bind: %s", ztlierror ());
        !           367: 
        !           368:       if (t_accept (qsysdep->o, onew, qtcall) < 0)
        !           369:        {
        !           370:          /* We may have received a disconnect.  */
        !           371:          if (t_errno != TLOOK)
        !           372:            ulog (LOG_FATAL, "t_accept: %s", ztlierror ());
        !           373:          if (t_rcvdis (qsysdep->o, (struct t_discon *) NULL) < 0)
        !           374:            ulog (LOG_FATAL, "t_rcvdis: %s", ztlierror ());
        !           375:          (void) t_close (onew);
        !           376:          continue;
        !           377:        }
        !           378: 
        !           379:       DEBUG_MESSAGE0 (DEBUG_PORT,
        !           380:                      "ftli_open: Got connection; forking");
        !           381: 
        !           382:       ipid = ixsfork ();
        !           383:       if (ipid < 0)
        !           384:        ulog (LOG_FATAL, "fork: %s", strerror (errno));
        !           385:       if (ipid == 0)
        !           386:        {
        !           387:          ulog_close ();
        !           388: 
        !           389:          (void) t_close (qsysdep->o);
        !           390:          qsysdep->o = onew;
        !           391: 
        !           392:          /* Push any desired modules.  */
        !           393:          if (! ftli_push (qconn))
        !           394:            _exit (EXIT_FAILURE);
        !           395: 
        !           396:          /* Now we fork and let our parent die, so that we become
        !           397:             a child of init.  This lets the main server code wait
        !           398:             for its child and then continue without accumulating
        !           399:             zombie children.  */
        !           400:          ipid = ixsfork ();
        !           401:          if (ipid < 0)
        !           402:            {
        !           403:              ulog (LOG_ERROR, "fork: %s", strerror (errno));
        !           404:              _exit (EXIT_FAILURE);
        !           405:            }
        !           406:              
        !           407:          if (ipid != 0)
        !           408:            _exit (EXIT_SUCCESS);
        !           409: 
        !           410:          ulog_id (getpid ());
        !           411: 
        !           412:          return TRUE;
        !           413:        }
        !           414: 
        !           415:       (void) t_close (onew);
        !           416: 
        !           417:       /* Now wait for the child.  */
        !           418:       (void) ixswait ((unsigned long) ipid, (const char *) NULL);
        !           419:     }
        !           420: 
        !           421:   /* We got a signal.  */
        !           422:   usysdep_exit (FALSE);
        !           423: 
        !           424:   /* Avoid compiler warnings.  */
        !           425:   return FALSE;
        !           426: }
        !           427: 
        !           428: /* Close the port.  */
        !           429: 
        !           430: /*ARGSUSED*/
        !           431: static boolean
        !           432: ftli_close (qconn, puuconf, qdialer, fsuccess)
        !           433:      struct sconnection *qconn;
        !           434:      pointer puuconf;
        !           435:      struct uuconf_dialer *qdialer;
        !           436:      boolean fsuccess;
        !           437: {
        !           438:   struct ssysdep_conn *qsysdep;
        !           439:   boolean fret;
        !           440: 
        !           441:   qsysdep = (struct ssysdep_conn *) qconn->psysdep;
        !           442: 
        !           443:   fret = TRUE;
        !           444:   if (qsysdep->o >= 0)
        !           445:     {
        !           446:       if (qsysdep->ftli)
        !           447:        {
        !           448:          if (t_close (qsysdep->o) < 0)
        !           449:            {
        !           450:              ulog (LOG_ERROR, "t_close: %s", ztlierror ());
        !           451:              fret = FALSE;
        !           452:            }
        !           453:        }
        !           454:       else
        !           455:        {
        !           456:          if (close (qsysdep->o) < 0)
        !           457:            {
        !           458:              ulog (LOG_ERROR, "close: %s", strerror (errno));
        !           459:              fret = FALSE;
        !           460:            }
        !           461:        }
        !           462: 
        !           463:       qsysdep->o = -1;
        !           464:     }
        !           465: 
        !           466:   return fret;
        !           467: }
        !           468: 
        !           469: /* Reset the port.  This will be called by a child which was forked
        !           470:    off in ftli_open, above.  We don't want uucico to continue looping
        !           471:    and giving login prompts, so we pretend that we received a SIGINT
        !           472:    signal.  This should probably be handled more cleanly.  The signal
        !           473:    will not be recorded in the log file because we don't set
        !           474:    afLog_signal[INDEXSIG_SIGINT].  */
        !           475: 
        !           476: /*ARGSUSED*/
        !           477: static boolean
        !           478: ftli_reset (qconn)
        !           479:      struct sconnection *qconn;
        !           480: {
        !           481:   afSignal[INDEXSIG_SIGINT] = TRUE;
        !           482:   return TRUE;
        !           483: }
        !           484: 
        !           485: /* Dial out on a TLI port, so to speak: connect to a remote computer.  */
        !           486: 
        !           487: /*ARGSUSED*/
        !           488: static boolean
        !           489: ftli_dial (qconn, puuconf, qsys, zphone, qdialer, ptdialerfound)
        !           490:      struct sconnection *qconn;
        !           491:      pointer puuconf;
        !           492:      const struct uuconf_system *qsys;
        !           493:      const char *zphone;
        !           494:      struct uuconf_dialer *qdialer;
        !           495:      enum tdialerfound *ptdialerfound;
        !           496: {
        !           497:   struct ssysdep_conn *qsysdep;
        !           498:   char **pzdialer;
        !           499:   const char *zaddr;
        !           500:   struct t_call *qtcall;
        !           501:   char *zescape;
        !           502: 
        !           503:   qsysdep = (struct ssysdep_conn *) qconn->psysdep;
        !           504: 
        !           505:   *ptdialerfound = DIALERFOUND_FALSE;
        !           506: 
        !           507:   pzdialer = qconn->qport->uuconf_u.uuconf_stli.uuconf_pzdialer;
        !           508:   if (*pzdialer == NULL)
        !           509:     pzdialer = NULL;
        !           510: 
        !           511:   /* If the first dialer is "TLI" or "TLIS", we use the first token
        !           512:      (pzdialer[1]) as the address to connect to.  */
        !           513:   zaddr = zphone;
        !           514:   if (pzdialer != NULL
        !           515:       && (strcmp (pzdialer[0], "TLI") == 0
        !           516:          || strcmp (pzdialer[0], "TLIS") == 0))
        !           517:     {
        !           518:       if (pzdialer[1] == NULL)
        !           519:        ++pzdialer;
        !           520:       else
        !           521:        {
        !           522:          if (strcmp (pzdialer[1], "\\D") != 0
        !           523:              && strcmp (pzdialer[1], "\\T") != 0)
        !           524:            zaddr = pzdialer[1];
        !           525:          pzdialer += 2;
        !           526:        }
        !           527:     }
        !           528:   
        !           529:   if (zaddr == NULL)
        !           530:     {
        !           531:       ulog (LOG_ERROR, "No address for TLI connection");
        !           532:       return FALSE;
        !           533:     }
        !           534: 
        !           535:   qtcall = (struct t_call *) t_alloc (qsysdep->o, T_CALL, T_ADDR);
        !           536:   if (qtcall == NULL)
        !           537:     {
        !           538:       ulog (LOG_ERROR, "t_alloc (T_CALL): %s", ztlierror ());
        !           539:       return FALSE;
        !           540:     }
        !           541: 
        !           542:   zescape = zbufcpy (zaddr);
        !           543:   qtcall->addr.len = cescape (zescape);
        !           544:   if (qtcall->addr.len > qtcall->addr.maxlen)
        !           545:     {
        !           546:       ulog (LOG_ERROR, "%s: TLI address too long (max %d)", zaddr,
        !           547:            qtcall->addr.maxlen);
        !           548:       ubuffree (zescape);
        !           549:       return FALSE;
        !           550:     }
        !           551:   memcpy (qtcall->addr.buf, zescape, qtcall->addr.len);
        !           552:   ubuffree (zescape);
        !           553: 
        !           554:   if (t_connect (qsysdep->o, qtcall, (struct t_call *) NULL) < 0)
        !           555:     {
        !           556:       if (t_errno != TLOOK)
        !           557:        ulog (LOG_ERROR, "t_connect: %s", ztlierror ());
        !           558:       else
        !           559:        {
        !           560:          if (t_rcvdis (qsysdep->o, (struct t_discon *) NULL) < 0)
        !           561:            ulog (LOG_ERROR, "t_rcvdis: %s", ztlierror ());
        !           562:          else
        !           563:            ulog (LOG_ERROR, "Connection refused");
        !           564:        }
        !           565:       return FALSE;
        !           566:     }
        !           567: 
        !           568:   /* We've connected to the remote.  Push any desired modules.  */
        !           569:   if (! ftli_push (qconn))
        !           570:     return FALSE;      
        !           571: 
        !           572:   /* Handle the rest of the dialer sequence.  This is similar to
        !           573:      fmodem_dial, and they should, perhaps, be combined somehow.  */
        !           574:   if (pzdialer != NULL)
        !           575:     {
        !           576:       boolean ffirst;
        !           577: 
        !           578:       ffirst = TRUE;
        !           579:       while (*pzdialer != NULL)
        !           580:        {
        !           581:          int iuuconf;
        !           582:          struct uuconf_dialer *q;
        !           583:          struct uuconf_dialer s;
        !           584:          const char *ztoken;
        !           585:          boolean ftranslate;
        !           586: 
        !           587:          if (! ffirst)
        !           588:            q = &s;
        !           589:          else
        !           590:            q = qdialer;
        !           591: 
        !           592:          iuuconf = uuconf_dialer_info (puuconf, *pzdialer, q);
        !           593:          if (iuuconf == UUCONF_NOT_FOUND)
        !           594:            {
        !           595:              ulog (LOG_ERROR, "%s: Dialer not found", *pzdialer);
        !           596:              return FALSE;
        !           597:            }
        !           598:          else if (iuuconf != UUCONF_SUCCESS)
        !           599:            {
        !           600:              ulog_uuconf (LOG_ERROR, puuconf, iuuconf);
        !           601:              return FALSE;
        !           602:            }
        !           603: 
        !           604:          ++pzdialer;
        !           605:          ztoken = *pzdialer;
        !           606: 
        !           607:          ftranslate = FALSE;
        !           608:          if (ztoken == NULL
        !           609:              || strcmp (ztoken, "\\D") == 0)
        !           610:            ztoken = zphone;
        !           611:          else if (strcmp (ztoken, "\\T") == 0)
        !           612:            {
        !           613:              ztoken = zphone;
        !           614:              ftranslate = TRUE;
        !           615:            }
        !           616: 
        !           617:          if (! fchat (qconn, puuconf, &q->uuconf_schat,
        !           618:                       (const struct uuconf_system *) NULL, q,
        !           619:                       zphone, ftranslate, qconn->qport->uuconf_zname,
        !           620:                       (long) 0))
        !           621:            {
        !           622:              (void) uuconf_dialer_free (puuconf, q);
        !           623:              if (! ffirst)
        !           624:                (void) uuconf_dialer_free (puuconf, qdialer);
        !           625:              return FALSE;
        !           626:            }
        !           627: 
        !           628:          if (ffirst)
        !           629:            {
        !           630:              *ptdialerfound = DIALERFOUND_FREE;
        !           631:              ffirst = FALSE;
        !           632:            }
        !           633:          else
        !           634:            (void) uuconf_dialer_free (puuconf, q);
        !           635: 
        !           636:          if (*pzdialer != NULL)
        !           637:            ++pzdialer;
        !           638:        }
        !           639:     }
        !           640: 
        !           641:   return TRUE;
        !           642: }
        !           643: 
        !           644: #endif /* HAVE_TLI */

unix.superglobalmegacorp.com

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