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

1.1     ! root        1: /* vsinfo.c
        !             2:    Get information about a system from the V2 configuration files.
        !             3: 
        !             4:    Copyright (C) 1992 Ian Lance Taylor
        !             5: 
        !             6:    This file is part of the Taylor UUCP uuconf library.
        !             7: 
        !             8:    This library is free software; you can redistribute it and/or
        !             9:    modify it under the terms of the GNU Library General Public License
        !            10:    as published by the Free Software Foundation; either version 2 of
        !            11:    the License, or (at your option) any later version.
        !            12: 
        !            13:    This library 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:    Library General Public License for more details.
        !            17: 
        !            18:    You should have received a copy of the GNU Library General Public
        !            19:    License along with this library; 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 "uucnfi.h"
        !            27: 
        !            28: #if USE_RCS_ID
        !            29: const char _uuconf_vsinfo_rcsid[] = "$Id: vsinfo.c,v 1.1 93/07/30 08:08:21 bin Exp Locker: bin $";
        !            30: #endif
        !            31: 
        !            32: #include <errno.h>
        !            33: #include <ctype.h>
        !            34: 
        !            35: /* Get the information for a particular system from the V2
        !            36:    configuration files.  This does not make sure that all the default
        !            37:    values are set.  */
        !            38: 
        !            39: int
        !            40: _uuconf_iv2_system_internal (qglobal, zsystem, qsys)
        !            41:      struct sglobal *qglobal;
        !            42:      const char *zsystem;
        !            43:      struct uuconf_system *qsys;
        !            44: {
        !            45:   char *zline;
        !            46:   size_t cline;
        !            47:   char **pzsplit;
        !            48:   size_t csplit;
        !            49:   char **pzcomma;
        !            50:   size_t ccomma;
        !            51:   FILE *e;
        !            52:   int cchars;
        !            53:   pointer pblock;
        !            54:   int iret;
        !            55: 
        !            56:   e = fopen (qglobal->qprocess->zv2systems, "r");
        !            57:   if (e == NULL)
        !            58:     {
        !            59:       if (FNO_SUCH_FILE ())
        !            60:        return UUCONF_NOT_FOUND;
        !            61:       qglobal->ierrno = errno;
        !            62:       qglobal->zfilename = qglobal->qprocess->zv2systems;
        !            63:       return (UUCONF_FOPEN_FAILED
        !            64:              | UUCONF_ERROR_ERRNO
        !            65:              | UUCONF_ERROR_FILENAME);
        !            66:     }
        !            67: 
        !            68:   zline = NULL;
        !            69:   cline = 0;
        !            70:   pzsplit = NULL;
        !            71:   csplit = 0;
        !            72:   pzcomma = NULL;
        !            73:   ccomma = 0;
        !            74: 
        !            75:   pblock = NULL;
        !            76:   iret = UUCONF_SUCCESS;
        !            77: 
        !            78:   qglobal->ilineno = 0;
        !            79: 
        !            80:   while ((cchars = getline (&zline, &cline, e)) > 0)
        !            81:     {
        !            82:       int ctoks, ctimes, i;
        !            83:       struct uuconf_system *qset;
        !            84:       char *z, *zretry;
        !            85:       int cretry;
        !            86: 
        !            87:       ++qglobal->ilineno;
        !            88: 
        !            89:       --cchars;
        !            90:       if (zline[cchars] == '\n')
        !            91:        zline[cchars] = '\0';
        !            92:       zline[strcspn (zline, "#")] = '\0';
        !            93: 
        !            94:       ctoks = _uuconf_istrsplit (zline, '\0', &pzsplit, &csplit);
        !            95:       if (ctoks < 0)
        !            96:        {
        !            97:          qglobal->ierrno = errno;
        !            98:          iret = UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO;
        !            99:          break;
        !           100:        }
        !           101: 
        !           102:       /* If this isn't the system we're looking for, keep reading
        !           103:         the file.  */
        !           104:       if (ctoks < 1
        !           105:          || strcmp (zsystem, pzsplit[0]) != 0)
        !           106:        continue;
        !           107: 
        !           108:       /* If this is the first time we've found the system, we want
        !           109:         to set *qsys directly.  Otherwise, we allocate a new
        !           110:         alternate.  */
        !           111:       if (pblock == NULL)
        !           112:        {
        !           113:          pblock = uuconf_malloc_block ();
        !           114:          if (pblock == NULL)
        !           115:            {
        !           116:              qglobal->ierrno = errno;
        !           117:              iret = UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO;
        !           118:              break;
        !           119:            }
        !           120:          _uuconf_uclear_system (qsys);
        !           121:          qsys->uuconf_palloc = pblock;
        !           122:          qset = qsys;
        !           123:        }
        !           124:       else
        !           125:        {
        !           126:          struct uuconf_system **pq;
        !           127: 
        !           128:          qset = ((struct uuconf_system *)
        !           129:                  uuconf_malloc (pblock, sizeof (struct uuconf_system)));
        !           130:          if (qset == NULL)
        !           131:            {
        !           132:              qglobal->ierrno = errno;
        !           133:              iret = UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO;
        !           134:              break;
        !           135:            }
        !           136:          _uuconf_uclear_system (qset);
        !           137:          for (pq = &qsys->uuconf_qalternate;
        !           138:               *pq != NULL;
        !           139:               pq = &(*pq)->uuconf_qalternate)
        !           140:            ;
        !           141:          *pq = qset;
        !           142:        }
        !           143: 
        !           144:       /* Add this line to the memory block we are building for the
        !           145:         system.  */
        !           146:       if (uuconf_add_block (pblock, zline) != 0)
        !           147:        {
        !           148:          qglobal->ierrno = errno;
        !           149:          iret = UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO;
        !           150:          break;
        !           151:        }
        !           152: 
        !           153:       zline = NULL;
        !           154:       cline = 0;
        !           155: 
        !           156:       /* The format of a line in Systems is
        !           157:         system time device speed phone chat
        !           158:         For example,
        !           159:         airs Any ACU 9600 5551212 ogin: foo pass: bar
        !           160:         */
        !           161: 
        !           162:       /* Get the system name.  */
        !           163: 
        !           164:       qset->uuconf_zname = pzsplit[0];
        !           165:       qset->uuconf_fcall = TRUE;
        !           166:       qset->uuconf_fcalled = TRUE;
        !           167: 
        !           168:       if (ctoks < 2)
        !           169:        continue;
        !           170: 
        !           171:       /* A time string is "time/grade,time/grade;retry".  A missing
        !           172:         grade is taken as BGRADE_LOW.  On some versions the retry
        !           173:         time is actually separated by a comma, which won't work right
        !           174:         here.  */
        !           175:       zretry = strchr (pzsplit[1], ';');
        !           176:       if (zretry == NULL)
        !           177:        cretry = 0;
        !           178:       else
        !           179:        {
        !           180:          *zretry = '\0';
        !           181:          cretry = (int) strtol (zretry + 1, (char **) NULL, 10);
        !           182:        }
        !           183: 
        !           184:       ctimes = _uuconf_istrsplit (pzsplit[1], ',', &pzcomma, &ccomma);
        !           185:       if (ctimes < 0)
        !           186:        {
        !           187:          qglobal->ierrno = errno;
        !           188:          iret = UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO;
        !           189:          break;
        !           190:        }
        !           191: 
        !           192:       for (i = 0; i < ctimes; i++)
        !           193:        {
        !           194:          char *zslash;
        !           195:          char bgrade;
        !           196: 
        !           197:          z = pzcomma[i];
        !           198:          zslash = strchr (z, '/');
        !           199:          if (zslash == NULL)
        !           200:            bgrade = UUCONF_GRADE_LOW;
        !           201:          else
        !           202:            {
        !           203:              *zslash = '\0';
        !           204:              bgrade = zslash[1];
        !           205:              if (! UUCONF_GRADE_LEGAL (bgrade))
        !           206:                bgrade = UUCONF_GRADE_LOW;
        !           207:            }
        !           208: 
        !           209:          iret = _uuconf_itime_parse (qglobal, z, (long) bgrade, cretry,
        !           210:                                      _uuconf_itime_grade_cmp,
        !           211:                                      &qset->uuconf_qtimegrade,
        !           212:                                      pblock);
        !           213:          if (iret != UUCONF_SUCCESS)
        !           214:            break;
        !           215:        }
        !           216: 
        !           217:       if (iret != UUCONF_SUCCESS)
        !           218:        break;
        !           219: 
        !           220:       if (ctoks < 3)
        !           221:        continue;
        !           222: 
        !           223:       /* Pick up the device name.  It can be followed by a comma and a
        !           224:         list of protocols (this is not actually supported by most V2
        !           225:         systems, but it should be compatible).  */
        !           226:       qset->uuconf_zport = pzsplit[2];
        !           227:       z = strchr (pzsplit[2], ',');
        !           228:       if (z != NULL)
        !           229:        {
        !           230:          qset->uuconf_zprotocols = z + 1;
        !           231:          *z = '\0';
        !           232:        }
        !           233: 
        !           234:       /* If the port is "TCP", we set up a system specific port.  The
        !           235:         baud rate becomes the service number and the phone number
        !           236:         becomes the address (still stored in qsys->zphone).  */
        !           237:       if (strcmp (qset->uuconf_zport, "TCP") == 0)
        !           238:        {
        !           239:          qset->uuconf_zport = NULL;
        !           240:          qset->uuconf_qport = ((struct uuconf_port *)
        !           241:                                uuconf_malloc (pblock,
        !           242:                                               sizeof (struct uuconf_port)));
        !           243:          if (qset->uuconf_qport == NULL)
        !           244:            {
        !           245:              qglobal->ierrno = errno;
        !           246:              iret = UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO;
        !           247:              break;
        !           248:            }
        !           249:          _uuconf_uclear_port (qset->uuconf_qport);
        !           250:          qset->uuconf_qport->uuconf_zname = (char *) "TCP";
        !           251:          qset->uuconf_qport->uuconf_ttype = UUCONF_PORTTYPE_TCP;
        !           252:          qset->uuconf_qport->uuconf_ireliable
        !           253:            = (UUCONF_RELIABLE_ENDTOEND | UUCONF_RELIABLE_RELIABLE
        !           254:               | UUCONF_RELIABLE_EIGHT | UUCONF_RELIABLE_FULLDUPLEX
        !           255:               | UUCONF_RELIABLE_SPECIFIED);
        !           256:          if (ctoks < 4)
        !           257:            qset->uuconf_qport->uuconf_u.uuconf_stcp.uuconf_zport
        !           258:              = (char *) "uucp";
        !           259:          else
        !           260:            qset->uuconf_qport->uuconf_u.uuconf_stcp.uuconf_zport
        !           261:              = pzsplit[3];
        !           262:        }
        !           263: 
        !           264:       if (ctoks < 4)
        !           265:        continue;
        !           266: 
        !           267:       qset->uuconf_ibaud = strtol (pzsplit[3], (char **) NULL, 10);
        !           268: 
        !           269:       if (ctoks < 5)
        !           270:        continue;
        !           271: 
        !           272:       /* Get the phone number.  */
        !           273:       qset->uuconf_zphone = pzsplit[4];
        !           274: 
        !           275:       if (ctoks < 6)
        !           276:        continue;
        !           277: 
        !           278:       /* Get the chat script.  We just hand this off to the chat
        !           279:         script processor, so that it will parse subsend and
        !           280:         subexpect strings correctly.  */
        !           281:       pzsplit[4] = (char *) "chat";
        !           282:       iret = _uuconf_ichat_cmd (qglobal, ctoks - 4, pzsplit + 4,
        !           283:                                &qset->uuconf_schat, pblock);
        !           284:       iret &=~ UUCONF_CMDTABRET_KEEP;
        !           285:       if (iret != UUCONF_SUCCESS)
        !           286:        break;
        !           287:     }
        !           288: 
        !           289:   (void) fclose (e);
        !           290: 
        !           291:   if (pzcomma != NULL)
        !           292:     free ((pointer) pzcomma);
        !           293: 
        !           294:   if (iret != UUCONF_SUCCESS)
        !           295:     {
        !           296:       if (zline != NULL)
        !           297:        free ((pointer) zline);
        !           298:       if (pzsplit != NULL)
        !           299:        free ((pointer) pzsplit);
        !           300:       qglobal->zfilename = qglobal->qprocess->zv2systems;
        !           301:       return iret | UUCONF_ERROR_FILENAME | UUCONF_ERROR_LINENO;
        !           302:     }
        !           303: 
        !           304:   if (pblock == NULL)
        !           305:     {
        !           306:       if (zline != NULL)
        !           307:        free ((pointer) zline);
        !           308:       if (pzsplit != NULL)
        !           309:        free ((pointer) pzsplit);
        !           310:       return UUCONF_NOT_FOUND;
        !           311:     }
        !           312: 
        !           313:   /* Now read USERFILE and L.cmds to get permissions.  We can't fully
        !           314:      handle USERFILE since that specifies permissions based on local
        !           315:      users which we do not support.  */
        !           316:   {
        !           317:     e = fopen (qglobal->qprocess->zv2userfile, "r");
        !           318:     if (e != NULL)
        !           319:       {
        !           320:        char **pzlocal, **pzremote;
        !           321:        boolean fdefault_callback;
        !           322:        char *zdefault_login;
        !           323:        struct uuconf_system *q;
        !           324: 
        !           325:        pzlocal = NULL;
        !           326:        pzremote = NULL;
        !           327:        fdefault_callback = FALSE;
        !           328:        zdefault_login = NULL;
        !           329: 
        !           330:        qglobal->ilineno = 0;
        !           331: 
        !           332:        while ((cchars = getline (&zline, &cline, e)) > 0)
        !           333:          {
        !           334:            int ctoks;
        !           335:            char *zcomma;
        !           336:            boolean fcallback;
        !           337:            char **pzlist, **pznew;
        !           338: 
        !           339:            ++qglobal->ilineno;
        !           340: 
        !           341:            --cchars;
        !           342:            if (zline[cchars] == '\n')
        !           343:              zline[cchars] = '\0';
        !           344:            zline[strcspn (zline, "#")] = '\0';
        !           345: 
        !           346:            ctoks = _uuconf_istrsplit (zline, '\0', &pzsplit, &csplit);
        !           347:            if (ctoks < 0)
        !           348:              {
        !           349:                qglobal->ierrno = errno;
        !           350:                iret = UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO;
        !           351:                break;
        !           352:              }
        !           353: 
        !           354:            if (ctoks == 0)
        !           355:              continue;
        !           356: 
        !           357:            /* The first field is username,machinename */
        !           358:            zcomma = strchr (pzsplit[0], ',');
        !           359:            if (zcomma == NULL)
        !           360:              continue;
        !           361: 
        !           362:            *zcomma++ = '\0';
        !           363: 
        !           364:            /* The rest of the line is the list of directories, except
        !           365:               that if the first directory is "c" we must call the
        !           366:               system back.  */
        !           367:            fcallback = FALSE;
        !           368:            pzlist = pzsplit + 1;
        !           369:            --ctoks;
        !           370:            if (ctoks > 0
        !           371:                && pzsplit[1][0] == 'c'
        !           372:                && pzsplit[1][1] == '\0')
        !           373:              {
        !           374:                fcallback = TRUE;
        !           375:                pzlist = pzsplit + 2;
        !           376:                --ctoks;
        !           377:              }
        !           378: 
        !           379:            /* Now pzsplit[0] is the user name, zcomma is the system
        !           380:               name, fcallback indicates whether a call back is
        !           381:               required, ctoks is the number of directories and pzlist
        !           382:               points to the directories.  If the system name matches,
        !           383:               then the user name is the name that the system must use
        !           384:               to log in, and the list of directories is what may be
        !           385:               transferred in by either local or remote request.
        !           386:               Otherwise, if no system name matches, then the first
        !           387:               line with no user name gives the list of directories
        !           388:               that may be transferred by local request, and the first
        !           389:               line with no system name gives the list of directories
        !           390:               that may be transferred by remote request.  */
        !           391:            if ((pzsplit[0][0] != '\0' || pzlocal != NULL)
        !           392:                && (zcomma[0] != '\0' || pzremote != NULL)
        !           393:                && strcmp (zcomma, zsystem) != 0)
        !           394:              continue;
        !           395: 
        !           396:            /* NULL terminate the list of directories.  */
        !           397:            pznew = (char **) uuconf_malloc (pblock,
        !           398:                                              (ctoks + 1) * sizeof (char *));
        !           399:            if (pznew == NULL)
        !           400:              {
        !           401:                qglobal->ierrno = errno;
        !           402:                iret = UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO;
        !           403:                break;
        !           404:              }
        !           405:            memcpy ((pointer) pznew, (pointer) pzlist,
        !           406:                    ctoks * sizeof (char *));
        !           407:            pznew[ctoks] = NULL;
        !           408: 
        !           409:            if (uuconf_add_block (pblock, zline) != 0)
        !           410:              {
        !           411:                qglobal->ierrno = errno;
        !           412:                iret = UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO;
        !           413:                break;
        !           414:              }
        !           415:            zline = NULL;
        !           416:            cline = 0;
        !           417: 
        !           418:            if (pzsplit[0][0] == '\0')
        !           419:              {
        !           420:                pzlocal = pznew;
        !           421:                fdefault_callback = fcallback;
        !           422:              }
        !           423:            else if (zcomma[0] == '\0')
        !           424:              {
        !           425:                pzremote = pznew;
        !           426:                zdefault_login = pzsplit[0];
        !           427:              }
        !           428:            else
        !           429:              {
        !           430:                /* Both the login name and the machine name were
        !           431:                   listed; require the machine to be logged in under
        !           432:                   this name.  This is not fully backward compatible,
        !           433:                   and perhaps should be changed.  On the other hand,
        !           434:                   it is more useful.  */
        !           435:                for (q = qsys; q != NULL; q = q->uuconf_qalternate)
        !           436:                  {
        !           437:                    q->uuconf_zcalled_login = pzsplit[0];
        !           438:                    q->uuconf_fcallback = fcallback;
        !           439:                    q->uuconf_pzlocal_send = pznew;
        !           440:                    q->uuconf_pzlocal_receive = pznew;
        !           441:                    q->uuconf_pzremote_send = pznew;
        !           442:                    q->uuconf_pzremote_receive = pznew;
        !           443:                  }
        !           444: 
        !           445:                break;
        !           446:              }
        !           447:          }
        !           448: 
        !           449:        (void) fclose (e);
        !           450: 
        !           451:        if (iret != UUCONF_SUCCESS)
        !           452:          {
        !           453:            if (zline != NULL)
        !           454:              free ((pointer) zline);
        !           455:            if (pzsplit != NULL)
        !           456:              free ((pointer) pzsplit);
        !           457:            qglobal->zfilename = qglobal->qprocess->zv2userfile;
        !           458:            return iret | UUCONF_ERROR_FILENAME | UUCONF_ERROR_LINENO;
        !           459:          }
        !           460: 
        !           461:        if (qsys->uuconf_pzlocal_send == (char **) &_uuconf_unset
        !           462:            && pzlocal != NULL)
        !           463:          {
        !           464:            for (q = qsys; q != NULL; q = q->uuconf_qalternate)
        !           465:              {
        !           466:                q->uuconf_fcallback = fdefault_callback;
        !           467:                q->uuconf_pzlocal_send = pzlocal;
        !           468:                q->uuconf_pzlocal_receive = pzlocal;
        !           469:              }
        !           470:          }
        !           471: 
        !           472:        if (qsys->uuconf_pzremote_send == (char **) &_uuconf_unset
        !           473:            && pzremote != NULL)
        !           474:          {
        !           475:            for (q = qsys; q != NULL; q = q->uuconf_qalternate)
        !           476:              {
        !           477:                q->uuconf_zcalled_login = zdefault_login;
        !           478:                q->uuconf_pzremote_send = pzremote;
        !           479:                q->uuconf_pzremote_receive = pzremote;
        !           480:              }
        !           481:          }
        !           482:       }
        !           483:   }
        !           484: 
        !           485:   /* Now we must read L.cmds to determine which commands may be
        !           486:      executed.  */
        !           487:   {
        !           488:     e = fopen (qglobal->qprocess->zv2cmds, "r");
        !           489:     if (e != NULL)
        !           490:       {
        !           491:        qglobal->ilineno = 0;
        !           492: 
        !           493:        if (getline (&zline, &cline, e) > 0)
        !           494:          {
        !           495:            ++qglobal->ilineno;
        !           496: 
        !           497:            zline[strcspn (zline, "#\n")] = '\0';
        !           498:            if (strncmp (zline, "PATH=", sizeof "PATH=" - 1) == 0)
        !           499:              {
        !           500:                int ctoks;
        !           501:                char **pznew;
        !           502: 
        !           503:                zline += sizeof "PATH=" - 1;
        !           504:                ctoks = _uuconf_istrsplit (zline, ':', &pzsplit, &csplit);
        !           505:                if (ctoks < 0)
        !           506:                  {
        !           507:                    qglobal->ierrno = errno;
        !           508:                    iret = UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO;
        !           509:                  }
        !           510: 
        !           511:                pznew = NULL;
        !           512:                if (iret == UUCONF_SUCCESS)
        !           513:                  {
        !           514:                    pznew = ((char **)
        !           515:                             uuconf_malloc (pblock,
        !           516:                                             (ctoks + 1) * sizeof (char *)));
        !           517:                    if (pznew == NULL)
        !           518:                      iret = UUCONF_MALLOC_FAILED | UUCONF_ERROR_ERRNO;
        !           519:                  }
        !           520:                if (iret == UUCONF_SUCCESS)
        !           521:                  {
        !           522:                    memcpy ((pointer) pznew, (pointer) pzsplit,
        !           523:                            ctoks * sizeof (char *));
        !           524:                    pznew[ctoks] = NULL;
        !           525:                    qsys->uuconf_pzpath = pznew;
        !           526:                    zline = NULL;
        !           527:                    cline = 0;
        !           528:                  }      
        !           529: 
        !           530:                if (getline (&zline, &cline, e) < 0)
        !           531:                  {
        !           532:                    if (zline != NULL)
        !           533:                      {
        !           534:                        free ((pointer) zline);
        !           535:                        zline = NULL;
        !           536:                      }
        !           537:                  }
        !           538:                else
        !           539:                  ++qglobal->ilineno;
        !           540:              }
        !           541:          }
        !           542: 
        !           543:        if (iret == UUCONF_SUCCESS && zline != NULL)
        !           544:          {
        !           545:            while (TRUE)
        !           546:              {
        !           547:                zline[strcspn (zline, "#\n")] = '\0';
        !           548:                iret = _uuconf_iadd_string (qglobal, zline, TRUE, FALSE,
        !           549:                                            &qsys->uuconf_pzcmds,
        !           550:                                            pblock);
        !           551:                if (iret != UUCONF_SUCCESS)
        !           552:                  break;
        !           553:                if (getline (&zline, &cline, e) < 0)
        !           554:                  break;
        !           555:                ++qglobal->ilineno;
        !           556:              }
        !           557:          }
        !           558: 
        !           559:        (void) fclose (e);
        !           560: 
        !           561:        if (iret != UUCONF_SUCCESS)
        !           562:          {
        !           563:            qglobal->zfilename = qglobal->qprocess->zv2cmds;
        !           564:            iret |= UUCONF_ERROR_FILENAME | UUCONF_ERROR_LINENO;
        !           565:          }
        !           566:       }
        !           567:   }
        !           568: 
        !           569:   if (zline != NULL)
        !           570:     free ((pointer) zline);
        !           571:   if (pzsplit != NULL)
        !           572:     free ((pointer) pzsplit);
        !           573: 
        !           574:   return iret;
        !           575: }

unix.superglobalmegacorp.com

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