Ignore:
Timestamp:
Dec 18, 2005, 4:48:02 AM (20 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/rm.c

    r341 r370  
    3838static char sccsid[] = "@(#)rm.c        8.5 (Berkeley) 4/18/94";
    3939#endif /* not lint */
    40 #endif
    4140#include <sys/cdefs.h>
    4241//__FBSDID("$FreeBSD: src/bin/rm/rm.c,v 1.47 2004/04/06 20:06:50 markm Exp $");
     42#endif
    4343
    4444#include <sys/stat.h>
     45#ifndef _MSC_VER
    4546#include <sys/param.h>
    4647#include <sys/mount.h>
    47 
    48 #include <err.h>
     48#endif
     49
     50#include "err.h"
    4951#include <errno.h>
    5052#include <fcntl.h>
     53#ifdef DO_RMTREE
    5154#include <fts.h>
     55#endif
     56#ifndef _MSC_VER
    5257#include <grp.h>
    5358#include <pwd.h>
     59#endif
    5460#include <stdio.h>
    5561#include <stdlib.h>
    5662#include <string.h>
     63#ifndef _MSC_VER
    5764#include <sysexits.h>
    5865#include <unistd.h>
     66#else
     67#include "mscfakes.h"
     68#endif
    5969
    6070#ifdef __EMX__
     
    8191static void     rm_file(char **);
    8292static int      rm_overwrite(char *, struct stat *);
     93#ifdef DO_RMTREE
    8394static void     rm_tree(char **);
     95#endif
    8496static int      usage(void);
    8597
     
    100112        dflag = eval = fflag = iflag = Pflag = vflag = Wflag = stdin_ok = 0;
    101113        uid = 0;
     114        /* kmk: reset getopt and set program name. */
     115        g_progname = argv[0];
    102116        opterr = 1;
    103117        optarg = NULL;
     
    110124#endif
    111125
     126#if 0 /* kmk: we don't need this */
    112127        /*
    113128         * Test for the special case where the utility is called as
     
    129144                return eval;
    130145        }
    131 
     146#else   
     147        (void)p;
     148#endif
    132149        Pflag = rflag = 0;
    133150        while ((ch = getopt(argc, argv, "dfiPRrvW")) != -1)
     
    149166                case 'R':
    150167                case 'r':                       /* Compatibility. */
     168#ifdef DO_RMTREE
    151169                        rflag = 1;
    152170                        break;
     171#else
     172                        errno = EINVAL;
     173                        return err(1, "Recursion is not supported!");
     174#endif
    153175                case 'v':
    154176                        vflag = 1;
     
    176198        if (*argv) {
    177199                stdin_ok = isatty(STDIN_FILENO);
    178 
     200#ifdef DO_RMTREE
    179201                if (rflag)
    180202                        rm_tree(argv);
    181203                else
     204#endif
    182205                        rm_file(argv);
    183206        }
     
    186209}
    187210
     211#ifdef DO_RMTREE
    188212static void
    189213rm_tree(char **argv)
     
    214238                flags |= FTS_WHITEOUT;
    215239#endif
    216         if (!(fts = fts_open(argv, flags, NULL)))
    217                 err(1, "fts_open");
     240        if (!(fts = fts_open(argv, flags, NULL))) {
     241                eval = err(1, "fts_open");
     242                return;
     243        }
    218244        while ((p = fts_read(fts)) != NULL) {
    219245                switch (p->fts_info) {
     
    226252                        continue;
    227253                case FTS_ERR:
    228                         errx(1, "%s: %s", p->fts_path, strerror(p->fts_errno));
     254                        eval = errx(1, "%s: %s", p->fts_path, strerror(p->fts_errno));
     255                        return;
    229256                case FTS_NS:
    230257                        /*
     
    318345                                                continue;
    319346                                rval = unlink(p->fts_accpath);
     347#ifdef _MSC_VER
     348                                if (rval != 0) {
     349                                        chmod(p->fts_accpath, 0777);
     350                                        rval = unlink(p->fts_accpath);
     351                                }
     352#endif
     353
    320354                                if (rval == 0 || (fflag && errno == ENOENT)) {
    321355                                        if (rval == 0 && vflag)
     
    335369        }
    336370}
     371#endif /* DO_RMTREE */
    337372
    338373static void
     
    395430                                                continue;
    396431                                rval = unlink(f);
     432#ifdef _MSC_VER
     433                                if (rval != 0) {
     434                                        chmod(f, 0777);
     435                                        rval = unlink(f);
     436                                }
     437#endif
    397438                        }
    398439                }
     
    448489#endif
    449490        if ((buf = malloc(bsize)) == NULL)
    450                 err(1, "%s: malloc", file);
     491                exit(err(1, "%s: malloc", file));
    451492
    452493#define PASS(byte) {                                                    \
     
    512553#ifdef SF_APPEND
    513554                if ((flagsp = fflagstostr(sp->st_flags)) == NULL)
    514                         err(1, "fflagstostr");
     555                        exit(err(1, "fflagstostr"));
    515556                (void)fprintf(stderr, "override %s%s%s/%s %s%sfor %s? ",
    516557                    modep + 1, modep[9] == ' ' ? "" : " ",
     
    521562                free(flagsp);
    522563#else
     564                (void)flagsp;
    523565                (void)fprintf(stderr, "override %s%s %d/%d for %s? ",
    524566                    modep + 1, modep[9] == ' ' ? "" : " ",
Note: See TracChangeset for help on using the changeset viewer.