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

1.1     ! root        1: /* xcmd.c
        !             2:    Routines to handle work requests.
        !             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 xcmd_rcsid[] = "$Id: xcmd.c,v 1.1 93/07/30 08:00:19 bin Exp Locker: bin $";
        !            30: #endif
        !            31: 
        !            32: #include <errno.h>
        !            33: 
        !            34: #include "uudefs.h"
        !            35: #include "uuconf.h"
        !            36: #include "system.h"
        !            37: #include "prot.h"
        !            38: #include "trans.h"
        !            39: 
        !            40: /* Local functions.  */
        !            41: 
        !            42: static boolean flocal_xcmd_request P((struct stransfer *qtrans,
        !            43:                                      struct sdaemon *qdaemon));
        !            44: static boolean flocal_xcmd_await_reply P((struct stransfer *qtrans,
        !            45:                                          struct sdaemon *qdaemon,
        !            46:                                          const char *zdata, size_t cdata));
        !            47: static boolean fremote_xcmd_reply P((struct stransfer *qtrans,
        !            48:                                     struct sdaemon *qdaemon));
        !            49: 
        !            50: /* Handle a local work request.  We just set up the request for
        !            51:    transmission.  */
        !            52: 
        !            53: boolean
        !            54: flocal_xcmd_init (qdaemon, qcmd)
        !            55:      struct sdaemon *qdaemon;
        !            56:      struct scmd *qcmd;
        !            57: {
        !            58:   struct stransfer *qtrans;
        !            59: 
        !            60:   qtrans = qtransalc (qcmd);
        !            61:   qtrans->psendfn = flocal_xcmd_request;
        !            62: 
        !            63:   return fqueue_local (qdaemon, qtrans);
        !            64: }
        !            65: 
        !            66: /* Send the execution request to the remote system.  */
        !            67: 
        !            68: static boolean
        !            69: flocal_xcmd_request (qtrans, qdaemon)
        !            70:      struct stransfer *qtrans;
        !            71:      struct sdaemon *qdaemon;
        !            72: {
        !            73:   size_t clen;
        !            74:   char *zsend;
        !            75:   boolean fret;
        !            76: 
        !            77:   ulog (LOG_NORMAL, "Requesting work: %s to %s", qtrans->s.zfrom,
        !            78:        qtrans->s.zto);
        !            79: 
        !            80:   /* We send the string
        !            81:      X from to user options
        !            82:      We put a dash in front of options.  */
        !            83:   clen = (strlen (qtrans->s.zfrom) + strlen (qtrans->s.zto)
        !            84:          + strlen (qtrans->s.zuser) + strlen (qtrans->s.zoptions) + 7);
        !            85:   zsend = zbufalc (clen);
        !            86:   sprintf (zsend, "X %s %s %s -%s", qtrans->s.zfrom, qtrans->s.zto,
        !            87:           qtrans->s.zuser, qtrans->s.zoptions);
        !            88: 
        !            89:   fret = (*qdaemon->qproto->pfsendcmd) (qdaemon, zsend, qtrans->ilocal,
        !            90:                                        qtrans->iremote);
        !            91:   ubuffree (zsend);
        !            92:   if (! fret)
        !            93:     {
        !            94:       utransfree (qtrans);
        !            95:       return FALSE;
        !            96:     }
        !            97: 
        !            98:   qtrans->fcmd = TRUE;
        !            99:   qtrans->precfn = flocal_xcmd_await_reply;
        !           100: 
        !           101:   return fqueue_receive (qdaemon, qtrans);
        !           102: }
        !           103: 
        !           104: /* Get a reply to an execution request from the remote system.  */
        !           105: 
        !           106: /*ARGSUSED*/
        !           107: static boolean
        !           108: flocal_xcmd_await_reply (qtrans, qdaemon, zdata, cdata)
        !           109:      struct stransfer *qtrans;
        !           110:      struct sdaemon *qdaemon;
        !           111:      const char *zdata;
        !           112:      size_t cdata;
        !           113: {
        !           114:   qtrans->precfn = NULL;
        !           115: 
        !           116:   if (zdata[0] != 'X'
        !           117:       || (zdata[1] != 'Y' && zdata[1] != 'N'))
        !           118:     {
        !           119:       ulog (LOG_ERROR, "Bad response to work request");
        !           120:       utransfree (qtrans);
        !           121:       return FALSE;
        !           122:     }
        !           123: 
        !           124:   if (zdata[1] == 'N')
        !           125:     {
        !           126:       ulog (LOG_ERROR, "%s: work request denied", qtrans->s.zfrom);
        !           127:       (void) fmail_transfer (FALSE, qtrans->s.zuser, (const char *) NULL,
        !           128:                             "work request denied",
        !           129:                             qtrans->s.zfrom, qdaemon->qsys->uuconf_zname,
        !           130:                             qtrans->s.zto, (const char *) NULL,
        !           131:                             (const char *) NULL);
        !           132:     }
        !           133: 
        !           134:   (void) fsysdep_did_work (qtrans->s.pseq);
        !           135:   utransfree (qtrans);
        !           136: 
        !           137:   return TRUE;
        !           138: }
        !           139: 
        !           140: /* Handle a remote work request.  This just queues up the requests for
        !           141:    later processing.  */
        !           142: 
        !           143: boolean
        !           144: fremote_xcmd_init (qdaemon, qcmd, iremote)
        !           145:      struct sdaemon *qdaemon;
        !           146:      struct scmd *qcmd;
        !           147:      int iremote;
        !           148: {
        !           149:   const struct uuconf_system *qsys;
        !           150:   const char *zexclam;
        !           151:   const struct uuconf_system *qdestsys;
        !           152:   struct uuconf_system sdestsys;
        !           153:   char *zdestfile;
        !           154:   boolean fmkdirs;
        !           155:   struct stransfer *qtrans;
        !           156:   char *zuser;
        !           157:   char aboptions[5];
        !           158:   char *zfrom;
        !           159:   boolean fret;
        !           160:   char *zfile;
        !           161: 
        !           162:   ulog (LOG_NORMAL, "Work requested: %s to %s", qcmd->zfrom,
        !           163:        qcmd->zto);
        !           164: 
        !           165:   qsys = qdaemon->qsys;
        !           166: 
        !           167:   zexclam = strchr (qcmd->zto, '!');
        !           168:   if (zexclam == NULL
        !           169:       || zexclam == qcmd->zto
        !           170:       || strncmp (qdaemon->zlocalname, qcmd->zto,
        !           171:                  (size_t) (zexclam - qcmd->zto)) == 0)
        !           172:     {
        !           173:       const char *zconst;
        !           174: 
        !           175:       /* The files are supposed to be copied to the local system.  */
        !           176:       qdestsys = NULL;
        !           177:       if (zexclam == NULL)
        !           178:        zconst = qcmd->zto;
        !           179:       else
        !           180:        zconst = zexclam + 1;
        !           181: 
        !           182:       zdestfile = zsysdep_local_file (zconst, qsys->uuconf_zpubdir);
        !           183:       if (zdestfile == NULL)
        !           184:        return FALSE;
        !           185: 
        !           186:       zuser = NULL;
        !           187:       fmkdirs = strchr (qcmd->zoptions, 'f') != NULL;
        !           188:     }
        !           189:   else
        !           190:     {
        !           191:       size_t clen;
        !           192:       char *zcopy;
        !           193:       int iuuconf;
        !           194:       char *zoptions;
        !           195: 
        !           196:       clen = zexclam - qcmd->zto;
        !           197:       zcopy = zbufalc (clen + 1);
        !           198:       memcpy (zcopy, qcmd->zto, clen);
        !           199:       zcopy[clen] = '\0';
        !           200: 
        !           201:       iuuconf = uuconf_system_info (qdaemon->puuconf, zcopy, &sdestsys);
        !           202:       if (iuuconf == UUCONF_NOT_FOUND)
        !           203:        {
        !           204:          if (! funknown_system (qdaemon->puuconf, zcopy, &sdestsys))
        !           205:            {
        !           206:              ulog (LOG_ERROR, "%s: System not found", zcopy);
        !           207:              ubuffree (zcopy);
        !           208:              qtrans = qtransalc (qcmd);
        !           209:              qtrans->psendfn = fremote_xcmd_reply;
        !           210:              qtrans->pinfo = (pointer) "XN";
        !           211:              qtrans->iremote = iremote;
        !           212:              return fqueue_remote (qdaemon, qtrans);
        !           213:            }
        !           214:        }
        !           215:       else if (iuuconf != UUCONF_SUCCESS)
        !           216:        {
        !           217:          ulog_uuconf (LOG_ERROR, qdaemon->puuconf, iuuconf);
        !           218:          ubuffree (zcopy);
        !           219:          return FALSE;
        !           220:        }
        !           221: 
        !           222:       ubuffree (zcopy);
        !           223: 
        !           224:       qdestsys = &sdestsys;
        !           225:       zdestfile = zbufcpy (zexclam + 1);
        !           226: 
        !           227:       zuser = zbufalc (strlen (qdestsys->uuconf_zname)
        !           228:                       + strlen (qcmd->zuser) + sizeof "!");
        !           229:       sprintf (zuser, "%s!%s", qdestsys->uuconf_zname, qcmd->zuser);
        !           230:       zoptions = aboptions;
        !           231:       *zoptions++ = 'C';
        !           232:       if (strchr (qcmd->zoptions, 'd') != NULL)
        !           233:        *zoptions++ = 'd';
        !           234:       if (strchr (qcmd->zoptions, 'm') != NULL)
        !           235:        *zoptions++ = 'm';
        !           236:       *zoptions = '\0';
        !           237:       fmkdirs = TRUE;
        !           238:     }
        !           239: 
        !           240:   /* At this point we prepare to confirm the remote request.  We could
        !           241:      actually fork here and let the child spool up the requests.  */
        !           242:   qtrans = qtransalc (qcmd);
        !           243:   qtrans->psendfn = fremote_xcmd_reply;
        !           244:   qtrans->pinfo = (pointer) "XY";
        !           245:   qtrans->iremote = iremote;
        !           246:   if (! fqueue_remote (qdaemon, qtrans))
        !           247:     {
        !           248:       ubuffree (zdestfile);
        !           249:       ubuffree (zuser);
        !           250:       return FALSE;
        !           251:     }
        !           252: 
        !           253:   /* Now we have to process each source file.  The source
        !           254:      specification may or may use wildcards.  */
        !           255:   zfrom = zsysdep_local_file (qcmd->zfrom, qsys->uuconf_zpubdir);
        !           256:   if (zfrom == NULL)
        !           257:     {
        !           258:       ubuffree (zdestfile);
        !           259:       ubuffree (zuser);
        !           260:       return FALSE;
        !           261:     }
        !           262: 
        !           263:   if (! fsysdep_wildcard_start (zfrom))
        !           264:     {
        !           265:       ubuffree (zfrom);
        !           266:       ubuffree (zdestfile);
        !           267:       ubuffree (zuser);
        !           268:       return FALSE;
        !           269:     }
        !           270: 
        !           271:   fret = TRUE;
        !           272: 
        !           273:   while ((zfile = zsysdep_wildcard (zfrom)) != NULL)
        !           274:     {
        !           275:       char *zto;
        !           276:       char abtname[CFILE_NAME_LEN];
        !           277: 
        !           278:       if (! fsysdep_file_exists (zfile))
        !           279:        {
        !           280:          ulog (LOG_ERROR, "%s: no such file", zfile);
        !           281:          continue;
        !           282:        }
        !           283: 
        !           284:       /* Make sure the remote system is permitted to read the
        !           285:         specified file.  */
        !           286:       if (! fin_directory_list (zfile, qsys->uuconf_pzremote_send,
        !           287:                                qsys->uuconf_zpubdir, TRUE, TRUE,
        !           288:                                (const char *) NULL))
        !           289:        {
        !           290:          ulog (LOG_ERROR, "%s: not permitted to send", zfile);
        !           291:          break;
        !           292:        }
        !           293: 
        !           294:       if (qdestsys != NULL)
        !           295:        {
        !           296:          /* We really should get the original grade here.  */
        !           297:          zto = zsysdep_data_file_name (qdestsys, qdaemon->zlocalname,
        !           298:                                        BDEFAULT_UUCP_GRADE, FALSE,
        !           299:                                        abtname, (char *) NULL,
        !           300:                                        (char *) NULL);
        !           301:          if (zto == NULL)
        !           302:            {
        !           303:              fret = FALSE;
        !           304:              break;
        !           305:            }
        !           306:        }
        !           307:       else
        !           308:        {
        !           309:          zto = zsysdep_add_base (zdestfile, zfile);
        !           310:          if (zto == NULL)
        !           311:            {
        !           312:              fret = FALSE;
        !           313:              break;
        !           314:            }
        !           315:          /* We only accept a local destination if the remote system
        !           316:             has the right to create files there.  */
        !           317:          if (! fin_directory_list (zto, qsys->uuconf_pzremote_receive,
        !           318:                                    qsys->uuconf_zpubdir, TRUE, FALSE,
        !           319:                                    (const char *) NULL))
        !           320:            {
        !           321:              ulog (LOG_ERROR, "%s: not permitted to receive", zto);
        !           322:              ubuffree (zto);
        !           323:              break;
        !           324:            }
        !           325:        }
        !           326: 
        !           327:       /* Copy the file either to the final destination or to the
        !           328:         spool directory.  */
        !           329:       if (! fcopy_file (zfile, zto, qdestsys == NULL, fmkdirs))
        !           330:        {
        !           331:          ubuffree (zto);
        !           332:          break;
        !           333:        }
        !           334: 
        !           335:       ubuffree (zto);
        !           336: 
        !           337:       /* If there is a destination system, queue it up.  */
        !           338:       if (qdestsys != NULL)
        !           339:        {
        !           340:          struct scmd ssend;
        !           341:          char *zjobid;
        !           342: 
        !           343:          ssend.bcmd = 'S';
        !           344:          ssend.pseq = NULL;
        !           345:          ssend.zfrom = zfile;
        !           346:          ssend.zto = zdestfile;
        !           347:          ssend.zuser = zuser;
        !           348:          ssend.zoptions = aboptions;
        !           349:          ssend.ztemp = abtname;
        !           350:          ssend.imode = ixsysdep_file_mode (zfile);
        !           351:          ssend.znotify = "";
        !           352:          ssend.cbytes = -1;
        !           353:          ssend.zcmd = NULL;
        !           354:          ssend.ipos = 0;
        !           355: 
        !           356:          zjobid = zsysdep_spool_commands (qdestsys, BDEFAULT_UUCP_GRADE,
        !           357:                                           1, &ssend);
        !           358:          if (zjobid == NULL)
        !           359:            break;
        !           360:          ubuffree (zjobid);
        !           361:        }
        !           362: 
        !           363:       ubuffree (zfile);
        !           364:     }
        !           365: 
        !           366:   if (zfile != NULL)
        !           367:     ubuffree (zfile);
        !           368: 
        !           369:   (void) fsysdep_wildcard_end ();
        !           370: 
        !           371:   ubuffree (zdestfile);
        !           372:   if (qdestsys != NULL)
        !           373:     (void) uuconf_system_free (qdaemon->puuconf, &sdestsys);
        !           374: 
        !           375:   ubuffree (zfrom);
        !           376:   ubuffree (zuser);
        !           377: 
        !           378:   return fret;
        !           379: }
        !           380: 
        !           381: /* Reply to a remote work request.  */
        !           382: 
        !           383: static boolean
        !           384: fremote_xcmd_reply (qtrans, qdaemon)
        !           385:      struct stransfer *qtrans;
        !           386:      struct sdaemon *qdaemon;
        !           387: {
        !           388:   boolean fret;
        !           389: 
        !           390:   fret = (*qdaemon->qproto->pfsendcmd) (qdaemon,
        !           391:                                        (const char *) qtrans->pinfo,
        !           392:                                        qtrans->ilocal,
        !           393:                                        qtrans->iremote);
        !           394:   utransfree (qtrans);
        !           395:   return fret;
        !           396: }

unix.superglobalmegacorp.com

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