/* * setrlimit.c * The limit Tcl command. */ #include #include #include Tcl_ObjCmdProc LimitCmd; #undef TCL_STORAGE_CLASS #define TCL_STORAGE_CLASS DLLEXPORT EXTERN int Limit_Init _ANSI_ARGS_((Tcl_Interp *interp)); /* * LimitCmd -- * Set resource limits. * * Results: * none * * Side Effects: * Set resource limits. */ int LimitCmd(ClientData data, Tcl_Interp *interp, int argc, Tcl_Obj *CONST objv[]) { struct rlimit limit; Tcl_Obj *limObj[2]; Tcl_ResetResult(interp); if (getrlimit(RLIMIT_NOFILE, &limit) < 0) { Tcl_AppendResult(interp, "NOFILE: ", Tcl_PosixError(interp), NULL); return TCL_ERROR; } if (argc > 1) { long rlim_cur; if (Tcl_GetLongFromObj(interp, objv[1], &rlim_cur) != TCL_OK) return TCL_ERROR; limit.rlim_cur = rlim_cur; if (setrlimit(RLIMIT_NOFILE, &limit) < 0) { Tcl_AppendResult(interp, "NOFILE: ", Tcl_PosixError(interp), NULL); return TCL_ERROR; } } /* bad, bad style, direct writing to interp->result */ limObj[0] = Tcl_NewLongObj((long)limit.rlim_cur); limObj[1] = Tcl_NewLongObj((long)limit.rlim_max); Tcl_SetObjResult(interp, Tcl_NewListObj(2, limObj)); return TCL_OK; } /* * Limit_Init -- * Initialize the Tcl limit facility. * * Results: * TCL_OK. * * Side Effects: * None. */ int Limit_Init(Tcl_Interp *interp) { int code; #ifdef USE_TCL_STUBS if (Tcl_InitStubs(interp, "8.1", 0) == NULL) { return TCL_ERROR; } #endif Tcl_CreateObjCommand(interp, "limit", LimitCmd, NULL, NULL); code = Tcl_PkgProvide(interp, "limit", "1.0"); if (code != TCL_OK) { return code; } return TCL_OK; }