Changeset 1674

Show
Ignore:
Timestamp:
07/11/08 02:49:29 (8 weeks ago)
Author:
bird
Message:

Fixed the error message on _spawnvp failure (windows) and added an error message for execvp failure (the rest).

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/kmkbuiltin/redirect.c

    r1577 r1674  
    4848#  define LIBPATHSTRICT 3 
    4949# endif 
    50 #endif  
     50#endif 
     51 
     52 
     53static const char *name(const char *pszName) 
     54{ 
     55    const char *psz = strrchr(pszName, '/'); 
     56#if defined(_MSC_VER) || defined(__OS2__) 
     57    const char *psz2 = strrchr(pszName, '\\'); 
     58    if (!psz2) 
     59        psz2 = strrchr(pszName, ':'); 
     60    if (psz2 && (!psz || psz2 > psz)) 
     61        psz = psz2; 
     62#endif 
     63    return psz ? psz + 1 : pszName; 
     64} 
    5165 
    5266 
     
    93107     */ 
    94108    if (argc <= 1) 
    95         return usage(pStdErr, argv[0]); 
     109        return usage(pStdErr, name(argv[0])); 
    96110    for (i = 1; i < argc; i++) 
    97111    { 
     
    127141            if (*psz == 'h') 
    128142            { 
    129                 usage(pStdOut, argv[0]); 
     143                usage(pStdOut, name(argv[0])); 
    130144                return 0; 
    131145            } 
     
    151165                    if (i + 1 >= argc) 
    152166                    { 
    153                         fprintf(pStdErr, "%s: syntax error: no argument for %s\n", argv[0], argv[i]); 
     167                        fprintf(pStdErr, "%s: syntax error: no argument for %s\n", name(argv[0]), argv[i]); 
    154168                        return 1; 
    155169                    } 
     
    168182                    if (rc) 
    169183                    { 
    170                         fprintf(pStdErr, "%s: error: DosSetExtLibPath(\"%s\", %.*s (%lu)): %lu\n",  
    171                                 argv[0], pszVal, pszVal - psz - 1, psz, ulVar, rc); 
     184                        fprintf(pStdErr, "%s: error: DosSetExtLibPath(\"%s\", %.*s (%lu)): %lu\n", 
     185                                name(argv[0]), pszVal, pszVal - psz - 1, psz, ulVar, rc); 
    172186                        return 1; 
    173187                    } 
     
    177191                if (putenv(psz)) 
    178192                { 
    179                     fprintf(pStdErr, "%s: error: putenv(\"%s\"): %s\n", argv[0], psz, strerror(errno)); 
     193                    fprintf(pStdErr, "%s: error: putenv(\"%s\"): %s\n", name(argv[0]), psz, strerror(errno)); 
    180194                    return 1; 
    181195                } 
     
    195209                    if (i + 1 >= argc) 
    196210                    { 
    197                         fprintf(pStdErr, "%s: syntax error: no argument for %s\n", argv[0], argv[i]); 
     211                        fprintf(pStdErr, "%s: syntax error: no argument for %s\n", name(argv[0]), argv[i]); 
    198212                        return 1; 
    199213                    } 
     
    223237                } 
    224238#endif 
    225                 fprintf(pStdErr, "%s: error: chdir(\"%s\"): %s\n", argv[0], psz, strerror(errno)); 
     239                fprintf(pStdErr, "%s: error: chdir(\"%s\"): %s\n", name(argv[0]), psz, strerror(errno)); 
    226240                return 1; 
    227241            } 
     
    272286 
    273287                case '+': 
    274                     fprintf(pStdErr, "%s: syntax error: Unexpected '+' in '%s'\n", argv[0], argv[i]); 
     288                    fprintf(pStdErr, "%s: syntax error: Unexpected '+' in '%s'\n", name(argv[0]), argv[i]); 
    275289                    return 1; 
    276290 
     
    342356                    if (!fd) 
    343357                    { 
    344                         fprintf(pStdErr, "%s: error: failed to convert '%s' to a number\n", argv[0], argv[i]); 
     358                        fprintf(pStdErr, "%s: error: failed to convert '%s' to a number\n", name(argv[0]), argv[i]); 
    345359                        return 1; 
    346360 
     
    348362                    if (fd < 0) 
    349363                    { 
    350                         fprintf(pStdErr, "%s: error: negative fd %d (%s)\n", argv[0], fd, argv[i]); 
     364                        fprintf(pStdErr, "%s: error: negative fd %d (%s)\n", name(argv[0]), fd, argv[i]); 
    351365                        return 1; 
    352366                    } 
     
    357371                 */ 
    358372                default: 
    359                     fprintf(pStdErr, "%s: error: failed to convert '%s' ('%s') to a file descriptor\n", argv[0], psz, argv[i]); 
     373                    fprintf(pStdErr, "%s: error: failed to convert '%s' ('%s') to a file descriptor\n", name(argv[0]), psz, argv[i]); 
    360374                    return 1; 
    361375            } 
     
    368382                if (*psz != ':' && *psz != '=') 
    369383                { 
    370                     fprintf(pStdErr, "%s: syntax error: characters following the file descriptor: '%s' ('%s')\n", argv[0], psz, argv[i]); 
     384                    fprintf(pStdErr, "%s: syntax error: characters following the file descriptor: '%s' ('%s')\n", name(argv[0]), psz, argv[i]); 
    371385                    return 1; 
    372386                } 
     
    378392                if (i >= argc) 
    379393                { 
    380                     fprintf(pStdErr, "%s: syntax error: missing filename argument.\n", argv[0]); 
     394                    fprintf(pStdErr, "%s: syntax error: missing filename argument.\n", name(argv[0])); 
    381395                    return 1; 
    382396                } 
     
    397411                if (fdOpened == -1) 
    398412                { 
    399                     fprintf(pStdErr, "%s: error: failed to dup stderr (%d): %s\n", argv[0], fileno(pStdErr), strerror(errno)); 
     413                    fprintf(pStdErr, "%s: error: failed to dup stderr (%d): %s\n", name(argv[0]), fileno(pStdErr), strerror(errno)); 
    400414                    return 1; 
    401415                } 
     
    407421                if (fcntl(fdOpened, F_SETFD, FD_CLOEXEC) == -1) 
    408422                { 
    409                     fprintf(pStdErr, "%s: error: failed to make stderr (%d) close-on-exec: %s\n", argv[0], fdOpened, strerror(errno)); 
     423                    fprintf(pStdErr, "%s: error: failed to make stderr (%d) close-on-exec: %s\n", name(argv[0]), fdOpened, strerror(errno)); 
    410424                    return 1; 
    411425                } 
     
    415429                if (!pNew) 
    416430                { 
    417                     fprintf(pStdErr, "%s: error: failed to fdopen the new stderr (%d): %s\n", argv[0], fdOpened, strerror(errno)); 
     431                    fprintf(pStdErr, "%s: error: failed to fdopen the new stderr (%d): %s\n", name(argv[0]), fdOpened, strerror(errno)); 
    418432                    return 1; 
    419433                } 
     
    436450            if (fdOpened == -1) 
    437451            { 
    438                 fprintf(pStdErr, "%s: error: failed to open '%s' as %d: %s\n", argv[0], psz, fd, strerror(errno)); 
     452                fprintf(pStdErr, "%s: error: failed to open '%s' as %d: %s\n", name(argv[0]), psz, fd, strerror(errno)); 
    439453                return 1; 
    440454            } 
     
    444458                if (dup2(fdOpened, fd) == -1) 
    445459                { 
    446                     fprintf(pStdErr, "%s: error: failed to dup '%s' as %d: %s\n", argv[0], psz, fd, strerror(errno)); 
     460                    fprintf(pStdErr, "%s: error: failed to dup '%s' as %d: %s\n", name(argv[0]), psz, fd, strerror(errno)); 
    447461                    return 1; 
    448462                } 
     
    452466        else 
    453467        { 
    454             fprintf(pStdErr, "%s: syntax error: Invalid argument '%s'.\n", argv[0], argv[i]); 
    455             return usage(pStdErr, argv[0]); 
     468            fprintf(pStdErr, "%s: syntax error: Invalid argument '%s'.\n", name(argv[0]), argv[i]); 
     469            return usage(pStdErr, name(argv[0])); 
    456470        } 
    457471    } 
     
    462476    if (i >= argc) 
    463477    { 
    464         fprintf(pStdErr, "%s: syntax error: nothing to execute!\n", argv[0]); 
    465         return usage(pStdErr, argv[0]); 
     478        fprintf(pStdErr, "%s: syntax error: nothing to execute!\n", name(argv[0])); 
     479        return usage(pStdErr, name(argv[0])); 
    466480    } 
    467481 
    468482#if defined(_MSC_VER) 
     483    if (fileno(pStdErr) != 2) /* no close-on-exec flag on windows */ 
     484    { 
     485        fclose(pStdErr); 
     486        pStdErr = NULL; 
     487    } 
     488 
    469489    /** @todo 
    470490     * We'll have to find the '--' in the commandline and pass that 
     
    472492     * is gonna be messed up. 
    473493     */ 
    474     if (fileno(pStdErr) != 2) 
    475         fclose(pStdErr); 
    476494    rc = _spawnvp(_P_WAIT, argv[i], &argv[i]); 
    477     if (rc == -1 && fileno(pStdErr) != 2) 
     495    if (rc == -1 && pStdErr) 
    478496    { 
    479         fprintf(pStdErr, "%s: error: _spawnvp(_P_WAIT,%s,..) failed: %s\n", argv[0], argv[i], strerror(errno)); 
     497        fprintf(pStdErr, "%s: error: _spawnvp(_P_WAIT, \"%s\", ...) failed: %s\n", name(argv[0]), argv[i], strerror(errno)); 
    480498        rc = 1; 
    481499    } 
     
    483501#else 
    484502    execvp(argv[i], &argv[i]); 
     503    fprintf(pStdErr, "%s: error: _execvp(_P_WAIT, \"%s\", ...) failed: %s\n", name(argv[0]), argv[i], strerror(errno)); 
    485504    return 1; 
    486505#endif