X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?p=src%2Fapp-framework-binder.git;a=blobdiff_plain;f=src%2Fafb-autoset.c;h=f169bc1f7b319338733d4ace0e0027eb6f32f66a;hp=102830cb1ff2344921498e5eaf590885baec40ef;hb=65353dce81a629e042800bb7b86fcd869a76727e;hpb=4521c1e7ae5371ab9d639adc617d17fb4e8ded0c diff --git a/src/afb-autoset.c b/src/afb-autoset.c index 102830cb..f169bc1f 100644 --- a/src/afb-autoset.c +++ b/src/afb-autoset.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016, 2017, 2018 "IoT.bzh" + * Copyright (C) 2015-2020 "IoT.bzh" * Author José Bollo * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,6 +19,8 @@ #include #include +#include +#include #include #include #include @@ -73,6 +75,8 @@ static int add(const char *path, struct afb_apiset *declare_set, struct afb_apis return 0; } +/*******************************************************************/ + static int create_ws(const char *path, struct afb_apiset *declare_set, struct afb_apiset *call_set) { return afb_api_ws_add_client(path, declare_set, call_set, 0) >= 0; @@ -88,6 +92,9 @@ int afb_autoset_add_ws(const char *path, struct afb_apiset *declare_set, struct return add(path, declare_set, call_set, onlack_ws); } +/*******************************************************************/ + +#if WITH_DYNAMIC_BINDING static int create_so(const char *path, struct afb_apiset *declare_set, struct afb_apiset *call_set) { return afb_api_so_add_binding(path, declare_set, call_set) >= 0; @@ -102,3 +109,43 @@ int afb_autoset_add_so(const char *path, struct afb_apiset *declare_set, struct { return add(path, declare_set, call_set, onlack_so); } +#endif + +/*******************************************************************/ + +static int create_any(const char *path, struct afb_apiset *declare_set, struct afb_apiset *call_set) +{ + int rc; + struct stat st; + char sockname[PATH_MAX + 7]; + + rc = stat(path, &st); + if (!rc) { + switch(st.st_mode & S_IFMT) { +#if WITH_DYNAMIC_BINDING + case S_IFREG: + rc = afb_api_so_add_binding(path, declare_set, call_set); + break; +#endif + case S_IFSOCK: + snprintf(sockname, sizeof sockname, "unix:%s", path); + rc = afb_api_ws_add_client(sockname, declare_set, call_set, 0); + break; + default: + NOTICE("Unexpected autoset entry: %s", path); + rc = -1; + break; + } + } + return rc >= 0; +} + +static int onlack_any(void *closure, struct afb_apiset *set, const char *name) +{ + return onlack(closure, set, name, create_any); +} + +int afb_autoset_add_any(const char *path, struct afb_apiset *declare_set, struct afb_apiset *call_set) +{ + return add(path, declare_set, call_set, onlack_any); +}