http://0pointer.de/blog/projects/socket-activation.html --------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include </usr/include/systemd/sd-daemon.h> int fd; if(sd_listen_fds(0) != 1) { fprintf(stderr, "No or too many file descriptors received.\n"); exit(1); } fd = SD_LISTEN_FDS_START + 0; --------------------------------------------- demo-udp.c:16:1: error: expected identifier or '(' before 'if' if(sd_listen_fds(0) != 1) ^~ demo-udp.c:22:1: warning: data definition has no type or storage class fd = SD_LISTEN_FDS_START + 0; ^~ demo-udp.c:22:1: warning: type defaults to 'int' in declaration of 'fd' [-Wimplicit-int] --------------------------------------------- that thing below "just works" (ipv4 only but well..) as ordinary service, frankly i just want a "as-simple-as-possible" binary which receives UDP, get fired up by systemd on-demand, answers whatever to signal "this port is open and reachbale" to the client, not more and not less without have to run it all the time #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #define MAXLINE 1024 int main(int argc, char *argv[]) { if(argc < 3 || argc > 3) { printf("USAGE: demo-udp.bin LISTEN_IP LISTEN_PORT\n"); exit(EXIT_FAILURE); } char* LISTEN_IP = argv[1]; int LISTEN_PORT = atoi(argv[2]); if(LISTEN_PORT < 1 || LISTEN_PORT > 65535) { printf("port out of range 1-65535\n"); exit(EXIT_FAILURE); } int sockfd; char buffer[MAXLINE]; char *pong = "PONG"; struct sockaddr_in servaddr, cliaddr; if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket creation"); exit(EXIT_FAILURE); } memset(&servaddr, 0, sizeof(servaddr)); memset(&cliaddr, 0, sizeof(cliaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = inet_addr(LISTEN_IP); servaddr.sin_port = htons(LISTEN_PORT); if(bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { perror("bind"); exit(EXIT_FAILURE); } int len, n; while(1) { recvfrom(sockfd, (char *)buffer, MAXLINE, MSG_WAITALL, (struct sockaddr *) &cliaddr, &len); sendto(sockfd, (const char *)pong, strlen(pong), MSG_CONFIRM, (const struct sockaddr *) &cliaddr, len); } } _______________________________________________ systemd-devel mailing list systemd-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/systemd-devel