Changeset 227 for trunk/src/gmake
- Timestamp:
- Feb 9, 2005, 11:21:34 AM (20 years ago)
- Location:
- trunk/src/gmake
- Files:
-
- 2 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/gmake/Makefile.kmk
r225 r227 67 67 vpath.c \ 68 68 remote-stub.c \ 69 kmkbuiltin.c 69 kmkbuiltin.c \ 70 kmkbuiltin/echo.c \ 71 kmkbuiltin/mkdir.c \ 72 kmkbuiltin/setmode.c 70 73 71 74 kmk_SOURCES.os2 = \ -
trunk/src/gmake/job.c
r225 r227 490 490 int child_failed; 491 491 int any_remote, any_local; 492 #if def MAKE_DLLSHELL493 struct child * dllshelled_child = 0;492 #if defined(CONFIG_WITH_KMK_BUILTIN) || defined(MAKE_DLLSHELL) 493 struct child *completed_child = 0; 494 494 #endif 495 495 … … 527 527 any_remote |= c->remote; 528 528 any_local |= ! c->remote; 529 #if def MAKE_DLLSHELL530 if (c-> dllshell_done)531 dllshelled_child = c;529 #if defined(CONFIG_WITH_KMK_BUILTIN) || defined(MAKE_DLLSHELL) 530 if (c->have_status) 531 completed_child = c; 532 532 #endif 533 533 DB (DB_JOBS, (_("Live child 0x%08lx (%s) PID %ld %s\n"), … … 557 557 { 558 558 /* No remote children. Check for local children. */ 559 #if def MAKE_DLLSHELL560 if ( dllshelled_child)559 #if defined(CONFIG_WITH_KMK_BUILTIN) || defined(MAKE_DLLSHELL) 560 if (completed_child) 561 561 { 562 pid = dllshelled_child->pid;563 status = (WAIT_T) dllshelled_child->status;562 pid = completed_child->pid; 563 status = (WAIT_T)completed_child->status; 564 564 } 565 565 else … … 1112 1112 if ((flags & COMMANDS_BUILTIN) && !just_print_flag) 1113 1113 { 1114 int rc; 1114 1115 char **p2 = argv; 1115 1116 while (*p2 && strncmp(*p2, "kmk_builtin_", sizeof("kmk_builtin_") - 1)) … … 1117 1118 assert(*p2); 1118 1119 set_command_state (child->file, cs_running); 1119 int rc = kmk_builtin_command(p2); 1120 if (p2 != argv) 1121 rc = kmk_builtin_command(*p2); 1122 else 1123 { 1124 int argc = 1; 1125 while (argv[argc]) 1126 argc++; 1127 rc = kmk_builtin_command_parsed(argc, argv); 1128 } 1129 printf("rc=%d\n", rc); 1120 1130 #ifndef VMS 1121 1131 free (argv[0]); … … 1124 1134 if (!rc) 1125 1135 goto next_command; 1126 child->file->update_status = 2; 1127 notice_finished_file (child->file); 1136 child->pid = (pid_t)42424242; 1137 child->status = rc << 8; 1138 child->have_status = 1; 1128 1139 return; 1129 1140 } -
trunk/src/gmake/job.h
r58 r227 58 58 #endif 59 59 char *sh_batch_file; /* Script file for shell commands */ 60 #if defined(CONFIG_WITH_KMK_BUILTIN) || defined(MAKE_DLLSHELL) 61 int status; /* Status of the job. */ 62 unsigned int have_status:1; /* Nonzero if status is available. */ 63 #endif 60 64 #ifdef MAKE_DLLSHELL 61 int status; /* Status of the job.62 Another thread might set this. */63 char dllshell_done; /* Nonzero if executed thru a dll shell.64 Another thread might set this. */65 65 unsigned int dllshelled:1; /* Nonzero if executed thru dllshell. */ 66 66 #endif -
trunk/src/gmake/kmkbuiltin.c
r225 r227 26 26 27 27 #include <string.h> 28 #include <stdlib.h> 28 29 #include <stdio.h> 30 #include <ctype.h> 29 31 #include "kmkbuiltin.h" 30 32 31 int kmk_builtin_cp(char **argv) 33 extern char **environ; 34 35 extern int kmk_builtin_cp(int argc, char **argv, char **envp); 36 extern int kmk_builtin_chmod(int argc, char **argv, char **envp); 37 extern int kmk_builtin_echo(int argc, char **argv, char **envp); 38 extern int kmk_builtin_mkdir(int argc, char **argv, char **envp); 39 extern int kmk_builtin_mv(int argc, char **argv, char **envp); 40 extern int kmk_builtin_rm(int argc, char **argv, char **envp); 41 extern int kmk_builtin_rmdir(int argc, char **argv, char **envp); 42 43 int kmk_builtin_command(const char *pszCmd) 32 44 { 33 return 1; 45 int argc; 46 char **argv; 47 char *psz; 48 int rc; 49 50 /* 51 * Check and skip the prefix. 52 */ 53 if (strncmp(pszCmd, "kmk_builtin_", sizeof("kmk_builtin_") - 1)) 54 { 55 printf("kmk_builtin: Invalid command prefix '%s'!\n", pszCmd); 56 return 1; 57 } 58 59 /* 60 * Parse arguments. 61 */ 62 argc = 0; 63 argv = NULL; 64 while (*pszCmd) 65 { 66 const char *pszEnd; 67 const char *pszNext; 68 int fEscaped = 0; 69 size_t cch; 70 71 /* 72 * Find start and end of the current command. 73 */ 74 if (*pszCmd == '"' || *pszCmd == '\'') 75 { 76 pszEnd = pszCmd; 77 for (;;) 78 { 79 pszEnd = strchr(pszEnd + 1, *pszCmd); 80 if (!pszEnd) 81 { 82 printf("kmk_builtin: Unbalanced quote in argument %d: %s\n", argc + 1, pszCmd); 83 while (argc--) 84 free(argv[argc]); 85 free(argv); 86 return 1; 87 } 88 /* two quotes -> escaped quote. */ 89 if (pszEnd[0] != pszEnd[1]) 90 break; 91 fEscaped = 1; 92 } 93 pszNext = pszEnd + 1; 94 pszCmd++; 95 } 96 else 97 { 98 pszEnd = pszCmd + 1; 99 while (!isspace(*pszEnd)) 100 pszEnd++; 101 pszNext = pszEnd; 102 } 103 104 /* 105 * Make argument. 106 */ 107 if (!(argc % 16)) 108 { 109 void *pv = realloc(argv, sizeof(char *) * (argc + 17)); 110 if (!pv) 111 { 112 printf("kmk_builtin: out of memory. argc=%d\n", argc); 113 break; 114 } 115 argv = (char **)pv; 116 } 117 cch = pszEnd - pszCmd; 118 argv[argc] = malloc(cch + 1); 119 if (!argv[argc]) 120 { 121 printf("kmk_builtin: out of memory. argc=%d len=%d\n", argc, pszEnd - pszCmd + 1); 122 break; 123 } 124 memcpy(argv[argc], pszCmd, cch); 125 argv[argc][cch] = '\0'; 126 127 /* unescape quotes? */ 128 if (fEscaped) 129 { 130 char ch = pszCmd[-1]; 131 char *pszW = argv[argc]; 132 char *pszR = argv[argc]; 133 while (*pszR) 134 { 135 if (*pszR == ch) 136 pszR++; 137 *pszW++ = *pszR++; 138 } 139 *pszW = '\0'; 140 } 141 /* commit it */ 142 argv[++argc] = NULL; 143 144 /* 145 * Next 146 */ 147 pszCmd = pszNext; 148 if (isspace(*pszCmd)) 149 pszCmd++; 150 } 151 152 /* 153 * Execute the command if parsing was successful. 154 */ 155 if (!*pszCmd) 156 rc = kmk_builtin_command_parsed(argc, argv); 157 else 158 rc = 1; 159 160 /* clean up and return. */ 161 while (argc--) 162 free(argv[argc]); 163 free(argv); 164 return rc; 34 165 } 35 166 36 int kmk_builtin_command(char **argv) 167 168 int kmk_builtin_command_parsed(int argc, char **argv) 37 169 { 38 170 const char *pszCmd = argv[0]; … … 52 184 * String switch on the command. 53 185 */ 54 if (!strcmp(pszCmd, "cp")) 55 rc = kmk_builtin_cp(argv); 186 if (0) { } 187 //if (!strcmp(pszCmd, "cp")) 188 // rc = kmk_builtin_cp(argc, argv, environ); 56 189 //else if (!strcmp(pszCmd, "chmod")) 57 190 // rc = kmk_builtin_chmod(argv); 58 //else if (!strcmp(pszCmd, "mkdir")) 59 // rc = kmk_builtin_mkdir(argv); 191 else if (!strcmp(pszCmd, "echo")) 192 rc = kmk_builtin_echo(argc, argv, environ); 193 else if (!strcmp(pszCmd, "mkdir")) 194 rc = kmk_builtin_mkdir(argc, argv, environ); 60 195 //else if (!strcmp(pszCmd, "mv")) 61 196 // rc = kmk_builtin_mv(argv); -
trunk/src/gmake/kmkbuiltin.h
r225 r227 25 25 */ 26 26 27 int kmk_builtin_command(char **argv); 27 int kmk_builtin_command(const char *pszCmd); 28 int kmk_builtin_command_parsed(int argc, char **argv); 29 -
trunk/src/gmake/kmkbuiltin/mkdir.c
r226 r227 40 40 #endif 41 41 #include <sys/cdefs.h> 42 __FBSDID("$FreeBSD: src/bin/mkdir/mkdir.c,v 1.28 2004/04/06 20:06:48 markm Exp $");42 //__FBSDID("$FreeBSD: src/bin/mkdir/mkdir.c,v 1.28 2004/04/06 20:06:48 markm Exp $"); 43 43 44 44 #include <sys/types.h> 45 45 #include <sys/stat.h> 46 46 47 #include <err.h>47 //#include <err.h> 48 48 #include <errno.h> 49 49 #include <libgen.h> … … 54 54 #include <unistd.h> 55 55 56 extern void * setmode(const char *p); 57 extern mode_t getmode(const void *bbox, mode_t omode); 58 56 59 static int build(char *, mode_t); 57 static voidusage(void);60 static int usage(void); 58 61 59 62 int vflag; 60 63 61 64 int 62 main(int argc, char *argv[])65 kmk_builtin_mkdir(int argc, char *argv[]) 63 66 { 64 67 int ch, exitval, success, pflag; … … 68 71 omode = pflag = 0; 69 72 mode = NULL; 73 opterr = 1; 74 optarg = NULL; 75 optopt = 0; 76 optind = 0; /* init */ 70 77 while ((ch = getopt(argc, argv, "m:pv")) != -1) 71 78 switch(ch) { … … 80 87 break; 81 88 case '?': 82 83 usage();89 default: 90 return usage(); 84 91 } 85 92 … … 87 94 argv += optind; 88 95 if (argv[0] == NULL) 89 usage();96 return usage(); 90 97 91 98 if (mode == NULL) { 92 99 omode = S_IRWXU | S_IRWXG | S_IRWXO; 93 100 } else { 94 if ((set = setmode(mode)) == NULL) 95 errx(1, "invalid file mode: %s", mode); 101 if ((set = setmode(mode)) == NULL) { 102 fprintf(stderr, "%s: invalid file mode: %s", mode, argv[0]); 103 return 1; 104 } 96 105 omode = getmode(set, S_IRWXU | S_IRWXG | S_IRWXO); 97 106 free(set); … … 105 114 } else if (mkdir(*argv, omode) < 0) { 106 115 if (errno == ENOTDIR || errno == ENOENT) 107 warn("%s", dirname(*argv));116 fprintf(stderr, "%s: %s", argv[0], dirname(*argv)); 108 117 else 109 warn("%s", *argv);118 fprintf(stderr, "%s: %s", argv[0], *argv); 110 119 success = 0; 111 120 } else if (vflag) … … 122 131 */ 123 132 if (success && mode != NULL && chmod(*argv, omode) == -1) { 124 warn("%s", *argv);133 fprintf(stderr, "%s: %s", argv[0], *argv); 125 134 exitval = 1; 126 135 } 127 136 } 128 exit(exitval);137 return exitval; 129 138 } 130 139 … … 200 209 } 201 210 202 void 211 int 203 212 usage(void) 204 213 { 205 214 206 215 (void)fprintf(stderr, "usage: mkdir [-pv] [-m mode] directory ...\n"); 207 exit (EX_USAGE);216 return EX_USAGE; 208 217 }
Note:
See TracChangeset
for help on using the changeset viewer.