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/mkdir.c

    r363 r370  
    3838static char sccsid[] = "@(#)mkdir.c     8.2 (Berkeley) 1/25/94";
    3939#endif /* not lint */
     40#include <sys/cdefs.h>
     41__FBSDID("$FreeBSD: src/bin/mkdir/mkdir.c,v 1.28 2004/04/06 20:06:48 markm Exp $");
    4042#endif
    41 #ifndef _MSC_VER
    42 #include <sys/cdefs.h>
    43 #endif
    44 //__FBSDID("$FreeBSD: src/bin/mkdir/mkdir.c,v 1.28 2004/04/06 20:06:48 markm Exp $");
    4543
    4644#include <sys/types.h>
    4745#include <sys/stat.h>
    4846
    49 //#include <err.h>
     47#include "err.h"
    5048#include <errno.h>
    5149#ifndef _MSC_VER
     
    5856#include <sysexits.h>
    5957#include <unistd.h>
    60 #endif
    61 
    62 #ifdef _MSC_VER
    63 #define setmode setmode_msc
    64 #include <stdarg.h>
    65 #include <io.h>
    66 #include <direct.h>
    67 #undef setmode
    68 #include "getopt.h"
    69 
    70 typedef int mode_t;
    71 #define EX_USAGE 1
    72 void warn(const char *fmt, ...)
    73 {
    74     int err = errno;
    75     va_list args;
    76     va_start(args, fmt);
    77     fprintf(stderr, "mkdir: ");
    78     vfprintf(stderr, fmt, args);
    79     fprintf(stderr, ": %s\n", strerror(err));
    80     va_end(args);
    81 }
    82 
    83 int mkdir_msc(const char *path, mode_t mode)
    84 {
    85     int rc = mkdir(path);
    86     if (rc)
    87     {
    88         int len = strlen(path);
    89         if (len > 0 && (path[len - 1] == '/' || path[len - 1] == '\\'))
    90         {
    91             char *str = strdup(path);
    92             while (len > 0 && (str[len - 1] == '/' || str[len - 1] == '\\'))
    93                 str[--len] = '\0';
    94             rc = mkdir(str);
    95             free(str);
    96         }
    97     }
    98     return rc;
    99 }
    100 #define mkdir(a,b) mkdir_msc(a,b)
    101 
    102 char *dirname(char *path)
    103 {         
    104     return path;
    105 }
    106 
    107 #define S_ISDIR(m)  (((m) & _S_IFMT) == _S_IFDIR)
    108 #define S_IRWXG 0000070
    109 #define S_IRWXO 0000007
    110 #define S_IRWXU (_S_IREAD | _S_IWRITE | _S_IEXEC)
    111 #define S_IXUSR _S_IEXEC
    112 #define S_IWUSR _S_IWRITE
    113 #define S_IRUSR _S_IREAD
    114 
     58#else
     59#include "mscfakes.h"
    11560#endif
    11661
     
    13378        mode = NULL;
    13479        vflag = 0;
     80        /* kmk: reset getopt and set progname */
     81        g_progname = argv[0];
    13582        opterr = 1;
    13683        optarg = NULL;
     
    166113                omode = S_IRWXU | S_IRWXG | S_IRWXO;
    167114        } else {
    168                 if ((set = setmode(mode)) == NULL) {
    169                         fprintf(stderr, "%s: invalid file mode: %s\n", mode, argv[0]);
    170                         return 1;
    171                 }
     115                if ((set = setmode(mode)) == NULL)
     116                        return errx(1, "invalid file mode: %s", mode);
    172117                omode = getmode(set, S_IRWXU | S_IRWXG | S_IRWXO);
    173118                free(set);
     
    181126                } else if (mkdir(*argv, omode) < 0) {
    182127                        if (errno == ENOTDIR || errno == ENOENT)
    183                                 fprintf(stderr, "%s: %s: %s\n", argv[0], dirname(*argv), strerror(errno));
     128                                warn("%s", dirname(*argv));
    184129                        else
    185                                 fprintf(stderr, "%s: %s: %s\n", argv[0], *argv, strerror(errno));
     130                                warn("%s", *argv);
    186131                        success = 0;
    187132                } else if (vflag)
     
    198143                 */
    199144                if (success && mode != NULL && chmod(*argv, omode) == -1) {
    200                         fprintf(stderr, "%s: %s: %s\n", argv[0], *argv, strerror(errno));
     145                        warn("%s", *argv);
    201146                        exitval = 1;
    202147                }
     
    240185                        continue;
    241186                *p = '\0';
    242                 if (p[1] == '\0')
     187                if (!last && p[1] == '\0')
    243188                        last = 1;
    244189                if (first) {
Note: See TracChangeset for help on using the changeset viewer.