Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <sys/socket.h>
- #include <sys/un.h>
- #include <netinet/in.h>
- #include <netdb.h>
- #include <assert.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <stddef.h>
- #include <unistd.h>
- #include <string.h>
- void nameinfo(struct sockaddr *sa, socklen_t salen, char *prefix)
- {
- char ntop[NI_MAXHOST];
- char strport[NI_MAXSERV];
- if (sa->sa_family == AF_UNIX) {
- struct sockaddr_un *sun = (struct sockaddr_un *)sa;
- socklen_t len = offsetof(struct sockaddr_un, sun_path);
- assert(salen >= len);
- // XXX: salen take '\0' into account
- sun->sun_path[salen - len] = '\0';
- }
- assert(!getnameinfo(sa, salen,
- ntop, sizeof(ntop),
- strport, sizeof(strport),
- NI_NUMERICHOST|NI_NUMERICSERV));
- printf("%ssocklen=%i, family=%i, host=%s, serv=%s\n",
- prefix, salen, sa->sa_family, ntop, strport);
- }
- int main()
- {
- int fd;
- struct sockaddr_storage ss;
- struct sockaddr *sa = (struct sockaddr *)&ss;
- struct sockaddr_un *sun = (struct sockaddr_un *)&ss;
- socklen_t salen;
- puts("AF_UNIX:");
- fd = socket(AF_UNIX, SOCK_STREAM, 0);
- salen = sizeof(ss);
- assert(!getsockname(fd, sa, &salen));
- nameinfo(sa, salen, " ");
- puts(" bind():");
- memset(&ss, 0, sizeof(ss));
- sun->sun_family = AF_UNIX;
- strcpy(sun->sun_path, "/tmp/sock");
- unlink(sun->sun_path);
- salen = sizeof(*sun);
- assert(!bind(fd, sa, salen));
- assert(!getsockname(fd, sa, &salen));
- nameinfo(sa, salen, " ");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement