diff options
Diffstat (limited to 'ctrl/facemgr/examples')
-rw-r--r-- | ctrl/facemgr/examples/mobility/mobility.c | 103 | ||||
-rw-r--r-- | ctrl/facemgr/examples/updowncli/updowncli.c | 82 | ||||
-rw-r--r-- | ctrl/facemgr/examples/updownsrv/updownsrv.c | 348 |
3 files changed, 263 insertions, 270 deletions
diff --git a/ctrl/facemgr/examples/mobility/mobility.c b/ctrl/facemgr/examples/mobility/mobility.c index 528951446..ae1d6dee3 100644 --- a/ctrl/facemgr/examples/mobility/mobility.c +++ b/ctrl/facemgr/examples/mobility/mobility.c @@ -7,82 +7,81 @@ * Test server using nc: nc -4kvul localhost 9533 */ -#include <arpa/inet.h> // inet_ntop -#include <errno.h> // EINTR,. .. -#include <netinet/in.h> // INET_ADDRSTRLEN, INET6_ADDRSTRLEN +#include <arpa/inet.h> // inet_ntop +#include <errno.h> // EINTR,. .. +#include <netinet/in.h> // INET_ADDRSTRLEN, INET6_ADDRSTRLEN #include <stdio.h> #include <inttypes.h> #include <stdlib.h> #include <sys/socket.h> #include <sys/timerfd.h> -#include <sys/un.h> // sockaddr_un -#include <unistd.h> // fcntl -#include <fcntl.h> // fcntl +#include <sys/un.h> // sockaddr_un +#include <unistd.h> // fcntl +#include <fcntl.h> // fcntl #define MS2US(x) (x * 1000) /** * \brief Main function */ -int main(int argc, char **argv) -{ - int rc; +int main(int argc, char **argv) { + int rc; - if (argc != 4) { - fprintf(stderr, "Usage: %s IP PORT INTERVAL\n", argv[0]); - fprintf(stderr, "\n"); - fprintf(stderr, " IP Target hostname\n"); - fprintf(stderr, " PORT Target port\n"); - fprintf(stderr, " INTERVAL Interval between mobility events (in ms)\n"); - fprintf(stderr, "\n"); - exit(EXIT_FAILURE); - } + if (argc != 4) { + fprintf(stderr, "Usage: %s IP PORT INTERVAL\n", argv[0]); + fprintf(stderr, "\n"); + fprintf(stderr, " IP Target hostname\n"); + fprintf(stderr, " PORT Target port\n"); + fprintf(stderr, " INTERVAL Interval between mobility events (in ms)\n"); + fprintf(stderr, "\n"); + exit(EXIT_FAILURE); + } - int interval = atoi(argv[3]); + int interval = atoi(argv[3]); - int fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (fd < 0) { - perror("socket"); - goto ERR_SOCKET; - } + int fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (fd < 0) { + perror("socket"); + goto ERR_SOCKET; + } - struct sockaddr_in addr; - memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = inet_addr(argv[1]); - addr.sin_port = htons(atoi(argv[2])); + struct sockaddr_in addr; + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = inet_addr(argv[1]); + addr.sin_port = htons(atoi(argv[2])); - if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) { - perror("connect"); - goto ERR_CONNECT; - } + if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { + perror("connect"); + goto ERR_CONNECT; + } - unsigned state = 0; - char buf[1]; - for(;;) { - usleep(MS2US(interval)); + unsigned state = 0; + char buf[1]; + for (;;) { + usleep(MS2US(interval)); - buf[0] = state; - rc = send(fd, buf, 1, 0); - if (rc < 0) { - if (errno == ECONNREFUSED) { - continue; - } - perror("send"); - goto ERR_SEND; - } - - state = 1 - state; + buf[0] = state; + rc = send(fd, buf, 1, 0); + if (rc < 0) { + if (errno == ECONNREFUSED) { + continue; + } + perror("send"); + goto ERR_SEND; } - close(fd); + state = 1 - state; + } + + close(fd); - exit(EXIT_SUCCESS); + exit(EXIT_SUCCESS); ERR_SEND: ERR_CONNECT: - close(fd); + close(fd); ERR_SOCKET: - exit(EXIT_FAILURE); + exit(EXIT_FAILURE); } diff --git a/ctrl/facemgr/examples/updowncli/updowncli.c b/ctrl/facemgr/examples/updowncli/updowncli.c index 4f5a14165..34ec3fb97 100644 --- a/ctrl/facemgr/examples/updowncli/updowncli.c +++ b/ctrl/facemgr/examples/updowncli/updowncli.c @@ -5,6 +5,8 @@ #include <stdlib.h> #include <unistd.h> +#include <hicn/util/sstrncpy.h> + /** * \brief Default unix socket path (the leading \0 means using the abstract * namespace instead of the filesystem). @@ -12,46 +14,46 @@ #define UNIX_PATH "\0updownsrv" int main() { - struct sockaddr_un addr; - char buf[100]; - int fd,rc; - - char * socket_path = UNIX_PATH; - - if ( (fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { - perror("socket error"); - exit(-1); - } - - memset(&addr, 0, sizeof(addr)); - addr.sun_family = AF_UNIX; - if (*socket_path == '\0') { - *addr.sun_path = '\0'; - strncpy(addr.sun_path+1, socket_path+1, sizeof(addr.sun_path)-2); - } else { - strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path)-1); - } - - if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) { - perror("connect error"); - exit(-1); - } - - printf("Waiting for server data...\n"); - while( (rc=read(fd, buf, sizeof(buf))) > 0) { - assert(rc == 1); - switch(buf[0]) { - case '\0': - printf("WiFi\n"); - break; - case '\1': - printf("LTE\n"); - break; - default: - printf("Unknown\n"); - break; - } + struct sockaddr_un addr; + char buf[100]; + int fd, rc; + + char* socket_path = UNIX_PATH; + + if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { + perror("socket error"); + exit(-1); + } + + memset(&addr, 0, sizeof(addr)); + addr.sun_family = AF_UNIX; + if (*socket_path == '\0') { + *addr.sun_path = '\0'; + strcpy_s(addr.sun_path + 1, sizeof(addr.sun_path) - 2, socket_path + 1); + } else { + strcpy_s(addr.sun_path, sizeof(addr.sun_path) - 1, socket_path); + } + + if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) { + perror("connect error"); + exit(-1); + } + + printf("Waiting for server data...\n"); + while ((rc = read(fd, buf, sizeof(buf))) > 0) { + assert(rc == 1); + switch (buf[0]) { + case '\0': + printf("WiFi\n"); + break; + case '\1': + printf("LTE\n"); + break; + default: + printf("Unknown\n"); + break; } + } - return 0; + return 0; } diff --git a/ctrl/facemgr/examples/updownsrv/updownsrv.c b/ctrl/facemgr/examples/updownsrv/updownsrv.c index 3aba3cfd0..57661d427 100644 --- a/ctrl/facemgr/examples/updownsrv/updownsrv.c +++ b/ctrl/facemgr/examples/updownsrv/updownsrv.c @@ -5,19 +5,20 @@ * using unix domains that sets a face up and down. */ -#include <arpa/inet.h> // inet_ntop -#include <errno.h> // EINTR,. .. -#include <netinet/in.h> // INET_ADDRSTRLEN, INET6_ADDRSTRLEN +#include <arpa/inet.h> // inet_ntop +#include <errno.h> // EINTR,. .. +#include <netinet/in.h> // INET_ADDRSTRLEN, INET6_ADDRSTRLEN #include <stdio.h> #include <inttypes.h> #include <stdlib.h> #include <sys/socket.h> #include <sys/timerfd.h> -#include <sys/un.h> // sockaddr_un -#include <unistd.h> // fcntl -#include <fcntl.h> // fcntl +#include <sys/un.h> // sockaddr_un +#include <unistd.h> // fcntl +#include <fcntl.h> // fcntl +#include <hicn/util/sstrncpy.h> /** * \brief Default unix socket path (the leading \0 means using the abstract @@ -40,199 +41,190 @@ */ #define LISTEN_BACKLOG MAX_CLIENTS - /** * \brief Creates a unix server socket * \param [in] path - string representing the path on which to listen for * connections * \return int - fd associated to the socket */ -int -create_unix_server(char * path) -{ - struct sockaddr_un addr; - int fd; - - fd = socket(AF_UNIX, SOCK_STREAM, 0); - if (fd == -1) { - perror("socket error"); - return -1; - } - - if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) { - perror("fcntl"); - return -1; - } - - memset(&addr, 0, sizeof(addr)); - addr.sun_family = AF_UNIX; - if (*path == '\0') { - *addr.sun_path = '\0'; - strncpy(addr.sun_path+1, path+1, sizeof(addr.sun_path)-2); - } else { - strncpy(addr.sun_path, path, sizeof(addr.sun_path)-1); - unlink(path); - } - - if (bind(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) { - perror("bind error"); - return -1; - } - - if (listen(fd, LISTEN_BACKLOG) == -1) { - perror("listen error"); - return -1; - } - - return fd; +int create_unix_server(char* path) { + struct sockaddr_un addr; + int fd; + + fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (fd == -1) { + perror("socket error"); + return -1; + } + + if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) { + perror("fcntl"); + return -1; + } + + memset(&addr, 0, sizeof(addr)); + addr.sun_family = AF_UNIX; + if (*path == '\0') { + *addr.sun_path = '\0'; + strcpy_s(addr.sun_path + 1, sizeof(addr.sun_path) - 2, path + 1); + } else { + strcpy_s(addr.sun_path, sizeof(addr.sun_path) - 1, path); + unlink(path); + } + + if (bind(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) { + perror("bind error"); + return -1; + } + + if (listen(fd, LISTEN_BACKLOG) == -1) { + perror("listen error"); + return -1; + } + + return fd; } - /** * \brief Main function */ int main() { - int fd, tfd; - int rc; - - /* Alternating state of the server : 0 / 1 */ - unsigned state = 0; - - /* - * This server has to send a signal to all connected clients at periodic - * intervals. Since we don't expect a large number of connected clients for - * such a simple program, we simply use a statically allocated array. - */ - int clients[MAX_CLIENTS]; - size_t num_clients = 0; - - fd_set active_fd_set, read_fd_set; - FD_ZERO (&active_fd_set); - - /* Create listening unix socket */ - fd = create_unix_server(UNIX_PATH); - if (fd < 0) - exit(EXIT_FAILURE); - - if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) { - perror("fcntl"); - exit(EXIT_FAILURE); - } - - FD_SET (fd, &active_fd_set); - - /* Create timer */ - tfd = timerfd_create(CLOCK_MONOTONIC, 0); - if (tfd == -1) { - perror("timer error"); - exit(EXIT_FAILURE); + int fd, tfd; + int rc; + + /* Alternating state of the server : 0 / 1 */ + unsigned state = 0; + + /* + * This server has to send a signal to all connected clients at periodic + * intervals. Since we don't expect a large number of connected clients for + * such a simple program, we simply use a statically allocated array. + */ + int clients[MAX_CLIENTS]; + size_t num_clients = 0; + + fd_set active_fd_set, read_fd_set; + FD_ZERO(&active_fd_set); + + /* Create listening unix socket */ + fd = create_unix_server(UNIX_PATH); + if (fd < 0) exit(EXIT_FAILURE); + + if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) { + perror("fcntl"); + exit(EXIT_FAILURE); + } + + FD_SET(fd, &active_fd_set); + + /* Create timer */ + tfd = timerfd_create(CLOCK_MONOTONIC, 0); + if (tfd == -1) { + perror("timer error"); + exit(EXIT_FAILURE); + } + + if (fcntl(tfd, F_SETFL, O_NONBLOCK) < 0) { + perror("fcntl"); + exit(EXIT_FAILURE); + } + + FD_SET(tfd, &active_fd_set); + + struct itimerspec ts = {.it_interval = + { + .tv_sec = DEFAULT_INTERVAL_SEC, + .tv_nsec = DEFAULT_INTERVAL_NSEC, + }, + .it_value = { + .tv_sec = DEFAULT_INTERVAL_SEC, + .tv_nsec = DEFAULT_INTERVAL_NSEC, + }}; + rc = timerfd_settime(tfd, 0, &ts, NULL); + if (rc == -1) { + perror("timerfd_settime"); + exit(EXIT_FAILURE); + } + + printf("Waiting for clients...\n"); + + for (;;) { + /* Block until input arrives on one or more active sockets. */ + read_fd_set = active_fd_set; + rc = select(FD_SETSIZE, &read_fd_set, NULL, NULL, NULL); + if (rc < 0) { + if (rc == EINTR) break; + perror("select"); + exit(EXIT_FAILURE); } - if (fcntl(tfd, F_SETFL, O_NONBLOCK) < 0) { - perror("fcntl"); - exit(EXIT_FAILURE); - } - - FD_SET (tfd, &active_fd_set); - - struct itimerspec ts = { - .it_interval = { - .tv_sec = DEFAULT_INTERVAL_SEC, - .tv_nsec = DEFAULT_INTERVAL_NSEC, - }, - .it_value = { - .tv_sec = DEFAULT_INTERVAL_SEC, - .tv_nsec = DEFAULT_INTERVAL_NSEC, - } - }; - rc = timerfd_settime(tfd, 0, &ts, NULL); - if (rc == -1) { - perror("timerfd_settime"); - exit(EXIT_FAILURE); - } - - printf("Waiting for clients...\n"); - - for(;;) { - /* Block until input arrives on one or more active sockets. */ - read_fd_set = active_fd_set; - rc = select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL); - if (rc < 0) { - if (rc == EINTR) - break; - perror("select"); - exit (EXIT_FAILURE); + /* Service all the sockets with input pending. */ + for (int i = 0; i < FD_SETSIZE; ++i) { + if (!FD_ISSET(i, &read_fd_set)) continue; + if (i == fd) { + /* Connection request on original socket. */ + int client_fd = accept(fd, NULL, NULL); + if (client_fd < 0) { + perror("accept"); + continue; } - /* Service all the sockets with input pending. */ - for (int i = 0; i < FD_SETSIZE; ++i) { - if (!FD_ISSET (i, &read_fd_set)) - continue; - if (i == fd) { - /* Connection request on original socket. */ - int client_fd = accept(fd, NULL, NULL); - if (client_fd < 0) { - perror("accept"); - continue; - } - - fprintf(stderr, "Server: connect from new client\n"); - clients[num_clients++] = client_fd; - FD_SET(client_fd, &active_fd_set); - } else if (i == tfd) { - /* Timer event */ - uint64_t res; - - read(tfd, &res, sizeof(res)); -// while (read(fd, &missed, sizeof(missed)) > 0) -// ; - for (unsigned j = 0; j < num_clients; j++) { - write(clients[j], state ? "\1" : "\0", 1); - } - printf("STATE=%d\n", state); - state = 1 - state; - } else { - char buf[1024]; - rc = read(i, buf, sizeof(buf)); - /* Client event : we close the connection on any event... */ - for (unsigned j = 0; j < num_clients; j++) { - if (i == clients[j]) { - clients[j] = clients[num_clients--]; - break; - } - } - close(i); - FD_CLR(i, &active_fd_set); - } + fprintf(stderr, "Server: connect from new client\n"); + clients[num_clients++] = client_fd; + FD_SET(client_fd, &active_fd_set); + } else if (i == tfd) { + /* Timer event */ + uint64_t res; + + read(tfd, &res, sizeof(res)); + // while (read(fd, &missed, sizeof(missed)) > 0) + // ; + for (unsigned j = 0; j < num_clients; j++) { + write(clients[j], state ? "\1" : "\0", 1); } - - } - - int ret = EXIT_SUCCESS; - - /* Close all active client connections */ - for (unsigned i = 0; i < num_clients; i++) { - rc = close(clients[i]); - if (rc == -1) { - perror("close"); - ret = EXIT_FAILURE; + printf("STATE=%d\n", state); + state = 1 - state; + } else { + char buf[1024]; + rc = read(i, buf, sizeof(buf)); + /* Client event : we close the connection on any event... */ + for (unsigned j = 0; j < num_clients; j++) { + if (i == clients[j]) { + clients[j] = clients[num_clients--]; + break; + } } + close(i); + FD_CLR(i, &active_fd_set); + } } + } - /* Close server */ - rc = close(fd); - if (rc == -1) { - perror("close"); - ret = EXIT_FAILURE; - } + int ret = EXIT_SUCCESS; - /* Terminate timer */ - ts.it_value.tv_sec = 0; - rc = timerfd_settime(tfd, 0, &ts, NULL); + /* Close all active client connections */ + for (unsigned i = 0; i < num_clients; i++) { + rc = close(clients[i]); if (rc == -1) { - perror("timerfd_settime"); - exit(EXIT_FAILURE); + perror("close"); + ret = EXIT_FAILURE; } - - exit(ret); + } + + /* Close server */ + rc = close(fd); + if (rc == -1) { + perror("close"); + ret = EXIT_FAILURE; + } + + /* Terminate timer */ + ts.it_value.tv_sec = 0; + rc = timerfd_settime(tfd, 0, &ts, NULL); + if (rc == -1) { + perror("timerfd_settime"); + exit(EXIT_FAILURE); + } + + exit(ret); } |