Comparison

util-src/pposix.c @ 10799:763bb2ce3f60

util.pposix,signal: Pass around various OS numbers as integers [Lua 5.3] Passing around PIDs, UIDs etc as integers makes it more sane in Lua 5.3. Getting 1234.0 as PID is silly. Shouldn't change any behavior as these are all integers on the C side and the integral floats are accepted as integers when passed back from Lua into C.
author Kim Alvefur <zash@zash.se>
date Mon, 04 May 2020 21:51:30 +0200
parent 10480:94cacf9fd0ae
child 10921:6eb5d2bb11af
comparison
equal deleted inserted replaced
10798:b81f4fd7f21a 10799:763bb2ce3f60
58 #include "lualib.h" 58 #include "lualib.h"
59 #include "lauxlib.h" 59 #include "lauxlib.h"
60 60
61 #if (LUA_VERSION_NUM == 501) 61 #if (LUA_VERSION_NUM == 501)
62 #define luaL_setfuncs(L, R, N) luaL_register(L, NULL, R) 62 #define luaL_setfuncs(L, R, N) luaL_register(L, NULL, R)
63 #endif
64 #if (LUA_VERSION_NUM < 503)
65 #define lua_isinteger(L, n) lua_isnumber(L, n)
63 #endif 66 #endif
64 67
65 #include <fcntl.h> 68 #include <fcntl.h>
66 #if defined(__linux__) 69 #if defined(__linux__)
67 #include <linux/falloc.h> 70 #include <linux/falloc.h>
104 lua_pushstring(L, "fork-failed"); 107 lua_pushstring(L, "fork-failed");
105 return 2; 108 return 2;
106 } else if(pid != 0) { 109 } else if(pid != 0) {
107 /* We are the parent process */ 110 /* We are the parent process */
108 lua_pushboolean(L, 1); 111 lua_pushboolean(L, 1);
109 lua_pushnumber(L, pid); 112 lua_pushinteger(L, pid);
110 return 2; 113 return 2;
111 } 114 }
112 115
113 /* and we are the child process */ 116 /* and we are the child process */
114 if(setsid() == -1) { 117 if(setsid() == -1) {
293 296
294 if(lua_gettop(L) < 1) { 297 if(lua_gettop(L) < 1) {
295 return 0; 298 return 0;
296 } 299 }
297 300
298 if(!lua_isnumber(L, 1) && lua_tostring(L, 1)) { 301 if(!lua_isinteger(L, 1) && lua_tostring(L, 1)) {
299 /* Passed UID is actually a string, so look up the UID */ 302 /* Passed UID is actually a string, so look up the UID */
300 struct passwd *p; 303 struct passwd *p;
301 p = getpwnam(lua_tostring(L, 1)); 304 p = getpwnam(lua_tostring(L, 1));
302 305
303 if(!p) { 306 if(!p) {
306 return 2; 309 return 2;
307 } 310 }
308 311
309 uid = p->pw_uid; 312 uid = p->pw_uid;
310 } else { 313 } else {
311 uid = lua_tonumber(L, 1); 314 uid = lua_tointeger(L, 1);
312 } 315 }
313 316
314 if(uid > -1) { 317 if(uid > -1) {
315 /* Ok, attempt setuid */ 318 /* Ok, attempt setuid */
316 errno = 0; 319 errno = 0;
351 354
352 if(lua_gettop(L) < 1) { 355 if(lua_gettop(L) < 1) {
353 return 0; 356 return 0;
354 } 357 }
355 358
356 if(!lua_isnumber(L, 1) && lua_tostring(L, 1)) { 359 if(!lua_isinteger(L, 1) && lua_tostring(L, 1)) {
357 /* Passed GID is actually a string, so look up the GID */ 360 /* Passed GID is actually a string, so look up the GID */
358 struct group *g; 361 struct group *g;
359 g = getgrnam(lua_tostring(L, 1)); 362 g = getgrnam(lua_tostring(L, 1));
360 363
361 if(!g) { 364 if(!g) {
364 return 2; 367 return 2;
365 } 368 }
366 369
367 gid = g->gr_gid; 370 gid = g->gr_gid;
368 } else { 371 } else {
369 gid = lua_tonumber(L, 1); 372 gid = lua_tointeger(L, 1);
370 } 373 }
371 374
372 if(gid > -1) { 375 if(gid > -1) {
373 /* Ok, attempt setgid */ 376 /* Ok, attempt setgid */
374 errno = 0; 377 errno = 0;
645 lua_pushboolean(L, 1); 648 lua_pushboolean(L, 1);
646 649
647 if(lim.rlim_cur == RLIM_INFINITY) { 650 if(lim.rlim_cur == RLIM_INFINITY) {
648 lua_pushstring(L, "unlimited"); 651 lua_pushstring(L, "unlimited");
649 } else { 652 } else {
650 lua_pushnumber(L, lim.rlim_cur); 653 lua_pushinteger(L, lim.rlim_cur);
651 } 654 }
652 655
653 if(lim.rlim_max == RLIM_INFINITY) { 656 if(lim.rlim_max == RLIM_INFINITY) {
654 lua_pushstring(L, "unlimited"); 657 lua_pushstring(L, "unlimited");
655 } else { 658 } else {
656 lua_pushnumber(L, lim.rlim_max); 659 lua_pushinteger(L, lim.rlim_max);
657 } 660 }
658 661
659 return 3; 662 return 3;
660 } 663 }
661 664