summaryrefslogtreecommitdiff
path: root/Distrib/PortingIssues.mdwn
diff options
context:
space:
mode:
Diffstat (limited to 'Distrib/PortingIssues.mdwn')
-rw-r--r--Distrib/PortingIssues.mdwn27
1 files changed, 15 insertions, 12 deletions
diff --git a/Distrib/PortingIssues.mdwn b/Distrib/PortingIssues.mdwn
index 2361d064..fb66791f 100644
--- a/Distrib/PortingIssues.mdwn
+++ b/Distrib/PortingIssues.mdwn
@@ -75,6 +75,7 @@ Fixed code:
...
#ifdef MAXHOSTNAMELEN
+
gethostname(localhost, sizeof(localhost));
#else
localhost = xgethostname();
@@ -164,32 +165,34 @@ See [a simple fix for TIOCFLUSH in telnet](http://mail.gnu.org/archive/html/bug-
The following declaration:
- sockaddr_un sun = { AF_UNIX, "" };
+ sockaddr_un sun = { AF_UNIX, "/path/to/socket" };
won't work on GNU/Hurd. The Glibc API requires that the second parameter of a `sockaddr_un` struct is array of chars, but NOT pointer to array of chars. Glibc wants a nul-terminated string of chars there, so we have to copy them directly into the `sun_path` address. An example:
- sockaddr_un sa;
+ sockaddr_un su;
/* AF_LOCAL is the canonical flag in Glibc.
Use AF_UNIX if you want compatibility. */
- sa.sun_family = AF_LOCAL;
+ su.sun_family = AF_LOCAL;
/* Copy the string into sun_path. It must be
- no longer than 108 characters. */
- strcpy (sa.sun_path, "/path/to/socket");
+ no longer than approximately 100 characters. */
+ strcpy (su.sun_path, "/path/to/socket");
+ /* Use `SUN_LEN (su)' in socket functions. */
If you have pointer to array of characters as file name, you'd better use the following code:
- strncpy (sa.sun_path, filename, sizeof (sa.sun_path));
- sa.sun_path[sizeof (sa.sun_path) - 1] = '\0';
+ strncpy (su.sun_path, filename, sizeof (su.sun_path));
+ /* Use `sizeof (su)' in socket functions. */
-If you expect file name longer than 108 characters, use the following code:
+If you expect file name longer than approximately 100 characters, use the following code:
/* `offsetof', `alloca' and `AF_LOCAL' may not
be available everywhere. */
- socklen_t sa_len = offsetof (struct sockaddr_un, sun_path)
+ socklen_t su_len = offsetof (struct sockaddr_un, sun_path)
+ strlen (filename) + 1;
- struct sockaddr_un *sa = alloca (sa_len);
- sa->sun_family = AF_LOCAL;
- strcpy (sa->sun_path, filename);
+ struct sockaddr_un *su = alloca (su_len);
+ su->sun_family = AF_LOCAL;
+ strcpy (su->sun_path, filename);
+ /* Use `SUN_LEN (su)' in socket functions. */
NOTE: the current API is subject to change, see the notes in Glibc's docs ("info libc" and search for `sockaddr_un`) and [Debian bug #187391](http://bugs.debian.org/187391).