Changeset 227 for trunk/src/gmake


Ignore:
Timestamp:
Feb 9, 2005, 11:21:34 AM (20 years ago)
Author:
bird
Message:

builtin stuff.

Location:
trunk/src/gmake
Files:
2 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/gmake/Makefile.kmk

    r225 r227  
    6767        vpath.c \
    6868        remote-stub.c \
    69         kmkbuiltin.c
     69        kmkbuiltin.c \
     70        kmkbuiltin/echo.c \
     71        kmkbuiltin/mkdir.c \
     72        kmkbuiltin/setmode.c
    7073
    7174kmk_SOURCES.os2 = \
  • trunk/src/gmake/job.c

    r225 r227  
    490490      int child_failed;
    491491      int any_remote, any_local;
    492 #ifdef MAKE_DLLSHELL
    493       struct child *dllshelled_child = 0;
     492#if defined(CONFIG_WITH_KMK_BUILTIN) || defined(MAKE_DLLSHELL)
     493      struct child *completed_child = 0;
    494494#endif
    495495
     
    527527          any_remote |= c->remote;
    528528          any_local |= ! c->remote;
    529 #ifdef MAKE_DLLSHELL
    530           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;
    532532#endif
    533533          DB (DB_JOBS, (_("Live child 0x%08lx (%s) PID %ld %s\n"),
     
    557557        {
    558558          /* No remote children.  Check for local children.  */
    559 #ifdef MAKE_DLLSHELL
    560           if (dllshelled_child)
     559#if defined(CONFIG_WITH_KMK_BUILTIN) || defined(MAKE_DLLSHELL)
     560          if (completed_child)
    561561            {
    562               pid = dllshelled_child->pid;
    563               status = (WAIT_T)dllshelled_child->status;
     562              pid = completed_child->pid;
     563              status = (WAIT_T)completed_child->status;
    564564            }
    565565          else
     
    11121112  if ((flags & COMMANDS_BUILTIN) && !just_print_flag)
    11131113    {
     1114      int    rc;
    11141115      char **p2 = argv;
    11151116      while (*p2 && strncmp(*p2, "kmk_builtin_", sizeof("kmk_builtin_") - 1))
     
    11171118      assert(*p2);
    11181119      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);
    11201130#ifndef VMS
    11211131      free (argv[0]);
     
    11241134      if (!rc)
    11251135          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;
    11281139      return;
    11291140    }
  • trunk/src/gmake/job.h

    r58 r227  
    5858#endif
    5959    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
    6064#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. */
    6565    unsigned int dllshelled:1;  /* Nonzero if executed thru dllshell. */
    6666#endif
  • trunk/src/gmake/kmkbuiltin.c

    r225 r227  
    2626
    2727#include <string.h>
     28#include <stdlib.h>
    2829#include <stdio.h>
     30#include <ctype.h>
    2931#include "kmkbuiltin.h"
    3032
    31 int kmk_builtin_cp(char **argv)
     33extern char **environ;
     34
     35extern int kmk_builtin_cp(int argc, char **argv, char **envp);
     36extern int kmk_builtin_chmod(int argc, char **argv, char **envp);
     37extern int kmk_builtin_echo(int argc, char **argv, char **envp);
     38extern int kmk_builtin_mkdir(int argc, char **argv, char **envp);
     39extern int kmk_builtin_mv(int argc, char **argv, char **envp);
     40extern int kmk_builtin_rm(int argc, char **argv, char **envp);
     41extern int kmk_builtin_rmdir(int argc, char **argv, char **envp);
     42
     43int kmk_builtin_command(const char *pszCmd)
    3244{
    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;
    34165}
    35166
    36 int kmk_builtin_command(char **argv)
     167
     168int kmk_builtin_command_parsed(int argc, char **argv)
    37169{
    38170    const char *pszCmd = argv[0];
     
    52184     * String switch on the command.
    53185     */
    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);
    56189    //else if (!strcmp(pszCmd, "chmod"))
    57190    //    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);
    60195    //else if (!strcmp(pszCmd, "mv"))
    61196    //    rc = kmk_builtin_mv(argv);
  • trunk/src/gmake/kmkbuiltin.h

    r225 r227  
    2525 */
    2626
    27 int kmk_builtin_command(char **argv);
     27int kmk_builtin_command(const char *pszCmd);
     28int kmk_builtin_command_parsed(int argc, char **argv);
     29
  • trunk/src/gmake/kmkbuiltin/mkdir.c

    r226 r227  
    4040#endif
    4141#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 $");
    4343
    4444#include <sys/types.h>
    4545#include <sys/stat.h>
    4646
    47 #include <err.h>
     47//#include <err.h>
    4848#include <errno.h>
    4949#include <libgen.h>
     
    5454#include <unistd.h>
    5555
     56extern void * setmode(const char *p);
     57extern mode_t getmode(const void *bbox, mode_t omode);
     58
    5659static int      build(char *, mode_t);
    57 static void     usage(void);
     60static int      usage(void);
    5861
    5962int vflag;
    6063
    6164int
    62 main(int argc, char *argv[])
     65kmk_builtin_mkdir(int argc, char *argv[])
    6366{
    6467        int ch, exitval, success, pflag;
     
    6871        omode = pflag = 0;
    6972        mode = NULL;
     73        opterr = 1;
     74        optarg = NULL;
     75        optopt = 0;
     76        optind = 0; /* init */
    7077        while ((ch = getopt(argc, argv, "m:pv")) != -1)
    7178                switch(ch) {
     
    8087                        break;
    8188                case '?':
    82                 default:
    83                         usage();
     89                default:
     90                        return usage();
    8491                }
    8592
     
    8794        argv += optind;
    8895        if (argv[0] == NULL)
    89                 usage();
     96                return usage();
    9097
    9198        if (mode == NULL) {
    9299                omode = S_IRWXU | S_IRWXG | S_IRWXO;
    93100        } 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                }
    96105                omode = getmode(set, S_IRWXU | S_IRWXG | S_IRWXO);
    97106                free(set);
     
    105114                } else if (mkdir(*argv, omode) < 0) {
    106115                        if (errno == ENOTDIR || errno == ENOENT)
    107                                 warn("%s", dirname(*argv));
     116                                fprintf(stderr, "%s: %s", argv[0], dirname(*argv));
    108117                        else
    109                                 warn("%s", *argv);
     118                                fprintf(stderr, "%s: %s", argv[0], *argv);
    110119                        success = 0;
    111120                } else if (vflag)
     
    122131                 */
    123132                if (success && mode != NULL && chmod(*argv, omode) == -1) {
    124                         warn("%s", *argv);
     133                        fprintf(stderr, "%s: %s", argv[0], *argv);
    125134                        exitval = 1;
    126135                }
    127136        }
    128         exit(exitval);
     137        return exitval;
    129138}
    130139
     
    200209}
    201210
    202 void
     211int
    203212usage(void)
    204213{
    205214
    206215        (void)fprintf(stderr, "usage: mkdir [-pv] [-m mode] directory ...\n");
    207         exit (EX_USAGE);
     216        return EX_USAGE;
    208217}
Note: See TracChangeset for help on using the changeset viewer.