VirtualBox

Changeset 370 in kBuild for trunk/src/gmake/kmkbuiltin/cp.c


Ignore:
Timestamp:
Dec 18, 2005 3:48:02 AM (19 years ago)
Author:
bird
Message:

o Ported all kmk builtins to win32.
o Fixed serveral bugs in kmk builtins.
o Probably broke both linux, bsd and OS/2. :-)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/gmake/kmkbuiltin/cp.c

    r299 r370  
    4141static char sccsid[] = "@(#)cp.c        8.2 (Berkeley) 4/1/94";
    4242#endif /* not lint */
    43 #endif
    4443#include <sys/cdefs.h>
    45 //__FBSDID("$FreeBSD: src/bin/cp/cp.c,v 1.50 2004/04/06 20:06:44 markm Exp $");
     44__FBSDID("$FreeBSD: src/bin/cp/cp.c,v 1.50 2004/04/06 20:06:44 markm Exp $");
     45#endif
    4646
    4747/*
     
    6363#include <sys/stat.h>
    6464
    65 #include <err.h>
     65#include "err.h"
    6666#include <errno.h>
     67#ifdef DO_CP_TREE
    6768#include <fts.h>
     69#endif
    6870#include <limits.h>
    6971#include <signal.h>
     
    7173#include <stdlib.h>
    7274#include <string.h>
     75#ifndef _MSC_VER
    7376#include <unistd.h>
     77#else
     78#include "mscfakes.h"
     79#include "ftsfake.h"
     80#endif
    7481
    7582#include "cp_extern.h"
     
    103110
    104111int fflag, iflag, nflag, pflag, vflag;
    105 int Rflag, rflag;
     112static int Rflag, rflag;
    106113volatile sig_atomic_t info;
    107114
     
    122129        char *target;
    123130
    124         argv0 = argv[0];
     131        /* init globals */
     132        cp_argv0 = argv[0];
    125133        to.p_end = to.p_path;
    126134        to.target_end = emptystring;
     
    128136        fflag = iflag = nflag = pflag = vflag = Rflag = rflag = 0;
    129137        info = 0;
     138        /* reset getopt and set progname. */
     139        g_progname = argv[0];
    130140        opterr = 1;
    131141        optarg = NULL;
     
    154164                        break;
    155165                case 'R':
     166#ifdef DO_CP_TREE
    156167                        Rflag = 1;
    157168                        break;
     169#else
     170                        return errx(1, "recursive copy is not implemented!");
     171#endif
    158172                case 'f':
    159173                        fflag = 1;
     
    172186                        break;
    173187                case 'r':
     188#ifdef DO_CP_TREE
    174189                        rflag = 1;
    175190                        break;
     191#else
     192                        return errx(1, "recursive copy is not implemented!");
     193#endif
    176194                case 'v':
    177195                        vflag = 1;
    178196                        break;
    179197                default:
    180                         usage();
    181                         break;
     198                        return usage();
    182199                }
    183200        argc -= optind;
     
    185202
    186203        if (argc < 2)
    187                 usage();
     204                return usage();
    188205
    189206        fts_options = FTS_NOCHDIR | FTS_PHYSICAL;
    190207        if (rflag) {
    191                 if (Rflag) {
    192                         fprintf(stderr,
    193                             "%s: the -R and -r options may not be specified together.\n", argv0);
    194                         return 1;
    195                 }
    196                 if (Hflag || Lflag || Pflag) {
    197                         fprintf(stderr, "%s: the -H, -L, and -P options may not be specified with the -r option.\n", argv0);
    198                         return 1;
    199                 }
     208                if (Rflag)
     209                        return errx(1,
     210                    "the -R and -r options may not be specified together.");
     211                if (Hflag || Lflag || Pflag)
     212                        errx(1,
     213        "the -H, -L, and -P options may not be specified with the -r option.");
     214#ifdef DO_CP_TREE
    200215                fts_options &= ~FTS_PHYSICAL;
    201216                fts_options |= FTS_LOGICAL;
     217#endif
    202218        }
     219#ifdef DO_CP_TREE
    203220        if (Rflag) {
    204221                if (Hflag)
     
    208225                        fts_options |= FTS_LOGICAL;
    209226                }
    210         } else {
     227        } else
     228#endif
     229        {
    211230                fts_options &= ~FTS_PHYSICAL;
    212231                fts_options |= FTS_LOGICAL | FTS_COMFOLLOW;
     
    218237        /* Save the target base in "to". */
    219238        target = argv[--argc];
    220         if (strlcpy(to.p_path, target, sizeof(to.p_path)) >= sizeof(to.p_path)) {
    221                 fprintf(stderr, "%s: %s: name too long\n", argv0, target);
    222                 return 1;
    223         }
     239        if (strlcpy(to.p_path, target, sizeof(to.p_path)) >= sizeof(to.p_path))
     240                return errx(1, "%s: name too long", target);
    224241        to.p_end = to.p_path + strlen(to.p_path);
    225242        if (to.p_path == to.p_end) {
     
    250267         */
    251268        r = stat(to.p_path, &to_stat);
    252         if (r == -1 && errno != ENOENT) {
    253                 fprintf(stderr, "%s: %s: %s\n", argv0, to.p_path, strerror(errno));
    254         }
     269        if (r == -1 && errno != ENOENT)
     270                return err(1, "%s", to.p_path);
    255271        if (r == -1 || !S_ISDIR(to_stat.st_mode)) {
    256272                /*
    257273                 * Case (1).  Target is not a directory.
    258274                 */
    259                 if (argc > 1) {
    260                         usage();
    261                         return 1;
    262                 }
     275                if (argc > 1)
     276                        return usage();
    263277                /*
    264278                 * Need to detect the case:
     
    283297                if (have_trailing_slash && type == FILE_TO_FILE) {
    284298                        if (r == -1)
    285                                 fprintf(stderr, "%s: directory %s does not exist\n", argv0,
    286                                      to.p_path);
     299                                return errx(1, "directory %s does not exist",
     300                                            to.p_path);
    287301                        else
    288                                 fprintf(stderr, "%s: %s is not a directory\n", argv0, to.p_path);
    289                         return 1;
     302                                return errx(1, "%s is not a directory", to.p_path);
    290303                }
    291304        } else
     
    316329        umask(~mask);
    317330
    318         if ((ftsp = fts_open(argv, fts_options, mastercmp)) == NULL) {
    319                 fprintf(stderr, "%s: fts_open: %s\n", argv0, strerror(errno));
    320                 return 1;
    321         }
     331        if ((ftsp = fts_open(argv, fts_options, mastercmp)) == NULL)
     332                return err(1, "fts_open");
    322333        for (badcp = rval = 0; (curr = fts_read(ftsp)) != NULL; badcp = 0) {
    323334                switch (curr->fts_info) {
     
    325336                case FTS_DNR:
    326337                case FTS_ERR:
    327                         fprintf(stderr, "%s: %s: %s\n",
    328                             argv0, curr->fts_path, strerror(curr->fts_errno));
     338                        warnx("%s: %s",
     339                            curr->fts_path, strerror(curr->fts_errno));
    329340                        badcp = rval = 1;
    330341                        continue;
    331342                case FTS_DC:                    /* Warn, continue. */
    332                         fprintf(stderr, "%s: %s: directory causes a cycle\n", argv0, curr->fts_path);
     343                        warnx("%s: directory causes a cycle", curr->fts_path);
    333344                        badcp = rval = 1;
    334345                        continue;
     
    381392                        *target_mid = 0;
    382393                        if (target_mid - to.p_path + nlen >= PATH_MAX) {
    383                                 fprintf(stderr, "%s: %s%s: name too long (not copied)\n", argv0,
     394                                warnx("%s%s: name too long (not copied)",
    384395                                    to.p_path, p);
    385396                                badcp = rval = 1;
     
    417428                                    ((mode | S_IRWXU) & mask) != (mode & mask))
    418429                                        if (chmod(to.p_path, mode & mask) != 0){
    419                                                 fprintf(stderr, "%s: chmod: %s: %s\n", argv0, to.p_path, strerror(errno));
     430                                                warn("chmod: %s", to.p_path);
    420431                                                rval = 1;
    421432                                        }
     
    429440                else {
    430441                        if (to_stat.st_dev == curr->fts_statp->st_dev &&
    431                             to_stat.st_ino == curr->fts_statp->st_ino) {
    432                                 fprintf(stderr, "%s: %s and %s are identical (not copied).\n",
    433                                     argv0, to.p_path, curr->fts_path);
     442                            to_stat.st_dev != 0 &&
     443                            to_stat.st_ino == curr->fts_statp->st_ino &&
     444                            to_stat.st_ino != 0) {
     445                                warnx("%s and %s are identical (not copied).",
     446                                    to.p_path, curr->fts_path);
    434447                                badcp = rval = 1;
    435448                                if (S_ISDIR(curr->fts_statp->st_mode))
     
    439452                        if (!S_ISDIR(curr->fts_statp->st_mode) &&
    440453                            S_ISDIR(to_stat.st_mode)) {
    441                                 fprintf(stderr,
    442                                     "%s: cannot overwrite directory %s with "
    443                                     "non-directory %s\n",
    444                                     argv0, to.p_path, curr->fts_path);
     454                                warnx("cannot overwrite directory %s with "
     455                                    "non-directory %s",
     456                                    to.p_path, curr->fts_path);
    445457                                badcp = rval = 1;
    446458                                continue;
     
    450462
    451463                switch (curr->fts_statp->st_mode & S_IFMT) {
     464#ifdef S_IFLNK
    452465                case S_IFLNK:
    453466                        /* Catch special case of a non-dangling symlink */
     
    462475                        }
    463476                        break;
     477#endif
    464478                case S_IFDIR:
    465479                        if (!Rflag && !rflag) {
    466                                 fprintf(stderr, "%s: %s is a directory (not copied).\n",
    467                                     argv0, curr->fts_path);
     480                                warnx("%s is a directory (not copied).",
     481                                    curr->fts_path);
    468482                                (void)fts_set(ftsp, curr, FTS_SKIP);
    469483                                badcp = rval = 1;
     
    480494                        if (dne) {
    481495                                if (mkdir(to.p_path,
    482                                     curr->fts_statp->st_mode | S_IRWXU) < 0) {
    483                                         fprintf(stderr, "%s: %s: %s\n", argv0, to.p_path, strerror(errno));
    484                                         return 1;
    485                                 }
     496                                    curr->fts_statp->st_mode | S_IRWXU) < 0)
     497                                        return err(1, "%s", to.p_path);
    486498                        } else if (!S_ISDIR(to_stat.st_mode)) {
    487499                                errno = ENOTDIR;
    488                                 fprintf(stderr, "%s: %s: %s\n", argv0, to.p_path, strerror(errno));
     500                                return err(1, "%s", to.p_path);
    489501                        }
    490502                        /*
     
    495507                        curr->fts_number = pflag || dne;
    496508                        break;
     509#ifdef S_IFBLK
    497510                case S_IFBLK:
     511#endif
    498512                case S_IFCHR:
    499513                        if (Rflag) {
     
    505519                        }
    506520                        break;
     521#ifdef S_IFIFO
    507522                case S_IFIFO:
     523#endif
    508524                        if (Rflag) {
    509525                                if (copy_fifo(curr->fts_statp, !dne))
     
    522538                        (void)printf("%s -> %s\n", curr->fts_path, to.p_path);
    523539        }
    524         if (errno) {
    525                 fprintf(stderr, "%s: fts_read: %s\n", argv0, strerror(errno));
    526         }
     540        if (errno)
     541                return err(1, "fts_read");
    527542        return (rval);
    528543}
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette