summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriele Santomaggio <G.santomaggio@gmail.com>2016-09-23 22:22:58 +0200
committerGitHub <noreply@github.com>2016-09-23 22:22:58 +0200
commitce55edd94ac6c280d4afe6ded011f71aca5f11a8 (patch)
treea0da35ee994f2959a0927c1cea303c388c00a0e7
parenta1b6e244a122c4ccfa8d8e16ccd24ce1fd3109a2 (diff)
parent39416b80460204e9df8bd403442d17a62bd07614 (diff)
downloaderlang-sd_notify-ce55edd94ac6c280d4afe6ded011f71aca5f11a8.tar.gz
Merge pull request #14 from lemenkov/sd_pid_notify_with_fds
sd_pid_notify_with_fds
-rw-r--r--c_src/sd_notify.c44
-rw-r--r--src/sd_notify.erl18
2 files changed, 29 insertions, 33 deletions
diff --git a/c_src/sd_notify.c b/c_src/sd_notify.c
index d667fb2..7387963 100644
--- a/c_src/sd_notify.c
+++ b/c_src/sd_notify.c
@@ -24,38 +24,33 @@ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "erl_nif.h"
#include <systemd/sd-daemon.h>
-static ERL_NIF_TERM sd_notify_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+static ERL_NIF_TERM sd_pid_notify_with_fds_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
- int unset_environment = 0;
- enif_get_int(env, argv[0], &unset_environment);
-
+ ERL_NIF_TERM head, tail;
unsigned int length = 0;
- enif_get_list_length(env, argv[1], &length);
- char* state = (char*)enif_alloc(++length);
- enif_get_string(env, argv[1], state, length, ERL_NIF_LATIN1);
- int result = sd_notify(unset_environment, state);
- enif_free(state);
-
- return enif_make_int(env, result);
-}
-
-
-static ERL_NIF_TERM sd_pid_notify_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{
- int pid = 0;
+ pid_t pid = 0;
enif_get_int(env, argv[0], &pid);
int unset_environment = 0;
enif_get_int(env, argv[1], &unset_environment);
- unsigned int length = 0;
enif_get_list_length(env, argv[2], &length);
-
-
char* state = (char*)enif_alloc(++length);
- enif_get_string(env, argv[1], state, length, ERL_NIF_LATIN1);
- int result = sd_pid_notify(pid, unset_environment, state);
+ enif_get_string(env, argv[2], state, length, ERL_NIF_LATIN1);
+
+ enif_get_list_length(env, argv[3], &length);
+ int* fds = (int*)enif_alloc(++length * sizeof(int));
+ ERL_NIF_TERM list = argv[3];
+ int i = 0;
+ while(enif_get_list_cell(env, list, &head, &tail)) {
+ enif_get_int(env, head, &fds[i]);
+ i++;
+ list = tail;
+ }
+ int result = sd_pid_notify_with_fds(pid, unset_environment, state, fds, length);
+
+ enif_free(fds);
enif_free(state);
return enif_make_int(env, result);
@@ -64,9 +59,8 @@ static ERL_NIF_TERM sd_pid_notify_nif(ErlNifEnv* env, int argc, const ERL_NIF_TE
static ErlNifFunc nif_funcs[] =
{
- {"sd_notify", 2, sd_notify_nif},
- {"sd_pid_notify", 3, sd_pid_notify_nif},
+ {"sd_pid_notify_with_fds", 4, sd_pid_notify_with_fds_nif},
};
-ERL_NIF_INIT(sd_notify, nif_funcs, NULL, NULL, NULL, NULL); \ No newline at end of file
+ERL_NIF_INIT(sd_notify, nif_funcs, NULL, NULL, NULL, NULL);
diff --git a/src/sd_notify.erl b/src/sd_notify.erl
index 5162340..504c25f 100644
--- a/src/sd_notify.erl
+++ b/src/sd_notify.erl
@@ -27,7 +27,7 @@
-module(sd_notify).
--export([sd_notify/2, sd_notifyf/3, sd_pid_notify/3, sd_pid_notifyf/4]).
+-export([sd_notify/2, sd_notifyf/3, sd_pid_notify/3, sd_pid_notifyf/4, sd_pid_notify_with_fds/4]).
-on_load(init/0).
@@ -51,18 +51,20 @@ init() ->
end,
erlang:load_nif(filename:join(PrivDir, ?MODULE) ++ "_drv", 0).
-sd_notify(_, _) ->
- ?nif_stub.
+sd_notify(UnsetEnv, Data) ->
+ sd_pid_notify_with_fds(0, UnsetEnv, Data, []).
-sd_pid_notify(_, _, _) ->
- ?nif_stub.
+sd_pid_notify(Pid, UnsetEnv, Data) ->
+ sd_pid_notify_with_fds(Pid, UnsetEnv, Data, []).
sd_notifyf(UnsetEnv, Format, Data) ->
- sd_notify(UnsetEnv, lists:flatten(io_lib:format(Format, Data))).
-
+ sd_pid_notify_with_fds(0, UnsetEnv, lists:flatten(io_lib:format(Format, Data)), []).
sd_pid_notifyf(Pid, UnsetEnv, Format, Data) ->
- sd_pid_notify(Pid, UnsetEnv, lists:flatten(io_lib:format(Format, Data))).
+ sd_pid_notify_with_fds(Pid, UnsetEnv, lists:flatten(io_lib:format(Format, Data)), []).
+
+sd_pid_notify_with_fds(_, _, _, _) ->
+ ?nif_stub.
%% ===================================================================
%% EUnit tests