289 lua_pushboolean(L, 0); |
290 lua_pushboolean(L, 0); |
290 lua_pushstring(L, "invalid-uid"); |
291 lua_pushstring(L, "invalid-uid"); |
291 return 2; |
292 return 2; |
292 } |
293 } |
293 |
294 |
|
295 int lc_setgid(lua_State* L) |
|
296 { |
|
297 int gid = -1; |
|
298 if(lua_gettop(L) < 1) |
|
299 return 0; |
|
300 if(!lua_isnumber(L, 1) && lua_tostring(L, 1)) |
|
301 { |
|
302 /* Passed GID is actually a string, so look up the GID */ |
|
303 struct group *g; |
|
304 g = getgrnam(lua_tostring(L, 1)); |
|
305 if(!g) |
|
306 { |
|
307 lua_pushboolean(L, 0); |
|
308 lua_pushstring(L, "no-such-group"); |
|
309 return 2; |
|
310 } |
|
311 gid = g->gr_gid; |
|
312 } |
|
313 else |
|
314 { |
|
315 gid = lua_tonumber(L, 1); |
|
316 } |
|
317 |
|
318 if(gid>-1) |
|
319 { |
|
320 /* Ok, attempt setgid */ |
|
321 errno = 0; |
|
322 if(setgid(gid)) |
|
323 { |
|
324 /* Fail */ |
|
325 lua_pushboolean(L, 0); |
|
326 switch(errno) |
|
327 { |
|
328 case EINVAL: |
|
329 lua_pushstring(L, "invalid-gid"); |
|
330 break; |
|
331 case EPERM: |
|
332 lua_pushstring(L, "permission-denied"); |
|
333 break; |
|
334 default: |
|
335 lua_pushstring(L, "unknown-error"); |
|
336 } |
|
337 return 2; |
|
338 } |
|
339 else |
|
340 { |
|
341 /* Success! */ |
|
342 lua_pushboolean(L, 1); |
|
343 return 1; |
|
344 } |
|
345 } |
|
346 |
|
347 /* Seems we couldn't find a valid GID to switch to */ |
|
348 lua_pushboolean(L, 0); |
|
349 lua_pushstring(L, "invalid-gid"); |
|
350 return 2; |
|
351 } |
|
352 |
294 /* Like POSIX's setrlimit()/getrlimit() API functions. |
353 /* Like POSIX's setrlimit()/getrlimit() API functions. |
295 * |
354 * |
296 * Syntax: |
355 * Syntax: |
297 * pposix.setrlimit( resource, soft limit, hard limit) |
356 * pposix.setrlimit( resource, soft limit, hard limit) |
298 * |
357 * |
418 lua_pushcfunction(L, lc_getpid); |
477 lua_pushcfunction(L, lc_getpid); |
419 lua_setfield(L, -2, "getpid"); |
478 lua_setfield(L, -2, "getpid"); |
420 |
479 |
421 lua_pushcfunction(L, lc_getuid); |
480 lua_pushcfunction(L, lc_getuid); |
422 lua_setfield(L, -2, "getuid"); |
481 lua_setfield(L, -2, "getuid"); |
|
482 lua_pushcfunction(L, lc_getgid); |
|
483 lua_setfield(L, -2, "getgid"); |
423 |
484 |
424 lua_pushcfunction(L, lc_setuid); |
485 lua_pushcfunction(L, lc_setuid); |
425 lua_setfield(L, -2, "setuid"); |
486 lua_setfield(L, -2, "setuid"); |
|
487 lua_pushcfunction(L, lc_setgid); |
|
488 lua_setfield(L, -2, "setgid"); |
426 |
489 |
427 lua_pushcfunction(L, lc_setrlimit); |
490 lua_pushcfunction(L, lc_setrlimit); |
428 lua_setfield(L, -2, "setrlimit"); |
491 lua_setfield(L, -2, "setrlimit"); |
429 |
492 |
430 lua_pushcfunction(L, lc_getrlimit); |
493 lua_pushcfunction(L, lc_getrlimit); |