rem: "-maxrun", "-maxwait", "-maxupload", NULL
add: "-maxrun", "-maxwait", "-maxupload", "-timeout", NULL
context: NsTclLimitsObjCmd(ClientData data, Tcl_Interp *interp, int objc, Tcl_Obj **objv){    Tcl_HashEntry *hPtr;    Tcl_HashSearch search;    Limits *limitsPtr, saveLimits;    char *limits, *pattern;    int i, val;    static CONST char *opts[] = {        "get", "set", "list", "register", NULL    };    enum {        LGetIdx, LSetIdx, LListIdx, LRegisterIdx    } opt;    static CONST char *cfgs[] = {        "-maxrun", "-maxwait", "-maxupload", NULL    };    enum {        LCRunIdx, LCWaitIdx, LCUploadIdx    } cfg;    if (objc < 2) {        Tcl_WrongNumArgs(interp, 1, objv, "option ?args?");        return TCL_ERROR;    }    if (Tcl_GetIndexFromObj(interp, objv[1], opts, "option", 1,                (int *) &opt) != TCL_OK) {        return TCL_ERROR;    }    switch (opt) {    case LListIdx:        if (objc != 2 && objc != 3) {            Tcl_WrongNumArgs(interp, 2, objv, "?pattern?");            return TCL_ERROR;        }        if (objc == 2) {            pattern = NULL;        } else {            pattern = Tcl_GetString(objv[2]);        }        hPtr = Tcl_FirstHashEntry(&limtable, &search);        while (hPtr != NULL) {            limits = Tcl_GetHashKey(&limtable, hPtr);            if (pattern == NULL || Tcl_StringMatch(limits, pattern)) {                Tcl_AppendElement(interp, limits);            }            hPtr = Tcl_NextHashEntry(&search);        }        break;    case LGetIdx:        if (objc != 3) {            Tcl_WrongNumArgs(interp, 2, objv, "limit");            return TCL_ERROR;        }        if (GetLimits(interp, objv[2], &limitsPtr, 0) != TCL_OK ||                LimitsResult(interp, limitsPtr) != TCL_OK) {            return TCL_ERROR;        }        break;    case LSetIdx:        if (objc < 3 || (((objc - 3) % 2) != 0)) {            Tcl_WrongNumArgs(interp, 2, objv, "limit ?opt val opt val...?");            return TCL_ERROR;        }        (void) GetLimits(interp, objv[2], &limitsPtr, 1);        saveLimits = *limitsPtr;        for (i = 3; i < objc; i += 2) {            if (Tcl_GetIndexFromObj(interp, objv[i], cfgs, "cfg", 0,                        (int *) &cfg) != TCL_OK ||                     Tcl_GetIntFromObj(interp, objv[i+1], &val) != TCL_OK) {                *limitsPtr = saveLimits;                return TCL_ERROR;            }            switch (cfg) {                case LCRunIdx:                    limitsPtr->maxrun = val;                    break;                case LCWaitIdx:                    limitsPtr->maxwait = val;                    break;                case LCUploadIdx:                    limitsPtr->maxupload = val;                    break;            }        }        if (LimitsResult(interp, limitsPtr) != TCL_OK) {            return TCL_ERROR;        }        break;    case LRegisterIdx:        if (objc != 6) {            Tcl_WrongNumArgs(interp, 2, objv, "limit server method url");            return TCL_ERROR;        }        if (GetLimits(interp, objv[2], &limitsPtr, 0) != TCL_OK) {            return TCL_ERROR;        }        Ns_UrlSpecificSet(Tcl_GetString(objv[3]),                Tcl_GetString(objv[4]),                Tcl_GetString(objv[5]), limid, limitsPtr, 0, NULL);        break;    }    return TCL_OK;}