Changeset 1710 in kBuild
- Timestamp:
- Sep 2, 2008 9:50:04 PM (17 years ago)
- Location:
- trunk/src/kmk/kmkbuiltin
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kmk/kmkbuiltin/chmod.c
r1705 r1710 56 56 #else 57 57 # include "mscfakes.h" 58 #endif 58 #endif 59 59 #include "getopt.h" 60 60 #include "kmkbuiltin.h" 61 62 extern void * bsd_setmode(const char *p); 63 extern mode_t bsd_getmode(const void *bbox, mode_t omode); 64 extern void bsd_strmode(mode_t mode, char *p); 61 65 62 66 #if defined(__APPLE__) && !defined(_DARWIN_FEATURE_UNIX_CONFORMANCE) … … 176 180 177 181 mode = *argv; 178 if ((set = setmode(mode)) == NULL)182 if ((set = bsd_setmode(mode)) == NULL) 179 183 return errx(1, "invalid file mode: %s", mode); 180 184 … … 210 214 break; 211 215 } 212 newmode = getmode(set, p->fts_statp->st_mode);216 newmode = bsd_getmode(set, p->fts_statp->st_mode); 213 217 if ((newmode & ALLPERMS) == (p->fts_statp->st_mode & ALLPERMS)) 214 218 continue; … … 223 227 char m1[12], m2[12]; 224 228 225 strmode(p->fts_statp->st_mode, m1);226 strmode((p->fts_statp->st_mode &229 bsd_strmode(p->fts_statp->st_mode, m1); 230 bsd_strmode((p->fts_statp->st_mode & 227 231 S_IFMT) | newmode, m2); 228 232 -
trunk/src/kmk/kmkbuiltin/install.c
r1539 r1710 83 83 84 84 85 extern void * setmode(const char *p);86 extern mode_t getmode(const void *bbox, mode_t omode);85 extern void * bsd_setmode(const char *p); 86 extern mode_t bsd_getmode(const void *bbox, mode_t omode); 87 87 88 88 #ifndef __unused … … 209 209 break; 210 210 case 'm': 211 #ifdef __EMX__212 211 if (!(set = bsd_setmode(optarg))) 213 #else214 if (!(set = setmode(optarg)))215 #endif216 212 return errx(EX_USAGE, "invalid file mode: %s", 217 213 optarg); 218 mode = getmode(set, 0);214 mode = bsd_getmode(set, 0); 219 215 free(set); 220 216 break; -
trunk/src/kmk/kmkbuiltin/mkdir.c
r1595 r1710 72 72 73 73 74 extern void * setmode(const char *p);75 extern mode_t getmode(const void *bbox, mode_t omode);74 extern void * bsd_setmode(const char *p); 75 extern mode_t bsd_getmode(const void *bbox, mode_t omode); 76 76 77 77 static int build(char *, mode_t); … … 127 127 omode = S_IRWXU | S_IRWXG | S_IRWXO; 128 128 } else { 129 if ((set = setmode(mode)) == NULL)129 if ((set = bsd_setmode(mode)) == NULL) 130 130 return errx(1, "invalid file mode: %s", mode); 131 omode = getmode(set, S_IRWXU | S_IRWXG | S_IRWXO);131 omode = bsd_getmode(set, S_IRWXU | S_IRWXG | S_IRWXO); 132 132 free(set); 133 133 } -
trunk/src/kmk/kmkbuiltin/mscfakes.c
r1321 r1710 40 40 41 41 42 /** 43 * Makes corrections to a directory path that ends with a trailing slash. 44 * 45 * @returns temporary buffer to free. 46 * @param ppszPath The path pointer. This is updated when necessary. 47 * @param pfMustBeDir This is set if it must be a directory, otherwise it's cleared. 48 */ 49 static char * 50 msc_fix_path(const char **ppszPath, int *pfMustBeDir) 51 { 52 const char *pszPath = *ppszPath; 53 const char *psz; 54 char *pszNew; 55 *pfMustBeDir = 0; 56 57 /* 58 * Skip any compusory trailing slashes 59 */ 60 if (pszPath[0] == '/' || pszPath[0] == '\\') 61 { 62 if ( (pszPath[1] == '/' || pszPath[1] == '\\') 63 && pszPath[2] != '/' 64 && pszPath[2] != '\\') 65 /* unc */ 66 pszPath += 2; 67 else 68 /* root slash(es) */ 69 pszPath++; 70 } 71 else if ( isalpha(pszPath[0]) 72 && pszPath[1] == ':') 73 { 74 if (pszPath[2] == '/' || pszPath[2] == '\\') 75 /* drive w/ slash */ 76 pszPath += 3; 77 else 78 /* drive relative path. */ 79 pszPath += 2; 80 } 81 /* else: relative path, no skipping necessary. */ 82 83 /* 84 * Any trailing slashes to drop off? 85 */ 86 psz = strchr(pszPath, '\0'); 87 if (pszPath <= psz) 88 return NULL; 89 if ( psz[-1] != '/' 90 || psz[-1] != '\\') 91 return NULL; 92 93 /* figure how many, make a copy and strip them off. */ 94 while ( psz > pszPath 95 && ( psz[-1] == '/' 96 || psz[-1] == '\\')) 97 psz--; 98 pszNew = strdup(pszPath); 99 pszNew[psz - pszPath] = '\0'; 100 101 *pfMustBeDir = 1; 102 *ppszPath = pszNew; /* use this one */ 103 return pszNew; 104 } 105 106 107 static int 108 msc_set_errno(DWORD dwErr) 109 { 110 switch (dwErr) 111 { 112 default: 113 case ERROR_INVALID_FUNCTION: errno = EINVAL; break; 114 case ERROR_FILE_NOT_FOUND: errno = ENOENT; break; 115 case ERROR_PATH_NOT_FOUND: errno = ENOENT; break; 116 case ERROR_TOO_MANY_OPEN_FILES: errno = EMFILE; break; 117 case ERROR_ACCESS_DENIED: errno = EACCES; break; 118 case ERROR_INVALID_HANDLE: errno = EBADF; break; 119 case ERROR_ARENA_TRASHED: errno = ENOMEM; break; 120 case ERROR_NOT_ENOUGH_MEMORY: errno = ENOMEM; break; 121 case ERROR_INVALID_BLOCK: errno = ENOMEM; break; 122 case ERROR_BAD_ENVIRONMENT: errno = E2BIG; break; 123 case ERROR_BAD_FORMAT: errno = ENOEXEC; break; 124 case ERROR_INVALID_ACCESS: errno = EINVAL; break; 125 case ERROR_INVALID_DATA: errno = EINVAL; break; 126 case ERROR_INVALID_DRIVE: errno = ENOENT; break; 127 case ERROR_CURRENT_DIRECTORY: errno = EACCES; break; 128 case ERROR_NOT_SAME_DEVICE: errno = EXDEV; break; 129 case ERROR_NO_MORE_FILES: errno = ENOENT; break; 130 case ERROR_LOCK_VIOLATION: errno = EACCES; break; 131 case ERROR_BAD_NETPATH: errno = ENOENT; break; 132 case ERROR_NETWORK_ACCESS_DENIED: errno = EACCES; break; 133 case ERROR_BAD_NET_NAME: errno = ENOENT; break; 134 case ERROR_FILE_EXISTS: errno = EEXIST; break; 135 case ERROR_CANNOT_MAKE: errno = EACCES; break; 136 case ERROR_FAIL_I24: errno = EACCES; break; 137 case ERROR_INVALID_PARAMETER: errno = EINVAL; break; 138 case ERROR_NO_PROC_SLOTS: errno = EAGAIN; break; 139 case ERROR_DRIVE_LOCKED: errno = EACCES; break; 140 case ERROR_BROKEN_PIPE: errno = EPIPE; break; 141 case ERROR_DISK_FULL: errno = ENOSPC; break; 142 case ERROR_INVALID_TARGET_HANDLE: errno = EBADF; break; 143 case ERROR_WAIT_NO_CHILDREN: errno = ECHILD; break; 144 case ERROR_CHILD_NOT_COMPLETE: errno = ECHILD; break; 145 case ERROR_DIRECT_ACCESS_HANDLE: errno = EBADF; break; 146 case ERROR_NEGATIVE_SEEK: errno = EINVAL; break; 147 case ERROR_SEEK_ON_DEVICE: errno = EACCES; break; 148 case ERROR_DIR_NOT_EMPTY: errno = ENOTEMPTY; break; 149 case ERROR_NOT_LOCKED: errno = EACCES; break; 150 case ERROR_BAD_PATHNAME: errno = ENOENT; break; 151 case ERROR_MAX_THRDS_REACHED: errno = EAGAIN; break; 152 case ERROR_LOCK_FAILED: errno = EACCES; break; 153 case ERROR_ALREADY_EXISTS: errno = EEXIST; break; 154 case ERROR_FILENAME_EXCED_RANGE: errno = ENOENT; break; 155 case ERROR_NESTING_NOT_ALLOWED: errno = EAGAIN; break; 156 } 157 158 return -1; 159 } 160 42 161 char *dirname(char *path) 43 162 { 44 163 /** @todo later */ 45 164 return path; 165 } 166 167 168 int lchmod(const char *pszPath, mode_t mode) 169 { 170 int rc = 0; 171 int fMustBeDir; 172 char *pszPathFree = msc_fix_path(&pszPath, &fMustBeDir); 173 174 /* 175 * Get the current attributes 176 */ 177 DWORD fAttr = GetFileAttributes(pszPath); 178 if (fAttr == INVALID_FILE_ATTRIBUTES) 179 rc = msc_set_errno(GetLastError()); 180 else if (fMustBeDir & !(fAttr & FILE_ATTRIBUTE_DIRECTORY)) 181 { 182 errno = ENOTDIR; 183 rc = -1; 184 } 185 else 186 { 187 /* 188 * Modify the attributes and try set them. 189 */ 190 if (mode & _S_IWRITE) 191 fAttr &= ~FILE_ATTRIBUTE_READONLY; 192 else 193 fAttr |= FILE_ATTRIBUTE_READONLY; 194 if (!SetFileAttributes(pszPath, fAttr)) 195 rc = msc_set_errno(GetLastError()); 196 } 197 198 if (pszPathFree) 199 { 200 int saved_errno = errno; 201 free(pszPathFree); 202 errno = saved_errno; 203 } 204 return rc; 205 } 206 207 208 int msc_chmod(const char *pszPath, mode_t mode) 209 { 210 int rc = 0; 211 int saved_errno; 212 int fMustBeDir; 213 char *pszPathFree = msc_fix_path(&pszPath, &fMustBeDir); 214 215 /* 216 * Get the current attributes. 217 */ 218 DWORD fAttr = GetFileAttributes(pszPath); 219 if (fAttr == INVALID_FILE_ATTRIBUTES) 220 rc = msc_set_errno(GetLastError()); 221 else if (fMustBeDir & !(fAttr & FILE_ATTRIBUTE_DIRECTORY)) 222 { 223 errno = ENOTDIR; 224 rc = -1; 225 } 226 else if (fAttr & FILE_ATTRIBUTE_REPARSE_POINT) 227 { 228 errno = ENOSYS; /** @todo resolve symbolic link / rewrite to NtSetInformationFile. */ 229 rc = -1; 230 } 231 else 232 { 233 /* 234 * Modify the attributes and try set them. 235 */ 236 if (mode & _S_IWRITE) 237 fAttr &= ~FILE_ATTRIBUTE_READONLY; 238 else 239 fAttr |= FILE_ATTRIBUTE_READONLY; 240 if (!SetFileAttributes(pszPath, fAttr)) 241 rc = msc_set_errno(GetLastError()); 242 } 243 244 if (pszPathFree) 245 { 246 int saved_errno = errno; 247 free(pszPathFree); 248 errno = saved_errno; 249 } 250 return rc; 46 251 } 47 252 -
trunk/src/kmk/kmkbuiltin/mscfakes.h
r1321 r1710 27 27 #ifdef _MSC_VER 28 28 29 #define setmode setmode_msc30 29 #include <io.h> 31 30 #include <direct.h> … … 33 32 #include <stdarg.h> 34 33 #include <malloc.h> 35 #undef setmode36 34 #include "getopt.h" 37 35 … … 125 123 #define getegid() 0 126 124 #define lstat(path, s) stat(path, s) 127 #define lchmod(path, mod) chmod(path, mod) 125 int lchmod(const char *path, mode_t mode); 126 int msc_chmod(const char *path, mode_t mode); 127 #define chmod msc_chmod 128 128 #define lchown(path, uid, gid) chown(path, uid, gid) 129 129 #define lutimes(path, tvs) utimes(path, tvs) -
trunk/src/kmk/kmkbuiltin/mv.c
r1604 r1710 97 97 static int usage(FILE *); 98 98 99 #if !defined(__FreeBSD__) && !defined(__APPLE__) 100 extern void strmode(mode_t mode, char *p); 101 #endif 99 extern void bsd_strmode(mode_t mode, char *p); 102 100 103 101 #if !defined(__FreeBSD__) && !defined(__APPLE__) && !defined(__DragonFly__) … … 258 256 ask = 1; 259 257 } else if (access(to, W_OK) && !stat(to, &sb)) { 260 strmode(sb.st_mode, modep);258 bsd_strmode(sb.st_mode, modep); 261 259 (void)fprintf(stderr, "override %s%s%s/%s for %s? %s", 262 260 modep + 1, modep[9] == ' ' ? "" : " ", -
trunk/src/kmk/kmkbuiltin/rm.c
r1629 r1710 91 91 #endif 92 92 93 #if !defined(__FreeBSD__) && !defined(__APPLE__) 94 extern void strmode(mode_t mode, char *p); 95 #endif 93 extern void bsd_strmode(mode_t mode, char *p); 96 94 97 95 static int dflag, eval, fflag, iflag, Pflag, vflag, Wflag, stdin_ok; … … 610 608 ) 611 609 return (1); 612 strmode(sp->st_mode, modep);610 bsd_strmode(sp->st_mode, modep); 613 611 #ifdef SF_APPEND 614 612 if ((flagsp = fflagstostr(sp->st_flags)) == NULL) -
trunk/src/kmk/kmkbuiltin/setmode.c
r616 r1710 55 55 #else 56 56 #include "mscfakes.h" 57 #endif 57 #endif 58 58 59 59 #ifdef SETMODE_DEBUG … … 89 89 #ifndef _DIAGASSERT 90 90 # define _DIAGASSERT assert 91 #endif 91 #endif 92 92 93 93 #ifndef S_ISTXT … … 106 106 */ 107 107 mode_t 108 getmode(bbox, omode)108 bsd_getmode(bbox, omode) 109 109 const void *bbox; 110 110 mode_t omode; … … 196 196 197 197 void * 198 setmode(p)198 bsd_setmode(p) 199 199 const char *p; 200 200 { … … 221 221 sigfillset(&signset); 222 222 (void)sigprocmask(SIG_BLOCK, &signset, &sigoset); 223 #endif 223 #endif 224 224 (void)umask(mask = umask(0)); 225 225 mask = ~mask; … … 229 229 230 230 setlen = SET_LEN + 2; 231 231 232 232 if ((set = malloc((u_int)(sizeof(BITCMD) * setlen))) == NULL) 233 233 return (NULL); … … 290 290 case 's': 291 291 /* 292 * If specific bits where requested and 293 * only "other" bits ignore set-id. 292 * If specific bits where requested and 293 * only "other" bits ignore set-id. 294 294 */ 295 295 if (who == 0 || (who & ~S_IRWXO)) … … 298 298 case 't': 299 299 /* 300 * If specific bits where requested and 301 * only "other" bits ignore set-id. 300 * If specific bits where requested and 301 * only "other" bits ignore set-id. 302 302 */ 303 303 if (who == 0 || (who & ~S_IRWXO)) { … … 412 412 set->bits = mask; 413 413 } 414 414 415 415 if (oparg == '+') 416 416 set->cmd2 |= CMD2_SET; … … 446 446 * Given an array of bitcmd structures, compress by compacting consecutive 447 447 * '+', '-' and 'X' commands into at most 3 commands, one of each. The 'u', 448 * 'g' and 'o' commands continue to be separate. They could probably be 448 * 'g' and 'o' commands continue to be separate. They could probably be 449 449 * compacted, but it's not worth the effort. 450 450 */ -
trunk/src/kmk/kmkbuiltin/strmode.c
r618 r1710 48 48 #else 49 49 #include "mscfakes.h" 50 #endif 50 #endif 51 51 52 52 #ifndef _DIAGASSERT 53 53 #define _DIAGASSERT assert 54 #endif 54 #endif 55 55 56 56 void 57 strmode(mode, p)57 bsd_strmode(mode, p) 58 58 mode_t mode; 59 59 char *p; … … 74 74 *p++ = 'b'; 75 75 break; 76 #endif 76 #endif 77 77 case S_IFREG: /* regular */ 78 78 #ifdef S_ARCH2 … … 176 176 #else 177 177 switch (mode & (S_IXOTH)) { 178 #endif 178 #endif 179 179 case 0: 180 180 *p++ = '-';
Note:
See TracChangeset
for help on using the changeset viewer.