diff options
Diffstat (limited to 'winsup/cygwin/socket_tests/us_abstract_bind.c')
-rw-r--r-- | winsup/cygwin/socket_tests/us_abstract_bind.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/winsup/cygwin/socket_tests/us_abstract_bind.c b/winsup/cygwin/socket_tests/us_abstract_bind.c new file mode 100644 index 000000000..897072ec3 --- /dev/null +++ b/winsup/cygwin/socket_tests/us_abstract_bind.c @@ -0,0 +1,61 @@ +/*************************************************************************\ +* Copyright (C) Michael Kerrisk, 2018. * +* * +* This program is free software. You may use, modify, and redistribute it * +* under the terms of the GNU General Public License as published by the * +* Free Software Foundation, either version 3 or (at your option) any * +* later version. This program is distributed without any warranty. See * +* the file COPYING.gpl-v3 for details. * +\*************************************************************************/ + +/* Listing 57-8 */ + +/* us_abstract_bind.c + + Demonstrate how to bind a UNIX domain socket to a name in the + Linux-specific abstract namespace. + + This program is Linux-specific. + + The first printing of the book used slightly different code. The code was + correct, but could have been better (to understand why, see the errata + for page 1176 of the book). The old code is shown in comments below. +*/ +#include "af_unix_hdr.h" + +int +main(int argc, char *argv[]) +{ + int sockfd; + struct sockaddr_un addr; + char *str; + + memset(&addr, 0, sizeof(struct sockaddr_un)); /* Clear address structure */ + addr.sun_family = AF_UNIX; /* UNIX domain address */ + + /* addr.sun_path[0] has already been set to 0 by memset() */ + + str = "xyz"; /* Abstract name is "\0xyz" */ + strncpy(&addr.sun_path[1], str, strlen(str)); + + // In early printings of the book, the above two lines were instead: + // + // strncpy(&addr.sun_path[1], "xyz", sizeof(addr.sun_path) - 2); + // /* Abstract name is "xyz" followed by null bytes */ + + sockfd = socket(AF_UNIX, SOCK_STREAM, 0); + if (sockfd == -1) + errExit("socket"); + + if (bind(sockfd, (struct sockaddr *) &addr, + sizeof(sa_family_t) + strlen(str) + 1) == -1) + errExit("bind"); + + // In early printings of the book, the final part of the bind() call + // above was instead: + // sizeof(struct sockaddr_un)) == -1) + + sleep(60); + + exit(EXIT_SUCCESS); +} |