Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/socket_tests/us_abstract_bind.c')
-rw-r--r--winsup/cygwin/socket_tests/us_abstract_bind.c61
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);
+}