diff --git a/microscript/ILibDuktape_Helpers.c b/microscript/ILibDuktape_Helpers.c index 489dad6..ce7d015 100644 --- a/microscript/ILibDuktape_Helpers.c +++ b/microscript/ILibDuktape_Helpers.c @@ -155,20 +155,22 @@ int Duktape_GetIntPropertyValue(duk_context *ctx, duk_idx_t i, char* propertyNam } return retVal; } -void Duktape_CreateEnum(duk_context *ctx, char* enumName, char** fieldNames, int * fieldValues, int numFields) +void Duktape_CreateEnum(duk_context *ctx, char* enumName, char **fieldNames, int *fieldValues, int numFields) +{ + duk_push_global_object(ctx); + Duktape_CreateEnumEx(ctx, fieldNames, fieldValues, numFields); + duk_put_prop_string(ctx, -2, enumName); + duk_pop(ctx); +} +void Duktape_CreateEnumEx(duk_context *ctx, char** fieldNames, int * fieldValues, int numFields) { int i; - duk_push_global_object(ctx); // [global] - duk_push_object(ctx); // [global][obj] - + duk_push_object(ctx); // [obj] for (i = 0; i < numFields; ++i) { - duk_push_int(ctx, fieldValues[i]); // [global][obj][val] - duk_put_prop_string(ctx, -2, fieldNames[i]); // [global][obj] + duk_push_int(ctx, fieldValues[i]); // [obj][val] + duk_put_prop_string(ctx, -2, fieldNames[i]); // [obj] } - duk_put_prop_string(ctx, -2, enumName); // [global] - - duk_pop(ctx); } char *Duktape_GetStashKey(void* value) { diff --git a/microscript/ILibDuktape_Helpers.h b/microscript/ILibDuktape_Helpers.h index 426893f..35869c0 100644 --- a/microscript/ILibDuktape_Helpers.h +++ b/microscript/ILibDuktape_Helpers.h @@ -52,7 +52,8 @@ char* Duktape_GetContextGuidHex(duk_context *ctx, void *db); void *Duktape_GetChain(duk_context *ctx); char *Duktape_GetStashKey(void* value); char* Duktape_GetBuffer(duk_context *ctx, duk_idx_t i, duk_size_t *bufLen); -void Duktape_CreateEnum(duk_context *ctx, char* enumName, char** fieldNames, int * fieldValues, int numFields); +void Duktape_CreateEnumEx(duk_context *ctx, char** fieldNames, int * fieldValues, int numFields); +void Duktape_CreateEnum(duk_context *ctx, char* enumName, char **fieldNames, int *fieldValues, int numFields); char* Duktape_GetStringPropertyValueEx(duk_context *ctx, duk_idx_t i, char* propertyName, char* defaultValue, duk_size_t *len); #define Duktape_GetStringPropertyValue(ctx, i, propertyName, defaultValue) Duktape_GetStringPropertyValueEx(ctx, i, propertyName, defaultValue, NULL) int Duktape_GetIntPropertyValue(duk_context *ctx, duk_idx_t i, char* propertyName, int defaultValue); diff --git a/microscript/ILibDuktape_ScriptContainer.c b/microscript/ILibDuktape_ScriptContainer.c index d6113ce..2fb2671 100644 --- a/microscript/ILibDuktape_ScriptContainer.c +++ b/microscript/ILibDuktape_ScriptContainer.c @@ -42,6 +42,10 @@ limitations under the License. #include #endif +#ifndef WIN32 +#include +#endif + #include "ILibDuktape_ScriptContainer.h" #include "ILibDuktapeModSearch.h" #include "ILibDuktape_EventEmitter.h" @@ -979,6 +983,41 @@ duk_ret_t ILibDuktape_ScriptContainer_Process_coreDumpLocation_setter(duk_contex } return(0); } +#ifndef WIN32 +duk_ret_t ILibDuktape_ScriptContainer_Process_rlimit_getterFunc(duk_context *ctx) +{ + int resource = duk_require_int(ctx, 0); + struct rlimit r; + if (getrlimit(resource, &r) == 0) + { + duk_push_object(ctx); + duk_push_int(ctx, (duk_int_t)r.rlim_cur); duk_put_prop_string(ctx, -2, "soft"); + duk_push_int(ctx, (duk_int_t)r.rlim_max); duk_put_prop_string(ctx, -2, "hard"); + return(1); + } + return(ILibDuktape_Error(ctx, "Error Occured fetching limits")); +} +duk_ret_t ILibDuktape_ScriptContainer_Process_rlimit_setterFunc(duk_context *ctx) +{ + int resource = duk_require_int(ctx, 0); + struct rlimit r; + r.rlim_cur = Duktape_GetIntPropertyValue(ctx, 1, "soft", -1); + r.rlim_max = Duktape_GetIntPropertyValue(ctx, 1, "hard", -1); + + if (setrlimit(resource, &r) == 0) + { + return(0); + } + return(ILibDuktape_Error(ctx, "Error Occured settings limits")); +} +duk_ret_t ILibDuktape_ScriptContainer_Process_rlimit_getter(duk_context *ctx) +{ + duk_push_object(ctx); + duk_push_c_function(ctx, ILibDuktape_ScriptContainer_Process_rlimit_getterFunc, 1); duk_put_prop_string(ctx, -2, "get"); + duk_push_c_function(ctx, ILibDuktape_ScriptContainer_Process_rlimit_setterFunc, 2); duk_put_prop_string(ctx, -2, "set"); + return(1); +} +#endif void ILibDuktape_ScriptContainer_Process_Init(duk_context *ctx, char **argList) { @@ -995,7 +1034,12 @@ void ILibDuktape_ScriptContainer_Process_Init(duk_context *ctx, char **argList) ILibDuktape_CreateInstanceMethod(ctx, "cwd", ILibDuktape_Process_cwd, 0); ILibDuktape_CreateInstanceMethod(ctx, "setenv", ILibDuktape_Process_setenv, 2); ILibDuktape_CreateEventWithGetterAndSetterEx(ctx, "coreDumpLocation", ILibDuktape_ScriptContainer_Process_coreDumpLocation_getter, ILibDuktape_ScriptContainer_Process_coreDumpLocation_setter); - +#ifndef WIN32 + ILibDuktape_CreateEventWithGetter(ctx, "rlimit", ILibDuktape_ScriptContainer_Process_rlimit_getter); + Duktape_CreateEnumEx(ctx, (char*[]) { "AS", "CORE", "CPU", "DATA", "FSIZE", "LOCKS", "MEMLOCK", "MGSQUEUE", "NICE", "NOFILE", "NPROC", "RSS", "RTPRIO", "SIGPENDING", "STACK" }, + (int[]) {9, 4, 0, 2, 1, 10, 8, 12, 13, 7, 6, 5, 14, 11, 3}, 15); + duk_put_prop_string(ctx, -2, "RLIMITS"); +#endif duk_push_object(ctx); if (sslvS != ((char*)NULL + 1)) {