On Sun, Apr 23, 2006 at 09:28:19PM +0200, Otto Moerbeek wrote:
> On Sun, 23 Apr 2006, Nick Guenther wrote:
>
> > On 4/23/06, Dave Feustel <[EMAIL PROTECTED]> wrote:
> > > I have downloaded the source code accompanying
> > > Stevens' book _Advanced Network Programming
> > > - The Socket Programming API, vol 1, 3rd ed.
> > > After uncompressing the tar ball, cd'ing to the source code
> > > directory , running ./configure and attempting to gmake the source
> > > in lib, I get a number of errors which seem to stem from failure
> > > of the ./configure command to find many of the OpenBSD include files
> > > related to sockets. This failure shows up in the file config.h, where
> > > defines created during the configure process specify that OpenBSD
> > > is missing many include files and socket-related structures. This results
> > > in compile errors when socket structures are redefined during compilation.
> > > I started to fix individual errors until I figured out that there was a
> > > more
> > > general problem in ./configure. I have looked at the shell script in
> > > ./configure
> > > but so far I have not figured out where the configure goes wrong. Is
> > > there a
> > > simple way to run or fix ./configure so that the config.h generated by
> > > configure reflects the actual content of openbsd include files and
> > > subsequent
> > > compiles of Stevens' source work?
> >
> > Well, socket(2) shows that OpenBSD certainly has the full socket API
> > (afterall, they were invented on BSD). My guess is that the book was
> > designed for linux and no thought was given to users of other OSes.
>
> This shows that you don't know Stevens' books. Stevens books are among
> the books to read if you want to learn how to write good POSIX
> programs. Most of them were written before Linux became popular.
>
> For fun I tried to compile some of the programs mentioned, and the
> programs I tested compiled fine, be it with some warnings about
> usage of non-safe string functions.
>
> -Otto
>
> > So, to fix it, you should just have to redirect the socket includes to
> > the proper place (i.e:
> > #include <sys/types.h>
> > #include <sys/socket.h>
> > )
> >
> > Also: Hi Dave!
> >
> > -Nick
>
>
Here's a patch that removes all(?) warnings/errors from the
intro chapter if you followed the instructions in the readme...
diff -ru unpv13e.orig/intro/byteorder.c unpv13e/intro/byteorder.c
--- unpv13e.orig/intro/byteorder.c Thu Nov 14 04:33:33 2002
+++ unpv13e/intro/byteorder.c Tue Apr 18 04:39:40 2006
@@ -18,7 +18,7 @@
else
printf("unknown\n");
} else
- printf("sizeof(short) = %d\n", sizeof(short));
+ printf("sizeof(short) = %zd\n", sizeof(short));
exit(0);
}
diff -ru unpv13e.orig/lib/error.c unpv13e/lib/error.c
--- unpv13e.orig/lib/error.c Sat Sep 20 04:51:29 2003
+++ unpv13e/lib/error.c Tue Apr 18 04:25:36 2006
@@ -96,7 +96,7 @@
n = strlen(buf);
if (errnoflag)
snprintf(buf + n, MAXLINE - n, ": %s", strerror(errno_save));
- strcat(buf, "\n");
+ strlcat(buf, "\n", MAXLINE + 1);
if (daemon_proc) {
syslog(level, buf);
diff -ru unpv13e.orig/lib/sock_ntop.c unpv13e/lib/sock_ntop.c
--- unpv13e.orig/lib/sock_ntop.c Mon Jul 28 06:26:32 2003
+++ unpv13e/lib/sock_ntop.c Tue Apr 18 04:36:21 2006
@@ -19,7 +19,7 @@
return(NULL);
if (ntohs(sin->sin_port) != 0) {
snprintf(portstr, sizeof(portstr), ":%d",
ntohs(sin->sin_port));
- strcat(str, portstr);
+ strlcat(str, portstr, 128);
}
return(str);
}
@@ -34,7 +34,7 @@
return(NULL);
if (ntohs(sin6->sin6_port) != 0) {
snprintf(portstr, sizeof(portstr), "]:%d",
ntohs(sin6->sin6_port));
- strcat(str, portstr);
+ strlcat(str, portstr, 128);
return(str);
}
return (str + 1);
@@ -48,7 +48,7 @@
/* OK to have no pathname bound to the socket: happens
on
every connect() unless client calls bind() first. */
if (unp->sun_path[0] == 0)
- strcpy(str, "(no pathname bound)");
+ strlcpy(str, "(no pathname bound)", 128);
else
snprintf(str, sizeof(str), "%s", unp->sun_path);
return(str);
diff -ru unpv13e.orig/lib/sock_ntop_host.c unpv13e/lib/sock_ntop_host.c
--- unpv13e.orig/lib/sock_ntop_host.c Tue May 13 20:47:49 2003
+++ unpv13e/lib/sock_ntop_host.c Tue Apr 18 11:58:31 2006
@@ -35,7 +35,7 @@
/* OK to have no pathname bound to the socket: happens
on
every connect() unless client calls bind() first. */
if (unp->sun_path[0] == 0)
- strcpy(str, "(no pathname bound)");
+ strlcpy(str, "(no pathname bound)", 128);
else
snprintf(str, sizeof(str), "%s", unp->sun_path);
return(str);
diff -ru unpv13e.orig/libfree/inet_ntop.c unpv13e/libfree/inet_ntop.c
--- unpv13e.orig/libfree/inet_ntop.c Thu Nov 14 04:33:35 2002
+++ unpv13e/libfree/inet_ntop.c Tue Apr 18 04:34:00 2006
@@ -91,12 +91,12 @@
static const char fmt[] = "%u.%u.%u.%u";
char tmp[sizeof "255.255.255.255"];
- sprintf(tmp, fmt, src[0], src[1], src[2], src[3]);
+ snprintf(tmp, size, fmt, src[0], src[1], src[2], src[3]);
if (strlen(tmp) > size) {
errno = ENOSPC;
return (NULL);
}
- strcpy(dst, tmp);
+ strlcpy(dst, tmp, size);
return (dst);
}
@@ -178,7 +178,7 @@
tp += strlen(tp);
break;
}
- sprintf(tp, "%x", words[i]);
+ snprintf(tp, sizeof(tmp), "%x", words[i]);
tp += strlen(tp);
}
/* Was it a trailing run of 0x00's? */
@@ -193,6 +193,6 @@
errno = ENOSPC;
return (NULL);
}
- strcpy(dst, tmp);
+ strlcpy(dst, tmp, size);
return (dst);
}
diff -ru unpv13e.orig/libroute/if_nameindex.c unpv13e/libroute/if_nameindex.c
--- unpv13e.orig/libroute/if_nameindex.c Sun Apr 27 01:13:56 2003
+++ unpv13e/libroute/if_nameindex.c Tue Apr 18 04:17:48 2006
@@ -49,11 +49,12 @@
/* end if_nameindex */
/* include if_freenameindex */
+/* Provided by OpenBSD
void
if_freenameindex(struct if_nameindex *ptr)
{
free(ptr);
-}
+}*/
/* end if_freenameindex */
struct if_nameindex *