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

1.1       root        1: /* xqtsub.c
                      2:    System dependent functions used only by uuxqt.
                      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 xqtsub_rcsid[] = "$Id: xqtsub.c,v 1.1 93/07/30 08:03:41 bin Exp Locker: bin $";
                     30: #endif
                     31: 
                     32: #include "uudefs.h"
                     33: #include "uuconf.h"
                     34: #include "system.h"
                     35: #include "sysdep.h"
                     36: 
                     37: #include <ctype.h>
                     38: #include <errno.h>
                     39: 
                     40: #if HAVE_FCNTL_H
                     41: #include <fcntl.h>
                     42: #else
                     43: #if HAVE_SYS_FILE_H
                     44: #include <sys/file.h>
                     45: #endif
                     46: #endif
                     47: 
                     48: #ifndef O_RDONLY
                     49: #define O_RDONLY 0
                     50: #define O_WRONLY 1
                     51: #define O_RDWR 2
                     52: #endif
                     53: 
                     54: #ifndef O_NOCTTY
                     55: #define O_NOCTTY 0
                     56: #endif
                     57: 
                     58: #ifndef FD_CLOEXEC
                     59: #define FD_CLOEXEC 1
                     60: #endif
                     61: 
                     62: #if HAVE_OPENDIR
                     63: #if HAVE_DIRENT_H
                     64: #include <dirent.h>
                     65: #else /* ! HAVE_DIRENT_H */
                     66: #include <sys/dir.h>
                     67: #define dirent direct
                     68: #endif /* ! HAVE_DIRENT_H */
                     69: #endif /* HAVE_OPENDIR */
                     70: 
                     71: /* Get a value for EX_TEMPFAIL.  */
                     72: 
                     73: #if HAVE_SYSEXITS_H
                     74: #include <sysexits.h>
                     75: #endif
                     76: 
                     77: #ifndef EX_TEMPFAIL
                     78: #define EX_TEMPFAIL 75
                     79: #endif
                     80: 
                     81: /* Get the full pathname of the command to execute, given the list of
                     82:    permitted commands and the allowed path.  */
                     83: 
                     84: char *
                     85: zsysdep_find_command (zcmd, pzcmds, pzpath, pferr)
                     86:      const char *zcmd;
                     87:      char **pzcmds;
                     88:      char **pzpath;
                     89:      boolean *pferr;
                     90: {
                     91:   char **pz;
                     92: 
                     93:   *pferr = FALSE;
                     94: 
                     95:   for (pz = pzcmds; *pz != NULL; pz++)
                     96:     {
                     97:       char *zslash;
                     98: 
                     99:       if (strcmp (*pz, "ALL") == 0)
                    100:        break;
                    101: 
                    102:       zslash = strrchr (*pz, '/');
                    103:       if (zslash != NULL)
                    104:        ++zslash;
                    105:       else
                    106:        zslash = *pz;
                    107:       if (strcmp (zslash, zcmd) == 0
                    108:          || strcmp (*pz, zcmd) == 0)
                    109:        {
                    110:          /* If we already have an absolute path, we can get out
                    111:             immediately.  */
                    112:          if (**pz == '/')
                    113:            return zbufcpy (*pz);
                    114:          break;
                    115:        }
                    116:     }
                    117: 
                    118:   /* If we didn't find this command, get out.  */
                    119:   if (*pz == NULL)
                    120:     return NULL;
                    121: 
                    122:   /* We didn't find an absolute pathname, so we must look through
                    123:      the path.  */
                    124:   for (pz = pzpath; *pz != NULL; pz++)
                    125:     {
                    126:       char *zname;
                    127:       struct stat s;
                    128: 
                    129:       zname = zsysdep_in_dir (*pz, zcmd);
                    130:       if (stat (zname, &s) == 0)
                    131:        return zname;
                    132:     }
                    133: 
                    134:   *pferr = FALSE;
                    135:   return NULL;
                    136: }
                    137: 
                    138: /* Expand a local filename for uuxqt.  This is special because uuxqt
                    139:    only wants to expand filenames that start with ~ (it does not want
                    140:    to prepend the current directory to other names) and if the ~ is
                    141:    double, it is turned into a single ~.  This returns NULL to
                    142:    indicate that no change was required; it has no way to return
                    143:    error.  */
                    144: 
                    145: char *
                    146: zsysdep_xqt_local_file (qsys, zfile)
                    147:      const struct uuconf_system *qsys;
                    148:      const char *zfile;
                    149: {
                    150:   if (*zfile != '~')
                    151:     return NULL;
                    152:   if (zfile[1] == '~')
                    153:     {
                    154:       size_t clen;
                    155:       char *zret;
                    156: 
                    157:       clen = strlen (zfile);
                    158:       zret = zbufalc (clen);
                    159:       memcpy (zret, zfile + 1, clen);
                    160:       return zret;
                    161:     }
                    162:   return zsysdep_local_file (zfile, qsys->uuconf_zpubdir);
                    163: }
                    164: 
                    165: #if ! ALLOW_FILENAME_ARGUMENTS
                    166: 
                    167: /* Check to see whether an argument specifies a file name; if it does,
                    168:    make sure that the file may legally be sent and/or received.  For
                    169:    Unix, we do not permit any occurrence of "/../" in the name, nor
                    170:    may it start with "../".  Otherwise, if it starts with "/" we check
                    171:    against the list of permitted files.  */
                    172: 
                    173: boolean
                    174: fsysdep_xqt_check_file (qsys, zfile)
                    175:      const struct uuconf_system *qsys;
                    176:      const char *zfile;
                    177: {
                    178:   size_t clen;
                    179: 
                    180:   clen = strlen (zfile);
                    181:   if ((clen == sizeof "../" - 1
                    182:        && strcmp (zfile, "../") == 0)
                    183:       || (clen >= sizeof "/.." - 1
                    184:          && strcmp (zfile + clen - (sizeof "/.." - 1), "/..") == 0)
                    185:       || strstr (zfile, "/../") != NULL
                    186:       || (*zfile == '/'
                    187:          && (! fin_directory_list (zfile, qsys->uuconf_pzremote_send,
                    188:                                    qsys->uuconf_zpubdir, TRUE, FALSE,
                    189:                                    (const char *) NULL)
                    190:              || ! fin_directory_list (zfile, qsys->uuconf_pzremote_receive,
                    191:                                       qsys->uuconf_zpubdir, TRUE, FALSE,
                    192:                                       (const char *) NULL))))
                    193:     {
                    194:       ulog (LOG_ERROR, "Not permitted to refer to file \"%s\"", zfile);
                    195:       return FALSE;
                    196:     }
                    197: 
                    198:   return TRUE;
                    199: }
                    200: 
                    201: #endif /* ! ALLOW_FILENAME_ARGUMENTS */
                    202: 
                    203: /* Invoke the command specified by an execute file.  */
                    204: 
                    205: /*ARGSUSED*/
                    206: boolean
                    207: fsysdep_execute (qsys, zuser, pazargs, zfullcmd, zinput, zoutput,
                    208:                 fshell, iseq, pzerror, pftemp)
                    209:      const struct uuconf_system *qsys;
                    210:      const char *zuser;
                    211:      const char **pazargs;
                    212:      const char *zfullcmd;
                    213:      const char *zinput;
                    214:      const char *zoutput;
                    215:      boolean fshell;
                    216:      int iseq;
                    217:      char **pzerror;
                    218:      boolean *pftemp;
                    219: {
                    220:   int aidescs[3];
                    221:   boolean ferr;
                    222:   pid_t ipid;
                    223:   int ierr;
                    224:   char abxqtdir[sizeof XQTDIR + 4];
                    225:   const char *zxqtdir;
                    226:   int istat;
                    227:   char *zpath;
                    228: #if ALLOW_SH_EXECUTION
                    229:   const char *azshargs[4];
                    230: #endif
                    231: 
                    232:   *pzerror = NULL;
                    233:   *pftemp = FALSE;
                    234: 
                    235:   aidescs[0] = SPAWN_NULL;
                    236:   aidescs[1] = SPAWN_NULL;
                    237:   aidescs[2] = SPAWN_NULL;
                    238: 
                    239:   ferr = FALSE;
                    240: 
                    241:   if (zinput != NULL)
                    242:     {
                    243:       aidescs[0] = open ((char *) zinput, O_RDONLY | O_NOCTTY, 0);
                    244:       if (aidescs[0] < 0)
                    245:        {
                    246:          ulog (LOG_ERROR, "open (%s): %s", zinput, strerror (errno));
                    247:          ferr = TRUE;
                    248:        }
                    249:       else if (fcntl (aidescs[0], F_SETFD,
                    250:                      fcntl (aidescs[0], F_GETFD, 0) | FD_CLOEXEC) < 0)
                    251:        {
                    252:          ulog (LOG_ERROR, "fcntl (FD_CLOEXEC): %s", strerror (errno));
                    253:          ferr = TRUE;
                    254:        }       
                    255:     }
                    256:   
                    257:   if (! ferr && zoutput != NULL)
                    258:     {
                    259:       aidescs[1] = creat ((char *) zoutput, IPRIVATE_FILE_MODE);
                    260:       if (aidescs[1] < 0)
                    261:        {
                    262:          ulog (LOG_ERROR, "creat (%s): %s", zoutput, strerror (errno));
                    263:          *pftemp = TRUE;
                    264:          ferr = TRUE;
                    265:        }
                    266:       else if (fcntl (aidescs[1], F_SETFD,
                    267:                      fcntl (aidescs[1], F_GETFD, 0) | FD_CLOEXEC) < 0)
                    268:        {
                    269:          ulog (LOG_ERROR, "fcntl (FD_CLOEXEC): %s", strerror (errno));
                    270:          ferr = TRUE;
                    271:        }       
                    272:     }
                    273: 
                    274:   if (! ferr)
                    275:     {
                    276:       *pzerror = zstemp_file (qsys);
                    277:       aidescs[2] = creat (*pzerror, IPRIVATE_FILE_MODE);
                    278:       if (aidescs[2] < 0)
                    279:        {
                    280:          if (errno == ENOENT)
                    281:            {
                    282:              if (! fsysdep_make_dirs (*pzerror, FALSE))
                    283:                {
                    284:                  *pftemp = TRUE;
                    285:                  ferr = TRUE;
                    286:                }
                    287:              else
                    288:                aidescs[2] = creat (*pzerror, IPRIVATE_FILE_MODE);
                    289:            }
                    290:          if (! ferr && aidescs[2] < 0)
                    291:            {
                    292:              ulog (LOG_ERROR, "creat (%s): %s", *pzerror, strerror (errno));
                    293:              *pftemp = TRUE;
                    294:              ferr = TRUE;
                    295:            }
                    296:        }
                    297:       if (! ferr
                    298:          && fcntl (aidescs[2], F_SETFD,
                    299:                    fcntl (aidescs[2], F_GETFD, 0) | FD_CLOEXEC) < 0)
                    300:        {
                    301:          ulog (LOG_ERROR, "fcntl (FD_CLOEXEC): %s", strerror (errno));
                    302:          ferr = TRUE;
                    303:        }       
                    304:     }
                    305: 
                    306:   if (iseq == 0)
                    307:     zxqtdir = XQTDIR;
                    308:   else
                    309:     {
                    310:       sprintf (abxqtdir, "%s%04d", XQTDIR, iseq);
                    311:       zxqtdir = abxqtdir;
                    312:     }
                    313: 
                    314:   if (ferr)
                    315:     {
                    316:       if (aidescs[0] != SPAWN_NULL)
                    317:        (void) close (aidescs[0]);
                    318:       if (aidescs[1] != SPAWN_NULL)
                    319:        (void) close (aidescs[1]);
                    320:       if (aidescs[2] != SPAWN_NULL)
                    321:        (void) close (aidescs[2]);
                    322:       ubuffree (*pzerror);
                    323:       return FALSE;
                    324:     }
                    325: 
                    326: #if ALLOW_SH_EXECUTION
                    327:   if (fshell)
                    328:     {
                    329:       azshargs[0] = "/bin/sh";
                    330:       azshargs[1] = "-c";
                    331:       azshargs[2] = zfullcmd;
                    332:       azshargs[3] = NULL;
                    333:       pazargs = azshargs;
                    334:     }
                    335: #else
                    336:   fshell = FALSE;
                    337: #endif
                    338: 
                    339:   if (qsys->uuconf_pzpath == NULL)
                    340:     zpath = NULL;
                    341:   else
                    342:     {
                    343:       size_t c;
                    344:       char **pz;
                    345: 
                    346:       c = 0;
                    347:       for (pz = qsys->uuconf_pzpath; *pz != NULL; pz++)
                    348:        c += strlen (*pz) + 1;
                    349:       zpath = zbufalc (c);
                    350:       *zpath = '\0';
                    351:       for (pz = qsys->uuconf_pzpath; *pz != NULL; pz++)
                    352:        {
                    353:          strcat (zpath, *pz);
                    354:          if (pz[1] != NULL)
                    355:            strcat (zpath, ":");
                    356:        }
                    357:     }
                    358: 
                    359:   /* Pass zchdir as zxqtdir, fnosigs as TRUE, fshell as TRUE if we
                    360:      aren't already using the shell.  */
                    361:   ipid = ixsspawn (pazargs, aidescs, FALSE, FALSE, zxqtdir, TRUE,
                    362:                   ! fshell, zpath, qsys->uuconf_zname, zuser);
                    363: 
                    364:   ierr = errno;
                    365: 
                    366:   ubuffree (zpath);
                    367: 
                    368:   if (aidescs[0] != SPAWN_NULL)
                    369:     (void) close (aidescs[0]);
                    370:   if (aidescs[1] != SPAWN_NULL)
                    371:     (void) close (aidescs[1]);
                    372:   if (aidescs[2] != SPAWN_NULL)
                    373:     (void) close (aidescs[2]);
                    374: 
                    375:   if (ipid < 0)
                    376:     {
                    377:       ulog (LOG_ERROR, "ixsspawn: %s", strerror (ierr));
                    378:       *pftemp = TRUE;
                    379:       return FALSE;
                    380:     }
                    381: 
                    382:   istat = ixswait ((unsigned long) ipid, "Execution");
                    383: 
                    384:   if (istat == EX_TEMPFAIL)
                    385:     *pftemp = TRUE;
                    386: 
                    387:   return istat == 0;
                    388: }
                    389: 
                    390: /* Lock a uuxqt process.  */
                    391: 
                    392: int
                    393: ixsysdep_lock_uuxqt (zcmd, cmaxuuxqts)
                    394:      const char *zcmd;
                    395:      int cmaxuuxqts;
                    396: {
                    397:   char ab[sizeof "LCK.XQT.9999"];
                    398:   int i;
                    399: 
                    400:   if (cmaxuuxqts <= 0 || cmaxuuxqts >= 10000)
                    401:     cmaxuuxqts = 9999;
                    402:   for (i = 0; i < cmaxuuxqts; i++)
                    403:     {
                    404:       sprintf (ab, "LCK.XQT.%d", i);
                    405:       if (fsdo_lock (ab, TRUE, (boolean *) NULL))
                    406:        break;
                    407:     }
                    408:   if (i >= cmaxuuxqts)
                    409:     return -1;
                    410: 
                    411:   if (zcmd != NULL)
                    412:     {
                    413:       char abcmd[sizeof "LXQ.123456789"];
                    414: 
                    415:       sprintf (abcmd, "LXQ.%.9s", zcmd);
                    416:       abcmd[strcspn (abcmd, " \t/")] = '\0';
                    417:       if (! fsdo_lock (abcmd, TRUE, (boolean *) NULL))
                    418:        {
                    419:          (void) fsdo_unlock (ab, TRUE);
                    420:          return -1;
                    421:        }
                    422:     }
                    423: 
                    424:   return i;
                    425: }
                    426: 
                    427: /* Unlock a uuxqt process.  */
                    428: 
                    429: boolean
                    430: fsysdep_unlock_uuxqt (iseq, zcmd, cmaxuuxqts)
                    431:      int iseq;
                    432:      const char *zcmd;
                    433:      int cmaxuuxqts;
                    434: {
                    435:   char ab[sizeof "LCK.XQT.9999"];
                    436:   boolean fret;
                    437: 
                    438:   fret = TRUE;
                    439: 
                    440:   sprintf (ab, "LCK.XQT.%d", iseq);
                    441:   if (! fsdo_unlock (ab, TRUE))
                    442:     fret = FALSE;
                    443: 
                    444:   if (zcmd != NULL)
                    445:     {
                    446:       char abcmd[sizeof "LXQ.123456789"];
                    447: 
                    448:       sprintf (abcmd, "LXQ.%.9s", zcmd);
                    449:       abcmd[strcspn (abcmd, " \t/")] = '\0';
                    450:       if (! fsdo_unlock (abcmd, TRUE))
                    451:        fret = FALSE;
                    452:     }
                    453: 
                    454:   return fret;
                    455: }
                    456: 
                    457: /* See whether a particular uuxqt command is locked (this depends on
                    458:    the implementation of fsdo_lock).  */
                    459: 
                    460: boolean
                    461: fsysdep_uuxqt_locked (zcmd)
                    462:      const char *zcmd;
                    463: {
                    464:   char ab[sizeof "LXQ.123456789"];
                    465:   struct stat s;
                    466: 
                    467:   sprintf (ab, "LXQ.%.9s", zcmd);
                    468:   return stat (ab, &s) == 0;
                    469: }
                    470: 
                    471: /* Lock a particular execute file.  */
                    472: 
                    473: boolean
                    474: fsysdep_lock_uuxqt_file (zfile)
                    475:      const char *zfile;
                    476: {
                    477:   char *zcopy, *z;
                    478:   boolean fret;
                    479: 
                    480:   zcopy = zbufcpy (zfile);
                    481: 
                    482:   z = strrchr (zcopy, '/');
                    483:   if (z == NULL)
                    484:     *zcopy = 'L';
                    485:   else
                    486:     *(z + 1) = 'L';
                    487: 
                    488:   fret = fsdo_lock (zcopy, TRUE, (boolean *) NULL);
                    489:   ubuffree (zcopy);
                    490:   return fret;
                    491: }
                    492: 
                    493: /* Unlock a particular execute file.  */
                    494: 
                    495: boolean
                    496: fsysdep_unlock_uuxqt_file (zfile)
                    497:      const char *zfile;
                    498: {
                    499:   char *zcopy, *z;
                    500:   boolean fret;
                    501: 
                    502:   zcopy = zbufcpy (zfile);
                    503: 
                    504:   z = strrchr (zcopy, '/');
                    505:   if (z == NULL)
                    506:     *zcopy = 'L';
                    507:   else
                    508:     *(z + 1) = 'L';
                    509: 
                    510:   fret = fsdo_unlock (zcopy, TRUE);
                    511:   ubuffree (zcopy);
                    512:   return fret;
                    513: }
                    514: 
                    515: /* Lock the execute directory.  Since we use a different directory
                    516:    depending on which LCK.XQT.dddd file we got, there is actually no
                    517:    need to create a lock file.  We do make sure that the directory
                    518:    exists, though.  */
                    519: 
                    520: boolean
                    521: fsysdep_lock_uuxqt_dir (iseq)
                    522:      int iseq;
                    523: {
                    524:   const char *zxqtdir;
                    525:   char abxqtdir[sizeof XQTDIR + 4];
                    526: 
                    527:   if (iseq == 0)
                    528:     zxqtdir = XQTDIR;
                    529:   else
                    530:     {
                    531:       sprintf (abxqtdir, "%s%04d", XQTDIR, iseq);
                    532:       zxqtdir = abxqtdir;
                    533:     }
                    534: 
                    535:   if (mkdir (zxqtdir, S_IRWXU) < 0
                    536:       && errno != EEXIST)
                    537:     {
                    538:       ulog (LOG_ERROR, "mkdir (%s): %s", zxqtdir, strerror (errno));
                    539:       return FALSE;
                    540:     }
                    541: 
                    542:   return TRUE;
                    543: }
                    544: 
                    545: /* Unlock the execute directory and clear it out.  The lock is
                    546:    actually the LCK.XQT.dddd file, so we don't unlock it, but we do
                    547:    remove all the files.  */
                    548: 
                    549: boolean
                    550: fsysdep_unlock_uuxqt_dir (iseq)
                    551:      int iseq;
                    552: {
                    553:   const char *zxqtdir;
                    554:   char abxqtdir[sizeof XQTDIR + 4];
                    555:   DIR *qdir;
                    556: 
                    557:   if (iseq == 0)
                    558:     zxqtdir = XQTDIR;
                    559:   else
                    560:     {
                    561:       sprintf (abxqtdir, "%s%04d", XQTDIR, iseq);
                    562:       zxqtdir = abxqtdir;
                    563:     }
                    564: 
                    565:   qdir = opendir ((char *) zxqtdir);
                    566:   if (qdir != NULL)
                    567:     {
                    568:       struct dirent *qentry;
                    569: 
                    570:       while ((qentry = readdir (qdir)) != NULL)
                    571:        {
                    572:          char *z;
                    573: 
                    574:          if (strcmp (qentry->d_name, ".") == 0
                    575:              || strcmp (qentry->d_name, "..") == 0)
                    576:            continue;
                    577:          z = zsysdep_in_dir (zxqtdir, qentry->d_name);
                    578:          if (remove (z) < 0)
                    579:            {
                    580:              int ierr;
                    581: 
                    582:              ierr = errno;
                    583:              if (! fsysdep_directory (z))
                    584:                ulog (LOG_ERROR, "remove (%s): %s", z,
                    585:                      strerror (ierr));
                    586:              else
                    587:                (void) fsysdep_rmdir (z);
                    588:            }
                    589:          ubuffree (z);
                    590:        }
                    591: 
                    592:       closedir (qdir);
                    593:     }
                    594: 
                    595:   return TRUE;
                    596: }
                    597: 
                    598: /* Move files into the execution directory.  */
                    599: 
                    600: boolean
                    601: fsysdep_move_uuxqt_files (cfiles, pzfrom, pzto, fto, iseq, pzinput)
                    602:      int cfiles;
                    603:      const char *const *pzfrom;
                    604:      const char *const *pzto;
                    605:      boolean fto;
                    606:      int iseq;
                    607:      char **pzinput;
                    608: {
                    609:   char *zinput;
                    610:   const char *zxqtdir;
                    611:   char abxqtdir[sizeof XQTDIR + 4];
                    612:   int i;
                    613: 
                    614:   if (pzinput == NULL)
                    615:     zinput = NULL;
                    616:   else
                    617:     zinput = *pzinput;
                    618: 
                    619:   if (iseq == 0)
                    620:     zxqtdir = XQTDIR;
                    621:   else
                    622:     {
                    623:       sprintf (abxqtdir, "%s%04d", XQTDIR, iseq);
                    624:       zxqtdir = abxqtdir;
                    625:     }
                    626: 
                    627:   for (i = 0; i < cfiles; i++)
                    628:     {
                    629:       const char *zfrom, *zto;
                    630:       char *zfree;
                    631: 
                    632:       if (pzto[i] == NULL)
                    633:        continue;
                    634: 
                    635:       zfree = zsysdep_in_dir (zxqtdir, pzto[i]);
                    636: 
                    637:       zfrom = pzfrom[i];
                    638:       zto = zfree;
                    639: 
                    640:       if (zinput != NULL && strcmp (zinput, zfrom) == 0)
                    641:        {
                    642:          *pzinput = zbufcpy (zto);
                    643:          zinput = NULL;
                    644:        }
                    645: 
                    646:       if (! fto)
                    647:        {
                    648:          const char *ztemp;
                    649:          
                    650:          ztemp = zfrom;
                    651:          zfrom = zto;
                    652:          zto = ztemp;
                    653:          (void) chmod (zfrom, IPRIVATE_FILE_MODE);
                    654:        }
                    655: 
                    656:       if (rename (zfrom, zto) < 0)
                    657:        {
                    658: #if HAVE_RENAME
                    659:          /* On some systems the system call rename seems to fail for
                    660:             arbitrary reasons.  To get around this, we always try to
                    661:             copy the file by hand if the rename failed.  */
                    662:          errno = EXDEV;
                    663: #endif
                    664: 
                    665:          if (errno != EXDEV)
                    666:            {
                    667:              ulog (LOG_ERROR, "rename (%s, %s): %s", zfrom, zto,
                    668:                    strerror (errno));
                    669:              ubuffree (zfree);
                    670:              break;
                    671:            }
                    672: 
                    673:          if (! fcopy_file (zfrom, zto, FALSE, FALSE))
                    674:            {
                    675:              ubuffree (zfree);
                    676:              break;
                    677:            }
                    678:          if (remove (zfrom) < 0)
                    679:            ulog (LOG_ERROR, "remove (%s): %s", zfrom,
                    680:                  strerror (errno));
                    681:        }
                    682: 
                    683:       if (fto)
                    684:        (void) chmod (zto, IPUBLIC_FILE_MODE);
                    685: 
                    686:       ubuffree (zfree);
                    687:     }
                    688: 
                    689:   if (i < cfiles)
                    690:     {
                    691:       if (fto)
                    692:        (void) fsysdep_move_uuxqt_files (i, pzfrom, pzto, FALSE, iseq,
                    693:                                         (char **) NULL);
                    694:       return FALSE;
                    695:     }
                    696: 
                    697:   return TRUE;
                    698: }

unix.superglobalmegacorp.com

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