From acf5d2718f9056b6698bcf8e81b998c5d0733363 Mon Sep 17 00:00:00 2001 From: Arjan van der Velde Date: Tue, 7 Jul 2015 20:35:31 -0400 Subject: [PATCH 01/13] absolute path to docker --- nss.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nss.c b/nss.c index b96a267..94a867f 100644 --- a/nss.c +++ b/nss.c @@ -88,7 +88,7 @@ lookup_container_ip (const char *name, *strrchr(name_s, '.') = '\0'; char *argv[] = { - "docker", + "/usr/bin/docker", "inspect", "-format={{.NetworkSettings.IPAddress}}", name_s, From c971c168ee8d95fab8062914ae3c1a2defbff0c4 Mon Sep 17 00:00:00 2001 From: Arjan van der Velde Date: Wed, 8 Jul 2015 00:35:13 -0400 Subject: [PATCH 02/13] reformat --- nss.c | 286 ++++++++++++++++++++++++--------------------------------- test.c | 145 +++++++++++++---------------- 2 files changed, 186 insertions(+), 245 deletions(-) diff --git a/nss.c b/nss.c index 94a867f..7f03851 100644 --- a/nss.c +++ b/nss.c @@ -29,185 +29,141 @@ /* define a suffix that containers have */ #define SUFFIX ".docker" -#define ALIGN(a) (((a+sizeof(void*)-1)/sizeof(void*))*sizeof(void*)) - -static void -pack_hostent(struct hostent *result, - char *buffer, - size_t buflen, - const char *name, - const void *addr) -{ - char *aliases, *r_addr, *addrlist; - size_t l, idx; - - /* we can't allocate any memory, the buffer is where we need to - * return things we want to use - * - * 1st, the hostname */ - l = strlen(name); - result->h_name = buffer; - memcpy (result->h_name, name, l); - buffer[l] = '\0'; - - idx = ALIGN (l+1); - - /* 2nd, the empty aliases array */ - aliases = buffer + idx; - *(char **) aliases = NULL; - idx += sizeof (char*); - - result->h_aliases = (char **) aliases; - - result->h_addrtype = AF_INET; - result->h_length = sizeof (struct in_addr); - - /* 3rd, address */ - r_addr = buffer + idx; - memcpy(r_addr, addr, result->h_length); - idx += ALIGN (result->h_length); - - /* 4th, the addresses ptr array */ - addrlist = buffer + idx; - ((char **) addrlist)[0] = r_addr; - ((char **) addrlist)[1] = NULL; - - result->h_addr_list = (char **) addrlist; +#define ALIGN(a) (((a + sizeof(void *) - 1) / sizeof(void *)) * sizeof(void *)) + +static void pack_hostent(struct hostent *result, char *buffer, size_t buflen, + const char *name, const void *addr) { + char *aliases, *r_addr, *addrlist; + size_t l, idx; + + /* we can't allocate any memory, the buffer is where we need to + * return things we want to use + * + * 1st, the hostname */ + l = strlen(name); + result->h_name = buffer; + memcpy(result->h_name, name, l); + buffer[l] = '\0'; + + idx = ALIGN(l + 1); + + /* 2nd, the empty aliases array */ + aliases = buffer + idx; + *(char **)aliases = NULL; + idx += sizeof(char *); + + result->h_aliases = (char **)aliases; + + result->h_addrtype = AF_INET; + result->h_length = sizeof(struct in_addr); + + /* 3rd, address */ + r_addr = buffer + idx; + memcpy(r_addr, addr, result->h_length); + idx += ALIGN(result->h_length); + + /* 4th, the addresses ptr array */ + addrlist = buffer + idx; + ((char **)addrlist)[0] = r_addr; + ((char **)addrlist)[1] = NULL; + + result->h_addr_list = (char **)addrlist; } -static gboolean -lookup_container_ip (const char *name, - struct in_addr *addr) -{ - char *stdout_s, *name_s; - int exit_status; - gboolean success = FALSE; - - /* remove the suffix */ - name_s = g_strdup (name); - *strrchr(name_s, '.') = '\0'; - - char *argv[] = { - "/usr/bin/docker", - "inspect", - "-format={{.NetworkSettings.IPAddress}}", - name_s, - NULL, - }; - - if (!g_spawn_sync(NULL, - argv, - NULL, - G_SPAWN_STDERR_TO_DEV_NULL | G_SPAWN_SEARCH_PATH, - NULL, NULL, - &stdout_s, NULL, - &exit_status, - NULL)) - { - goto finally; - } - - if (exit_status != 0) - { - goto finally; - } - - stdout_s = g_strstrip (stdout_s); - success = inet_aton (stdout_s, addr); +static gboolean lookup_container_ip(const char *name, struct in_addr *addr) { + char *stdout_s, *name_s; + int exit_status; + gboolean success = FALSE; + + /* remove the suffix */ + name_s = g_strdup(name); + *strrchr(name_s, '.') = '\0'; + + char *argv[] = {"/usr/bin/docker", "inspect", + "-format={{.NetworkSettings.IPAddress}}", name_s, + NULL, }; + + if (!g_spawn_sync(NULL, argv, NULL, + G_SPAWN_STDERR_TO_DEV_NULL | G_SPAWN_SEARCH_PATH, NULL, + NULL, &stdout_s, NULL, &exit_status, NULL)) { + goto finally; + } + + if (exit_status != 0) { + goto finally; + } + + stdout_s = g_strstrip(stdout_s); + success = inet_aton(stdout_s, addr); finally: - g_free (name_s); - g_free (stdout_s); + g_free(name_s); + g_free(stdout_s); - return success; + return success; } -enum nss_status -_nss_docker_gethostbyname2_r (const char *name, - int af, - struct hostent *result, - char *buffer, - size_t buflen, - int *errnop, - int *h_errnop) -{ - struct in_addr addr; - - if (af != AF_INET) - { - *errnop = EAFNOSUPPORT; - *h_errnop = NO_DATA; - return NSS_STATUS_UNAVAIL; - } - - if (!g_str_has_suffix(name, SUFFIX)) - { - *errnop = ENOENT; - *h_errnop = HOST_NOT_FOUND; - return NSS_STATUS_NOTFOUND; - } - - if (!lookup_container_ip (name, &addr)) - { - *errnop = ENOENT; - *h_errnop = HOST_NOT_FOUND; - return NSS_STATUS_NOTFOUND; - } - - pack_hostent(result, buffer, buflen, name, &addr); - - return NSS_STATUS_SUCCESS; +enum nss_status _nss_docker_gethostbyname2_r(const char *name, int af, + struct hostent *result, + char *buffer, size_t buflen, + int *errnop, int *h_errnop) { + struct in_addr addr; + + if (af != AF_INET) { + *errnop = EAFNOSUPPORT; + *h_errnop = NO_DATA; + return NSS_STATUS_UNAVAIL; + } + + if (!g_str_has_suffix(name, SUFFIX)) { + *errnop = ENOENT; + *h_errnop = HOST_NOT_FOUND; + return NSS_STATUS_NOTFOUND; + } + + if (!lookup_container_ip(name, &addr)) { + *errnop = ENOENT; + *h_errnop = HOST_NOT_FOUND; + return NSS_STATUS_NOTFOUND; + } + + pack_hostent(result, buffer, buflen, name, &addr); + + return NSS_STATUS_SUCCESS; } -enum nss_status -_nss_docker_gethostbyname_r (const char *name, - struct hostent *result, - char *buffer, - size_t buflen, - int *errnop, - int *h_errnop) -{ - return _nss_docker_gethostbyname2_r(name, - AF_INET, - result, - buffer, - buflen, - errnop, - h_errnop); +enum nss_status _nss_docker_gethostbyname_r(const char *name, + struct hostent *result, + char *buffer, size_t buflen, + int *errnop, int *h_errnop) { + return _nss_docker_gethostbyname2_r(name, AF_INET, result, buffer, buflen, + errnop, h_errnop); } -enum nss_status -_nss_docker_gethostbyaddr_r (const void *addr, - socklen_t len, - int af, - struct hostent *result, - char *buffer, - size_t buflen, - int *errnop, - int *h_errnop) -{ - if (af != AF_INET) - { - *errnop = EAFNOSUPPORT; - *h_errnop = NO_DATA; - return NSS_STATUS_UNAVAIL; - } - - if (len != sizeof (struct in_addr)) - { - *errnop = EINVAL; - *h_errnop = NO_RECOVERY; - return NSS_STATUS_UNAVAIL; - } - - /* FIXME: need to implement reverse lookups */ +enum nss_status _nss_docker_gethostbyaddr_r(const void *addr, socklen_t len, + int af, struct hostent *result, + char *buffer, size_t buflen, + int *errnop, int *h_errnop) { + if (af != AF_INET) { *errnop = EAFNOSUPPORT; *h_errnop = NO_DATA; return NSS_STATUS_UNAVAIL; - /* - pack_hostent(result, buffer, buflen, "container.docker", addr); + } + + if (len != sizeof(struct in_addr)) { + *errnop = EINVAL; + *h_errnop = NO_RECOVERY; + return NSS_STATUS_UNAVAIL; + } + + /* FIXME: need to implement reverse lookups */ + *errnop = EAFNOSUPPORT; + *h_errnop = NO_DATA; + return NSS_STATUS_UNAVAIL; + /* + pack_hostent(result, buffer, buflen, "container.docker", addr); - return NSS_STATUS_SUCCESS; - */ + return NSS_STATUS_SUCCESS; + */ } diff --git a/test.c b/test.c index 1a62e30..9c88db2 100644 --- a/test.c +++ b/test.c @@ -25,94 +25,82 @@ #define BADGER_DOCKER_IP "172.11.22.33" -static void -test_gethostbyname (void) -{ - struct hostent *results; - char buffer[INET_ADDRSTRLEN]; +static void test_gethostbyname(void) { + struct hostent *results; + char buffer[INET_ADDRSTRLEN]; - results = gethostbyname("badger.docker"); + results = gethostbyname("badger.docker"); - g_assert(results != NULL); + g_assert(results != NULL); - g_assert_cmpstr(results->h_name, ==, "badger.docker"); - g_assert(results->h_aliases[0] == NULL); - g_assert_cmpint(results->h_addrtype, ==, AF_INET); - g_assert_cmpint(results->h_length, ==, 4); - g_assert(results->h_addr_list[0] != NULL); - g_assert(results->h_addr_list[1] == NULL); + g_assert_cmpstr(results->h_name, ==, "badger.docker"); + g_assert(results->h_aliases[0] == NULL); + g_assert_cmpint(results->h_addrtype, ==, AF_INET); + g_assert_cmpint(results->h_length, ==, 4); + g_assert(results->h_addr_list[0] != NULL); + g_assert(results->h_addr_list[1] == NULL); - inet_ntop(AF_INET, results->h_addr_list[0], buffer, INET_ADDRSTRLEN); - g_assert_cmpstr(buffer, ==, BADGER_DOCKER_IP); + inet_ntop(AF_INET, results->h_addr_list[0], buffer, INET_ADDRSTRLEN); + g_assert_cmpstr(buffer, ==, BADGER_DOCKER_IP); } -static void -test_gethostbyname_not_docker (void) -{ - struct hostent *results; +static void test_gethostbyname_not_docker(void) { + struct hostent *results; - results = gethostbyname("badger"); + results = gethostbyname("badger"); - g_assert(results == NULL); - g_assert_cmpint(h_errno, ==, HOST_NOT_FOUND); + g_assert(results == NULL); + g_assert_cmpint(h_errno, ==, HOST_NOT_FOUND); } -static void -test_gethostbyname_by_image_name (void) -{ - struct hostent *results; +static void test_gethostbyname_by_image_name(void) { + struct hostent *results; - results = gethostbyname("stoat.docker"); + results = gethostbyname("stoat.docker"); - g_assert(results == NULL); - g_assert_cmpint(h_errno, ==, HOST_NOT_FOUND); + g_assert(results == NULL); + g_assert_cmpint(h_errno, ==, HOST_NOT_FOUND); } -static void -test_gethostbyname_unknown_name (void) -{ - struct hostent *results; +static void test_gethostbyname_unknown_name(void) { + struct hostent *results; - results = gethostbyname("mushroom.docker"); + results = gethostbyname("mushroom.docker"); - g_assert(results == NULL); - g_assert_cmpint(h_errno, ==, HOST_NOT_FOUND); + g_assert(results == NULL); + g_assert_cmpint(h_errno, ==, HOST_NOT_FOUND); } -static void -test_gethostbyname2 (void) -{ - struct hostent *results; - char buffer[INET_ADDRSTRLEN]; +static void test_gethostbyname2(void) { + struct hostent *results; + char buffer[INET_ADDRSTRLEN]; - results = gethostbyname2("badger.docker", AF_INET); + results = gethostbyname2("badger.docker", AF_INET); - g_assert(results != NULL); + g_assert(results != NULL); - g_assert_cmpstr(results->h_name, ==, "badger.docker"); - g_assert(results->h_aliases[0] == NULL); - g_assert_cmpint(results->h_addrtype, ==, AF_INET); - g_assert_cmpint(results->h_length, ==, 4); - g_assert(results->h_addr_list[0] != NULL); - g_assert(results->h_addr_list[1] == NULL); + g_assert_cmpstr(results->h_name, ==, "badger.docker"); + g_assert(results->h_aliases[0] == NULL); + g_assert_cmpint(results->h_addrtype, ==, AF_INET); + g_assert_cmpint(results->h_length, ==, 4); + g_assert(results->h_addr_list[0] != NULL); + g_assert(results->h_addr_list[1] == NULL); - inet_ntop(AF_INET, results->h_addr_list[0], buffer, INET_ADDRSTRLEN); - g_assert_cmpstr(buffer, ==, BADGER_DOCKER_IP); + inet_ntop(AF_INET, results->h_addr_list[0], buffer, INET_ADDRSTRLEN); + g_assert_cmpstr(buffer, ==, BADGER_DOCKER_IP); } -static void -test_gethostbyname2_inet6 (void) -{ - struct hostent *results; +static void test_gethostbyname2_inet6(void) { + struct hostent *results; - results = gethostbyname2("badger.docker", AF_INET6); + results = gethostbyname2("badger.docker", AF_INET6); - g_assert(results == NULL); - g_assert_cmpint(errno, ==, EAFNOSUPPORT); - g_assert_cmpint(h_errno, ==, NO_DATA); + g_assert(results == NULL); + g_assert_cmpint(errno, ==, EAFNOSUPPORT); + g_assert_cmpint(h_errno, ==, NO_DATA); } -# if 0 +#if 0 static void test_gethostbyaddr (void) { @@ -136,24 +124,21 @@ test_gethostbyaddr (void) inet_ntop(AF_INET, results->h_addr_list[0], buffer, INET_ADDRSTRLEN); g_assert_cmpstr(buffer, ==, "10.0.0.0"); } -# endif - -int -main (int argc, - char **argv) -{ - g_test_init (&argc, &argv, NULL); - - g_test_add_func("/test/gethostbyname", test_gethostbyname); - g_test_add_func("/test/gethostbyname_not_docker", - test_gethostbyname_not_docker); - g_test_add_func("/test/gethostbyname_by_image_name", - test_gethostbyname_by_image_name); - g_test_add_func("/test/gethostbyname_unknown_name", - test_gethostbyname_unknown_name); - g_test_add_func("/test/gethostbyname2", test_gethostbyname2); - g_test_add_func("/test/gethostbyname2_inet6", test_gethostbyname2_inet6); - // g_test_add_func("/test/gethostbyaddr", test_gethostbyaddr); - - return g_test_run (); +#endif + +int main(int argc, char **argv) { + g_test_init(&argc, &argv, NULL); + + g_test_add_func("/test/gethostbyname", test_gethostbyname); + g_test_add_func("/test/gethostbyname_not_docker", + test_gethostbyname_not_docker); + g_test_add_func("/test/gethostbyname_by_image_name", + test_gethostbyname_by_image_name); + g_test_add_func("/test/gethostbyname_unknown_name", + test_gethostbyname_unknown_name); + g_test_add_func("/test/gethostbyname2", test_gethostbyname2); + g_test_add_func("/test/gethostbyname2_inet6", test_gethostbyname2_inet6); + // g_test_add_func("/test/gethostbyaddr", test_gethostbyaddr); + + return g_test_run(); } From 8ef627cfe48f70bb471a0496859b68497c65976b Mon Sep 17 00:00:00 2001 From: Arjan van der Velde Date: Wed, 8 Jul 2015 10:04:32 -0400 Subject: [PATCH 03/13] format --- nss.c | 219 +++++++++++++++++++++++++++++---------------------------- test.c | 131 ++++++++++++++++++---------------- 2 files changed, 181 insertions(+), 169 deletions(-) diff --git a/nss.c b/nss.c index 7f03851..5725ef7 100644 --- a/nss.c +++ b/nss.c @@ -29,141 +29,146 @@ /* define a suffix that containers have */ #define SUFFIX ".docker" -#define ALIGN(a) (((a + sizeof(void *) - 1) / sizeof(void *)) * sizeof(void *)) +#define ALIGN(a) (((a + sizeof(void*) - 1) / sizeof(void*)) * sizeof(void*)) -static void pack_hostent(struct hostent *result, char *buffer, size_t buflen, - const char *name, const void *addr) { - char *aliases, *r_addr, *addrlist; - size_t l, idx; +static void pack_hostent(struct hostent* result, char* buffer, size_t buflen, + const char* name, const void* addr) +{ + char* aliases, *r_addr, *addrlist; + size_t l, idx; - /* we can't allocate any memory, the buffer is where we need to - * return things we want to use - * - * 1st, the hostname */ - l = strlen(name); - result->h_name = buffer; - memcpy(result->h_name, name, l); - buffer[l] = '\0'; + /* we can't allocate any memory, the buffer is where we need to + * return things we want to use + * + * 1st, the hostname */ + l = strlen(name); + result->h_name = buffer; + memcpy(result->h_name, name, l); + buffer[l] = '\0'; - idx = ALIGN(l + 1); + idx = ALIGN(l + 1); - /* 2nd, the empty aliases array */ - aliases = buffer + idx; - *(char **)aliases = NULL; - idx += sizeof(char *); + /* 2nd, the empty aliases array */ + aliases = buffer + idx; + *(char**)aliases = NULL; + idx += sizeof(char*); - result->h_aliases = (char **)aliases; + result->h_aliases = (char**)aliases; - result->h_addrtype = AF_INET; - result->h_length = sizeof(struct in_addr); + result->h_addrtype = AF_INET; + result->h_length = sizeof(struct in_addr); - /* 3rd, address */ - r_addr = buffer + idx; - memcpy(r_addr, addr, result->h_length); - idx += ALIGN(result->h_length); + /* 3rd, address */ + r_addr = buffer + idx; + memcpy(r_addr, addr, result->h_length); + idx += ALIGN(result->h_length); - /* 4th, the addresses ptr array */ - addrlist = buffer + idx; - ((char **)addrlist)[0] = r_addr; - ((char **)addrlist)[1] = NULL; + /* 4th, the addresses ptr array */ + addrlist = buffer + idx; + ((char**)addrlist)[0] = r_addr; + ((char**)addrlist)[1] = NULL; - result->h_addr_list = (char **)addrlist; + result->h_addr_list = (char**)addrlist; } -static gboolean lookup_container_ip(const char *name, struct in_addr *addr) { - char *stdout_s, *name_s; - int exit_status; - gboolean success = FALSE; +static gboolean lookup_container_ip(const char* name, struct in_addr* addr) +{ + char* stdout_s, *name_s; + int exit_status; + gboolean success = FALSE; - /* remove the suffix */ - name_s = g_strdup(name); - *strrchr(name_s, '.') = '\0'; + /* remove the suffix */ + name_s = g_strdup(name); + *strrchr(name_s, '.') = '\0'; - char *argv[] = {"/usr/bin/docker", "inspect", - "-format={{.NetworkSettings.IPAddress}}", name_s, - NULL, }; + char* argv[] = { "/usr/bin/docker", "inspect", + "-format={{.NetworkSettings.IPAddress}}", name_s, + NULL, }; - if (!g_spawn_sync(NULL, argv, NULL, - G_SPAWN_STDERR_TO_DEV_NULL | G_SPAWN_SEARCH_PATH, NULL, - NULL, &stdout_s, NULL, &exit_status, NULL)) { - goto finally; - } + if (!g_spawn_sync(NULL, argv, NULL, + G_SPAWN_STDERR_TO_DEV_NULL | G_SPAWN_SEARCH_PATH, NULL, + NULL, &stdout_s, NULL, &exit_status, NULL)) { + goto finally; + } - if (exit_status != 0) { - goto finally; - } + if (exit_status != 0) { + goto finally; + } - stdout_s = g_strstrip(stdout_s); - success = inet_aton(stdout_s, addr); + stdout_s = g_strstrip(stdout_s); + success = inet_aton(stdout_s, addr); finally: - g_free(name_s); - g_free(stdout_s); + g_free(name_s); + g_free(stdout_s); - return success; + return success; } -enum nss_status _nss_docker_gethostbyname2_r(const char *name, int af, - struct hostent *result, - char *buffer, size_t buflen, - int *errnop, int *h_errnop) { - struct in_addr addr; - - if (af != AF_INET) { - *errnop = EAFNOSUPPORT; - *h_errnop = NO_DATA; - return NSS_STATUS_UNAVAIL; - } - - if (!g_str_has_suffix(name, SUFFIX)) { - *errnop = ENOENT; - *h_errnop = HOST_NOT_FOUND; - return NSS_STATUS_NOTFOUND; - } - - if (!lookup_container_ip(name, &addr)) { - *errnop = ENOENT; - *h_errnop = HOST_NOT_FOUND; - return NSS_STATUS_NOTFOUND; - } - - pack_hostent(result, buffer, buflen, name, &addr); - - return NSS_STATUS_SUCCESS; +enum nss_status _nss_docker_gethostbyname2_r(const char* name, int af, + struct hostent* result, + char* buffer, size_t buflen, + int* errnop, int* h_errnop) +{ + struct in_addr addr; + + if (af != AF_INET) { + *errnop = EAFNOSUPPORT; + *h_errnop = NO_DATA; + return NSS_STATUS_UNAVAIL; + } + + if (!g_str_has_suffix(name, SUFFIX)) { + *errnop = ENOENT; + *h_errnop = HOST_NOT_FOUND; + return NSS_STATUS_NOTFOUND; + } + + if (!lookup_container_ip(name, &addr)) { + *errnop = ENOENT; + *h_errnop = HOST_NOT_FOUND; + return NSS_STATUS_NOTFOUND; + } + + pack_hostent(result, buffer, buflen, name, &addr); + + return NSS_STATUS_SUCCESS; } -enum nss_status _nss_docker_gethostbyname_r(const char *name, - struct hostent *result, - char *buffer, size_t buflen, - int *errnop, int *h_errnop) { - return _nss_docker_gethostbyname2_r(name, AF_INET, result, buffer, buflen, - errnop, h_errnop); +enum nss_status _nss_docker_gethostbyname_r(const char* name, + struct hostent* result, + char* buffer, size_t buflen, + int* errnop, int* h_errnop) +{ + return _nss_docker_gethostbyname2_r(name, AF_INET, result, buffer, buflen, + errnop, h_errnop); } -enum nss_status _nss_docker_gethostbyaddr_r(const void *addr, socklen_t len, - int af, struct hostent *result, - char *buffer, size_t buflen, - int *errnop, int *h_errnop) { - if (af != AF_INET) { +enum nss_status _nss_docker_gethostbyaddr_r(const void* addr, socklen_t len, + int af, struct hostent* result, + char* buffer, size_t buflen, + int* errnop, int* h_errnop) +{ + if (af != AF_INET) { + *errnop = EAFNOSUPPORT; + *h_errnop = NO_DATA; + return NSS_STATUS_UNAVAIL; + } + + if (len != sizeof(struct in_addr)) { + *errnop = EINVAL; + *h_errnop = NO_RECOVERY; + return NSS_STATUS_UNAVAIL; + } + + /* FIXME: need to implement reverse lookups */ *errnop = EAFNOSUPPORT; *h_errnop = NO_DATA; return NSS_STATUS_UNAVAIL; - } - - if (len != sizeof(struct in_addr)) { - *errnop = EINVAL; - *h_errnop = NO_RECOVERY; - return NSS_STATUS_UNAVAIL; - } - - /* FIXME: need to implement reverse lookups */ - *errnop = EAFNOSUPPORT; - *h_errnop = NO_DATA; - return NSS_STATUS_UNAVAIL; - /* - pack_hostent(result, buffer, buflen, "container.docker", addr); + /* +pack_hostent(result, buffer, buflen, "container.docker", addr); - return NSS_STATUS_SUCCESS; - */ +return NSS_STATUS_SUCCESS; +*/ } diff --git a/test.c b/test.c index 9c88db2..2da4376 100644 --- a/test.c +++ b/test.c @@ -25,79 +25,85 @@ #define BADGER_DOCKER_IP "172.11.22.33" -static void test_gethostbyname(void) { - struct hostent *results; - char buffer[INET_ADDRSTRLEN]; +static void test_gethostbyname(void) +{ + struct hostent* results; + char buffer[INET_ADDRSTRLEN]; - results = gethostbyname("badger.docker"); + results = gethostbyname("badger.docker"); - g_assert(results != NULL); + g_assert(results != NULL); - g_assert_cmpstr(results->h_name, ==, "badger.docker"); - g_assert(results->h_aliases[0] == NULL); - g_assert_cmpint(results->h_addrtype, ==, AF_INET); - g_assert_cmpint(results->h_length, ==, 4); - g_assert(results->h_addr_list[0] != NULL); - g_assert(results->h_addr_list[1] == NULL); + g_assert_cmpstr(results->h_name, ==, "badger.docker"); + g_assert(results->h_aliases[0] == NULL); + g_assert_cmpint(results->h_addrtype, ==, AF_INET); + g_assert_cmpint(results->h_length, ==, 4); + g_assert(results->h_addr_list[0] != NULL); + g_assert(results->h_addr_list[1] == NULL); - inet_ntop(AF_INET, results->h_addr_list[0], buffer, INET_ADDRSTRLEN); - g_assert_cmpstr(buffer, ==, BADGER_DOCKER_IP); + inet_ntop(AF_INET, results->h_addr_list[0], buffer, INET_ADDRSTRLEN); + g_assert_cmpstr(buffer, ==, BADGER_DOCKER_IP); } -static void test_gethostbyname_not_docker(void) { - struct hostent *results; +static void test_gethostbyname_not_docker(void) +{ + struct hostent* results; - results = gethostbyname("badger"); + results = gethostbyname("badger"); - g_assert(results == NULL); - g_assert_cmpint(h_errno, ==, HOST_NOT_FOUND); + g_assert(results == NULL); + g_assert_cmpint(h_errno, ==, HOST_NOT_FOUND); } -static void test_gethostbyname_by_image_name(void) { - struct hostent *results; +static void test_gethostbyname_by_image_name(void) +{ + struct hostent* results; - results = gethostbyname("stoat.docker"); + results = gethostbyname("stoat.docker"); - g_assert(results == NULL); - g_assert_cmpint(h_errno, ==, HOST_NOT_FOUND); + g_assert(results == NULL); + g_assert_cmpint(h_errno, ==, HOST_NOT_FOUND); } -static void test_gethostbyname_unknown_name(void) { - struct hostent *results; +static void test_gethostbyname_unknown_name(void) +{ + struct hostent* results; - results = gethostbyname("mushroom.docker"); + results = gethostbyname("mushroom.docker"); - g_assert(results == NULL); - g_assert_cmpint(h_errno, ==, HOST_NOT_FOUND); + g_assert(results == NULL); + g_assert_cmpint(h_errno, ==, HOST_NOT_FOUND); } -static void test_gethostbyname2(void) { - struct hostent *results; - char buffer[INET_ADDRSTRLEN]; +static void test_gethostbyname2(void) +{ + struct hostent* results; + char buffer[INET_ADDRSTRLEN]; - results = gethostbyname2("badger.docker", AF_INET); + results = gethostbyname2("badger.docker", AF_INET); - g_assert(results != NULL); + g_assert(results != NULL); - g_assert_cmpstr(results->h_name, ==, "badger.docker"); - g_assert(results->h_aliases[0] == NULL); - g_assert_cmpint(results->h_addrtype, ==, AF_INET); - g_assert_cmpint(results->h_length, ==, 4); - g_assert(results->h_addr_list[0] != NULL); - g_assert(results->h_addr_list[1] == NULL); + g_assert_cmpstr(results->h_name, ==, "badger.docker"); + g_assert(results->h_aliases[0] == NULL); + g_assert_cmpint(results->h_addrtype, ==, AF_INET); + g_assert_cmpint(results->h_length, ==, 4); + g_assert(results->h_addr_list[0] != NULL); + g_assert(results->h_addr_list[1] == NULL); - inet_ntop(AF_INET, results->h_addr_list[0], buffer, INET_ADDRSTRLEN); - g_assert_cmpstr(buffer, ==, BADGER_DOCKER_IP); + inet_ntop(AF_INET, results->h_addr_list[0], buffer, INET_ADDRSTRLEN); + g_assert_cmpstr(buffer, ==, BADGER_DOCKER_IP); } -static void test_gethostbyname2_inet6(void) { - struct hostent *results; +static void test_gethostbyname2_inet6(void) +{ + struct hostent* results; - results = gethostbyname2("badger.docker", AF_INET6); + results = gethostbyname2("badger.docker", AF_INET6); - g_assert(results == NULL); - g_assert_cmpint(errno, ==, EAFNOSUPPORT); - g_assert_cmpint(h_errno, ==, NO_DATA); + g_assert(results == NULL); + g_assert_cmpint(errno, ==, EAFNOSUPPORT); + g_assert_cmpint(h_errno, ==, NO_DATA); } #if 0 @@ -126,19 +132,20 @@ test_gethostbyaddr (void) } #endif -int main(int argc, char **argv) { - g_test_init(&argc, &argv, NULL); - - g_test_add_func("/test/gethostbyname", test_gethostbyname); - g_test_add_func("/test/gethostbyname_not_docker", - test_gethostbyname_not_docker); - g_test_add_func("/test/gethostbyname_by_image_name", - test_gethostbyname_by_image_name); - g_test_add_func("/test/gethostbyname_unknown_name", - test_gethostbyname_unknown_name); - g_test_add_func("/test/gethostbyname2", test_gethostbyname2); - g_test_add_func("/test/gethostbyname2_inet6", test_gethostbyname2_inet6); - // g_test_add_func("/test/gethostbyaddr", test_gethostbyaddr); - - return g_test_run(); +int main(int argc, char** argv) +{ + g_test_init(&argc, &argv, NULL); + + g_test_add_func("/test/gethostbyname", test_gethostbyname); + g_test_add_func("/test/gethostbyname_not_docker", + test_gethostbyname_not_docker); + g_test_add_func("/test/gethostbyname_by_image_name", + test_gethostbyname_by_image_name); + g_test_add_func("/test/gethostbyname_unknown_name", + test_gethostbyname_unknown_name); + g_test_add_func("/test/gethostbyname2", test_gethostbyname2); + g_test_add_func("/test/gethostbyname2_inet6", test_gethostbyname2_inet6); + // g_test_add_func("/test/gethostbyaddr", test_gethostbyaddr); + + return g_test_run(); } From 876cb877c5080d2383df2a711105b506a8efc156 Mon Sep 17 00:00:00 2001 From: Arjan van der Velde Date: Tue, 14 Jul 2015 11:51:25 -0400 Subject: [PATCH 04/13] a bit of a hack to get user outside of the docker group to use this. --- Makefile | 11 ++++++++++- nss.c | 4 +--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index a050a34..a9d96c6 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,7 @@ DESTDIR ?= NSSDIR ?= /usr/lib +BINDIR ?= /usr/bin + CC = gcc CFLAGS = -fPIC -Wall -Werror -ggdb `pkg-config --cflags glib-2.0` @@ -12,7 +14,7 @@ MODULE = libnss_docker.so.2 BINS = \ $(MODULE) \ - test + test inspect $(MODULE): $(OBJS) Makefile $(CC) -fPIC -shared -o $@ -Wl,-soname,$@ $< $(LDFLAGS) @@ -20,14 +22,21 @@ $(MODULE): $(OBJS) Makefile TEST_OBJS = \ test.o +INSPECT_OBJS = \ + inspect.o + test: $(TEST_OBJS) $(MODULE) Makefile $(CC) -o $@ $< $(LDFLAGS) +inspect: $(INSPECT_OBJS) $(MODULE) Makefile + $(CC) -o $@ $< + all: $(BINS) install: all mkdir -p $(DESTDIR)$(NSSDIR) install -m 0644 $(MODULE) $(DESTDIR)$(NSSDIR)/$(MODULE) + install -g docker -m 2755 inspect $(DESTDIR)$(BINDIR)/dockerinspect ldconfig clean: diff --git a/nss.c b/nss.c index 5725ef7..8d7a5e7 100644 --- a/nss.c +++ b/nss.c @@ -81,9 +81,7 @@ static gboolean lookup_container_ip(const char* name, struct in_addr* addr) name_s = g_strdup(name); *strrchr(name_s, '.') = '\0'; - char* argv[] = { "/usr/bin/docker", "inspect", - "-format={{.NetworkSettings.IPAddress}}", name_s, - NULL, }; + char* argv[] = { "/usr/bin/dockerinspect", name_s, NULL, }; if (!g_spawn_sync(NULL, argv, NULL, G_SPAWN_STDERR_TO_DEV_NULL | G_SPAWN_SEARCH_PATH, NULL, From 616b960e47874afcea3f3ebd2e83d0ead1cc5927 Mon Sep 17 00:00:00 2001 From: Arjan van der Velde Date: Tue, 14 Jul 2015 11:53:05 -0400 Subject: [PATCH 05/13] a bit of a hack to get user outside of the docker group to use this. --- inspect.c | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 inspect.c diff --git a/inspect.c b/inspect.c new file mode 100644 index 0000000..87b99dd --- /dev/null +++ b/inspect.c @@ -0,0 +1,10 @@ +#include + +int main(int argc, char** argv) { + if (argc > 1) { + const char *myargs[] = {"/usr/bin/docker", "inspect", "--format={{.NetworkSettings.IPAddress}}", argv[1] }; + return execlp(myargs[0], myargs[0], myargs[1], myargs[2], myargs[3], NULL); + } + return 0; +} + From 56246b7af0d2d7f547b410d6bd418b9a363b732d Mon Sep 17 00:00:00 2001 From: Arjan van der Velde Date: Tue, 14 Jul 2015 11:54:45 -0400 Subject: [PATCH 06/13] format --- inspect.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/inspect.c b/inspect.c index 87b99dd..4eb2103 100644 --- a/inspect.c +++ b/inspect.c @@ -1,10 +1,10 @@ #include -int main(int argc, char** argv) { - if (argc > 1) { - const char *myargs[] = {"/usr/bin/docker", "inspect", "--format={{.NetworkSettings.IPAddress}}", argv[1] }; - return execlp(myargs[0], myargs[0], myargs[1], myargs[2], myargs[3], NULL); - } - return 0; +int main(int argc, char** argv) +{ + if (argc > 1) { + const char* myargs[] = { "/usr/bin/docker", "inspect", "--format={{.NetworkSettings.IPAddress}}", argv[1] }; + return execlp(myargs[0], myargs[0], myargs[1], myargs[2], myargs[3], NULL); + } + return 0; } - From 8eae7d7732a48123cf344e4b929a151b670e8b85 Mon Sep 17 00:00:00 2001 From: Arjan van der Velde Date: Tue, 14 Jul 2015 12:13:06 -0400 Subject: [PATCH 07/13] rename dockerinspect; basic check on arg. --- Makefile | 2 +- inspect.c | 5 ++++- nss.c | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index a9d96c6..a20bb12 100644 --- a/Makefile +++ b/Makefile @@ -36,7 +36,7 @@ all: $(BINS) install: all mkdir -p $(DESTDIR)$(NSSDIR) install -m 0644 $(MODULE) $(DESTDIR)$(NSSDIR)/$(MODULE) - install -g docker -m 2755 inspect $(DESTDIR)$(BINDIR)/dockerinspect + install -g docker -m 2755 inspect $(DESTDIR)$(BINDIR)/dockerip ldconfig clean: diff --git a/inspect.c b/inspect.c index 87b99dd..81f358d 100644 --- a/inspect.c +++ b/inspect.c @@ -1,7 +1,10 @@ #include +#include int main(int argc, char** argv) { - if (argc > 1) { + + // run if one argument was supplied that does not start with '-' + if (argc == 2 && argv[1][0] != '-') { const char *myargs[] = {"/usr/bin/docker", "inspect", "--format={{.NetworkSettings.IPAddress}}", argv[1] }; return execlp(myargs[0], myargs[0], myargs[1], myargs[2], myargs[3], NULL); } diff --git a/nss.c b/nss.c index 8d7a5e7..bb02f0e 100644 --- a/nss.c +++ b/nss.c @@ -81,7 +81,7 @@ static gboolean lookup_container_ip(const char* name, struct in_addr* addr) name_s = g_strdup(name); *strrchr(name_s, '.') = '\0'; - char* argv[] = { "/usr/bin/dockerinspect", name_s, NULL, }; + char* argv[] = { "/usr/bin/dockerip", name_s, NULL, }; if (!g_spawn_sync(NULL, argv, NULL, G_SPAWN_STDERR_TO_DEV_NULL | G_SPAWN_SEARCH_PATH, NULL, From 125225eaef1dc9e18404a828adba26afced19eb0 Mon Sep 17 00:00:00 2001 From: Arjan van der Velde Date: Tue, 14 Jul 2015 12:16:03 -0400 Subject: [PATCH 08/13] format --- inspect.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/inspect.c b/inspect.c index b0a4fbe..8949c57 100644 --- a/inspect.c +++ b/inspect.c @@ -1,12 +1,13 @@ #include #include -int main(int argc, char** argv) { +int main(int argc, char** argv) +{ - // run if one argument was supplied that does not start with '-' - if (argc == 2 && argv[1][0] != '-') { - const char *myargs[] = {"/usr/bin/docker", "inspect", "--format={{.NetworkSettings.IPAddress}}", argv[1] }; - return execlp(myargs[0], myargs[0], myargs[1], myargs[2], myargs[3], NULL); - } - return 0; + // run if one argument was supplied that does not start with '-' + if (argc == 2 && argv[1][0] != '-') { + const char* myargs[] = { "/usr/bin/docker", "inspect", "--format={{.NetworkSettings.IPAddress}}", argv[1] }; + return execlp(myargs[0], myargs[0], myargs[1], myargs[2], myargs[3], NULL); + } + return 0; } From 6c0fe29c862b5c42e4d88c72eacfbd696bc3b317 Mon Sep 17 00:00:00 2001 From: Arjan van der Velde Date: Tue, 14 Jul 2015 12:16:31 -0400 Subject: [PATCH 09/13] format --- inspect.c | 1 - 1 file changed, 1 deletion(-) diff --git a/inspect.c b/inspect.c index 8949c57..d1de71c 100644 --- a/inspect.c +++ b/inspect.c @@ -3,7 +3,6 @@ int main(int argc, char** argv) { - // run if one argument was supplied that does not start with '-' if (argc == 2 && argv[1][0] != '-') { const char* myargs[] = { "/usr/bin/docker", "inspect", "--format={{.NetworkSettings.IPAddress}}", argv[1] }; From e43f3a0b0bb9938a4a11a6df1ddd2e954a45974d Mon Sep 17 00:00:00 2001 From: Arjan van der Velde Date: Tue, 14 Jul 2015 12:46:26 -0400 Subject: [PATCH 10/13] make sure we gat at least three chars --- Makefile | 2 ++ inspect.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index a20bb12..a5eb725 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,7 @@ NSSDIR ?= /usr/lib BINDIR ?= /usr/bin +STRIP = strip CC = gcc CFLAGS = -fPIC -Wall -Werror -ggdb `pkg-config --cflags glib-2.0` LDFLAGS = `pkg-config --libs glib-2.0` @@ -30,6 +31,7 @@ test: $(TEST_OBJS) $(MODULE) Makefile inspect: $(INSPECT_OBJS) $(MODULE) Makefile $(CC) -o $@ $< + $(STRIP) $@ all: $(BINS) diff --git a/inspect.c b/inspect.c index d1de71c..b9d9bf0 100644 --- a/inspect.c +++ b/inspect.c @@ -4,7 +4,7 @@ int main(int argc, char** argv) { // run if one argument was supplied that does not start with '-' - if (argc == 2 && argv[1][0] != '-') { + if (argc == 2 && strnlen(argv[1], 255) > 2 && argv[1][0] != '-') { const char* myargs[] = { "/usr/bin/docker", "inspect", "--format={{.NetworkSettings.IPAddress}}", argv[1] }; return execlp(myargs[0], myargs[0], myargs[1], myargs[2], myargs[3], NULL); } From 272dba7a14bb9936456ee4ff8ca83b38045d2e9c Mon Sep 17 00:00:00 2001 From: Arjan van der Velde Date: Tue, 14 Jul 2015 15:21:35 -0400 Subject: [PATCH 11/13] dockerip usage --- inspect.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/inspect.c b/inspect.c index b9d9bf0..8212e04 100644 --- a/inspect.c +++ b/inspect.c @@ -1,5 +1,6 @@ #include #include +#include int main(int argc, char** argv) { @@ -8,5 +9,6 @@ int main(int argc, char** argv) const char* myargs[] = { "/usr/bin/docker", "inspect", "--format={{.NetworkSettings.IPAddress}}", argv[1] }; return execlp(myargs[0], myargs[0], myargs[1], myargs[2], myargs[3], NULL); } - return 0; + printf("usage: %s \n", argv[0]); + return 1; } From 73f53af58c36e839e74bb96681adb38270a1a038 Mon Sep 17 00:00:00 2001 From: Arjan van der Velde Date: Thu, 16 Jul 2015 08:28:01 -0400 Subject: [PATCH 12/13] properly name dockerip --- Makefile | 10 +++++----- inspect.c => dockerip.c | 0 2 files changed, 5 insertions(+), 5 deletions(-) rename inspect.c => dockerip.c (100%) diff --git a/Makefile b/Makefile index a5eb725..4475b2d 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ MODULE = libnss_docker.so.2 BINS = \ $(MODULE) \ - test inspect + test dockerip $(MODULE): $(OBJS) Makefile $(CC) -fPIC -shared -o $@ -Wl,-soname,$@ $< $(LDFLAGS) @@ -24,21 +24,21 @@ TEST_OBJS = \ test.o INSPECT_OBJS = \ - inspect.o + dockerip.o test: $(TEST_OBJS) $(MODULE) Makefile $(CC) -o $@ $< $(LDFLAGS) -inspect: $(INSPECT_OBJS) $(MODULE) Makefile +dockerip: $(INSPECT_OBJS) $(MODULE) Makefile $(CC) -o $@ $< $(STRIP) $@ all: $(BINS) install: all - mkdir -p $(DESTDIR)$(NSSDIR) + mkdir -p $(DESTDIR)$(NSSDIR) $(DESTDIR)$(BINDIR) install -m 0644 $(MODULE) $(DESTDIR)$(NSSDIR)/$(MODULE) - install -g docker -m 2755 inspect $(DESTDIR)$(BINDIR)/dockerip + install -g docker -m 2755 dockerip $(DESTDIR)$(BINDIR)/dockerip ldconfig clean: diff --git a/inspect.c b/dockerip.c similarity index 100% rename from inspect.c rename to dockerip.c From df86e2e9330d656d2316b39eef7d0390d9f48c1f Mon Sep 17 00:00:00 2001 From: Arjan van der Velde Date: Fri, 26 Jan 2024 07:56:18 -0500 Subject: [PATCH 13/13] Fix for newer docker --- .gitignore | 1 + README.md | 4 +++- dockerip.c | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index b464d1b..9ff837d 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ *.o /libnss_docker.so.2 /test +/dockerip diff --git a/README.md b/README.md index 1ec6e60..352b576 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,9 @@ This is still a work in progress! Installing ========== - git clone git@github.com:danni/docker-nss.git +Ensure `make`, `gcc`, and `libglib2.0-dev` are installed on the system. + + git clone git@github.com:weng-lab/docker-nss.git cd docker-nss sudo make all install sudo sed -i -re 's/^(hosts: .*$)/\1 docker/' /etc/nsswitch.conf diff --git a/dockerip.c b/dockerip.c index 8212e04..80e4cfc 100644 --- a/dockerip.c +++ b/dockerip.c @@ -6,7 +6,7 @@ int main(int argc, char** argv) { // run if one argument was supplied that does not start with '-' if (argc == 2 && strnlen(argv[1], 255) > 2 && argv[1][0] != '-') { - const char* myargs[] = { "/usr/bin/docker", "inspect", "--format={{.NetworkSettings.IPAddress}}", argv[1] }; + const char* myargs[] = { "/usr/bin/docker", "inspect", "--format={{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}", argv[1] }; return execlp(myargs[0], myargs[0], myargs[1], myargs[2], myargs[3], NULL); } printf("usage: %s \n", argv[0]);