#if 0 /* -*- mode: c; c-file-style: "stroustrup"; tab-width: 8; -*- # # To compile this program, enter sh rdusock.c # TRG=`basename $0 .c` CDATE=`date` [ x"$1" = xclean ] && { set -x; exec rm -f $TRG $TRG*~; } [ x"$1" = x ] && set -- -s -O2 set -x; exec ${CC:-gcc} -Wall "$@" -o $TRG $0 -DCDATE="\"$CDATE\"" #*/ #endif /* Read from datagram unix sock, print to stdout. Adds newline if "needed". Somewhat useful for example to read from /dev/log (syslog messages) on systems that doesn't have one, thus programs are trying to log. This is very quirk&dirty, providing the minimum I needed. Feel free to develop further (or create your own project I can start using). */ #include #include #include #include #include #include #include #include static void xperror(const char * str) { perror(str); exit(1); } char * sname; void delsname(void) { unlink(sname); } void sigexit(int sig) { exit(1); } int main(int argc, char ** argv) { int ss/*, s*/; struct sockaddr_un addr; char buf[512]; int l; if (argc < 2) { fprintf(stderr, "\nUsage: %s sockname\n\n", argv[0]); return 1; } if (strlen(argv[1]) >= sizeof addr.sun_path) return 2; /* XXX message */ signal(SIGINT, sigexit); signal(SIGTERM, sigexit); signal(SIGHUP, sigexit); sname = argv[1]; memset(&addr, 0, sizeof addr); /* ss = socket(AF_UNIX, SOCK_STREAM, 0); */ ss = socket(PF_FILE, SOCK_DGRAM, 0); if (ss < 0) xperror("socket"); addr.sun_family = AF_UNIX; strcpy(addr.sun_path, sname); if (bind(ss, (struct sockaddr *)&addr, sizeof addr) < 0) xperror("bind"); atexit(delsname); chmod(sname, 0666); while ( (l = recv(ss, buf, sizeof buf - 1, 0)) > 0) { if (buf[l - 1] != '\n') buf[l] = '\n'; write(1, buf, l + 1); } return 0; } #if 0 if (listen(ss, 5) < 0) xperror("listen"); s = accept(ss, NULL, 0); if (s < 0) xperror("accept"); while ( ( l = read(s, buf, sizeof buf)) > 0) write(1, buf, l); return 0; } #endif