Ticket #53387: patch-xinstall-mkdirchmod-warning.diff

File patch-xinstall-mkdirchmod-warning.diff, 3.6 KB (added by RJVB (René Bertin), 8 years ago)
  • src/pextlib1.0/xinstall.c

    diff --git src/pextlib1.0/xinstall.c src/pextlib1.0/xinstall.c
    index f28ec50e..0705e0b2 100644
    InstallCmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc, Tcl_Obj * 
    154154        char *curdir;
    155155        const char *group, *owner, *cp;
    156156        Tcl_Obj *to_name;
    157         int dodir = 0;
     157        int dodir = 0, verbose = 0;
    158158
    159159        suffix = BACKUP_SUFFIX;
    160160        mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
    InstallCmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc, Tcl_Obj * 
    177177                                return TCL_ERROR;
    178178                        }
    179179                        suffix = Tcl_GetString(*(++objv));
     180                        if (verbose) {
     181                                ui_debug(interp, "%s: suffix=%s", funcname, suffix);
     182                        }
    180183                        objv++, objc -= 2;
    181184                        /* FALLTHROUGH */
    182185                case 'b':
    183186                        dobackup = 1;
     187                        if (verbose) {
     188                                ui_debug(interp, "%s: backup=true", funcname);
     189                        }
    184190                        objv++, objc--;
    185191                        break;
    186192                case 'C':
    187193                        docompare = 1;
     194                        if (verbose) {
     195                                ui_debug(interp, "%s: docompare=true", funcname);
     196                        }
    188197                        objv++, objc--;
    189198                        break;
    190199                case 'c':
    InstallCmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc, Tcl_Obj * 
    206215                                Tcl_SetResult(interp, "invalid flags for -f", TCL_STATIC);
    207216                                return TCL_ERROR;
    208217                        }
     218                        if (verbose) {
     219                                ui_debug(interp, "%s: flags=%s fset=0x%lx", funcname, flags, fset);
     220                        }
    209221                        iflags |= SETFLAGS;
    210222                        objv++, objc -= 2;
    211223#endif
    InstallCmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc, Tcl_Obj * 
    216228                                return TCL_ERROR;
    217229                        }
    218230                        group = Tcl_GetString(*(++objv));
     231                        if (verbose) {
     232                                ui_debug(interp, "%s: group=%s", funcname, group);
     233                        }
    219234                        objv++, objc -= 2;
    220235                        break;
    221236                case 'M':
    222237                        nommap = 1;
    223238                        objv++, objc--;
    224239                        break;
    225                 case 'm':
     240                case 'm': {
    226241                        if (!objc) {
    227242                                Tcl_WrongNumArgs(interp, 1, objv, "-m");
    228243                                return TCL_ERROR;
    229244                        }
    230                         if (!(set = setmode(Tcl_GetString(*(++objv))))) {
     245                        const char *modeString = Tcl_GetString(*(++objv));
     246                        if (!(set = setmode(modeString))) {
    231247                                char errmsg[255];
    232248
    233249                                snprintf(errmsg, sizeof errmsg, "%s: Invalid file mode: %s",
    234                                          funcname, Tcl_GetString(*objv));
     250                                         funcname, modeString);
    235251                                Tcl_SetResult(interp, errmsg, TCL_VOLATILE);
    236252                                return TCL_ERROR;
    237253                        }
    238254                        mode = getmode(set, 0);
     255                        if (verbose) {
     256                                ui_debug(interp, "%s: mode=%s umask=0%o", funcname, modeString, mode);
     257                        }
    239258                        free(set);
    240259                        objv++, objc -= 2;
    241260                        break;
     261                }
    242262                case 'o':
    243263                        if (!objc) {
    244264                                Tcl_WrongNumArgs(interp, 1, objv, "-o");
    245265                                return TCL_ERROR;
    246266                        }
    247267                        owner = Tcl_GetString(*(++objv));
     268                        if (verbose) {
     269                                ui_debug(interp, "%s: owner=%s", funcname, owner);
     270                        }
    248271                        objv++, objc -= 2;
    249272                        break;
    250273                case 'p':
    InstallCmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc, Tcl_Obj * 
    261284                        break;
    262285                case 'v':
    263286                        /* provided only for compatibility with install(1) */
     287                        verbose += 1;
    264288                        objv++, objc--;
    265289                        break;
    266290                case 'W':
    InstallCmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc, Tcl_Obj * 
    269293                                return TCL_ERROR;
    270294                        }
    271295                        curdir = Tcl_GetString(*(++objv));
     296                        if (verbose) {
     297                                ui_debug(interp, "%s: workingdir=%s", funcname, curdir);
     298                        }
    272299                        objv++, objc -= 2;
    273300                        break;
    274301                case '?':
    install_dir(Tcl_Interp *interp, char *path) 
    10741101        if ((gid != (gid_t)-1 || uid != (uid_t)-1) && chown(path, uid, gid))
    10751102                { /* Don't bother to warn */ };
    10761103        if (chmod(path, mode))
    1077                 { /* Don't bother to warn */ };
     1104                {
     1105                        char errmsg[255];
     1106
     1107                        snprintf(errmsg, sizeof errmsg, "%s: chmod(%s,0%o), %s",
     1108                                 funcname, path, mode, strerror(errno));
     1109                        Tcl_SetResult(interp, errmsg, TCL_VOLATILE);
     1110                        return TCL_ERROR;
     1111                }
    10781112        return TCL_OK;
    10791113}
    10801114