mirror of
https://github.com/octoleo/lsyncd.git
synced 2024-12-12 14:17:47 +00:00
Add function to return a free port
This commit is contained in:
parent
f722ec14f8
commit
cf7cfe1bda
57
lsyncd.c
57
lsyncd.c
@ -19,6 +19,8 @@
|
|||||||
|
|
||||||
#define SYSLOG_NAMES 1
|
#define SYSLOG_NAMES 1
|
||||||
|
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
#include <sys/select.h>
|
#include <sys/select.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/times.h>
|
#include <sys/times.h>
|
||||||
@ -1120,6 +1122,60 @@ l_kill( lua_State *L )
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
| Returns a free port of host
|
||||||
|
|
|
||||||
|
| Params on Lua stack:
|
||||||
|
| (not yet) 1: hostname or ip for bind
|
||||||
|
|
|
||||||
|
| Returns on Lua stack:
|
||||||
|
| return integer of free port
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
l_free_port(lua_State *L) {
|
||||||
|
int sock = socket(AF_INET, SOCK_STREAM, 0);
|
||||||
|
if(sock < 0) {
|
||||||
|
printf("error opening socket\n");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct sockaddr_in serv_addr;
|
||||||
|
memset((char *) &serv_addr, 0, sizeof(serv_addr));
|
||||||
|
serv_addr.sin_family = AF_INET;
|
||||||
|
serv_addr.sin_addr.s_addr = INADDR_ANY;
|
||||||
|
serv_addr.sin_port = 0;
|
||||||
|
if (bind(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
|
||||||
|
if(errno == EADDRINUSE) {
|
||||||
|
printf("the port is not available. already to other process\n");
|
||||||
|
goto error;
|
||||||
|
} else {
|
||||||
|
printf("could not bind to process (%d) %s\n", errno, strerror(errno));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
socklen_t len = sizeof(serv_addr);
|
||||||
|
if (getsockname(sock, (struct sockaddr *)&serv_addr, &len) == -1) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
lua_pushinteger(L, ntohs(serv_addr.sin_port));
|
||||||
|
|
||||||
|
if (close (sock) < 0 ) {
|
||||||
|
printf("did not close: %s\n", strerror(errno));
|
||||||
|
lua_pop ( L, 1 );
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
error:
|
||||||
|
lua_pushnil(L);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
| Executes a subprocess. Does not wait for it to return.
|
| Executes a subprocess. Does not wait for it to return.
|
||||||
|
|
|
|
||||||
@ -1881,6 +1937,7 @@ static const luaL_Reg lsyncdlib[] =
|
|||||||
{ "log", l_log },
|
{ "log", l_log },
|
||||||
{ "now", l_now },
|
{ "now", l_now },
|
||||||
{ "kill", l_kill },
|
{ "kill", l_kill },
|
||||||
|
{ "get_free_port", l_free_port },
|
||||||
{ "nonobserve_fd", l_nonobserve_fd },
|
{ "nonobserve_fd", l_nonobserve_fd },
|
||||||
{ "observe_fd", l_observe_fd },
|
{ "observe_fd", l_observe_fd },
|
||||||
{ "readdir", l_readdir },
|
{ "readdir", l_readdir },
|
||||||
|
@ -22,4 +22,6 @@ assert(isTableEqual(
|
|||||||
{"-p", "2localhorst2", "-i '1234'"}
|
{"-p", "2localhorst2", "-i '1234'"}
|
||||||
))
|
))
|
||||||
|
|
||||||
|
assert(type(lsyncd.get_free_port()) == "number")
|
||||||
|
|
||||||
os.exit(0)
|
os.exit(0)
|
Loading…
Reference in New Issue
Block a user