X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=common-src%2Famanda.h;h=9aa3d6a4fafb080c308680991033e40d1ff456ab;hb=fb2bd066c2f8b34addafe48d62550e3033a59431;hp=886e1156ab9766b14946d288470b51c80a1a75fb;hpb=a6127998ee6dcab6bb034f6ca985b07804a86f9a;p=debian%2Famanda diff --git a/common-src/amanda.h b/common-src/amanda.h index 886e115..9aa3d6a 100644 --- a/common-src/amanda.h +++ b/common-src/amanda.h @@ -302,12 +302,6 @@ struct iovec { #include #endif -/* Support for missing IPv6 components */ -#ifndef HAVE_SOCKADDR_STORAGE -# define sockaddr_storage sockaddr_in -# define ss_family sin_family -#endif - #ifdef WORKING_IPV6 #define INET6 #endif @@ -420,6 +414,21 @@ extern int errno; #define MAX_TAPE_LABEL_BUF (MAX_TAPE_LABEL_LEN+1) #define MAX_TAPE_LABEL_FMT "%10240s" +/* Unfortunately, the system-level sockaddr_storage definition can lead to + * C aliasing errors (where the optimizer doesn't notice that two operations + * affect the same datum). We define our own similar type as a union. + */ +typedef union sockaddr_union { + struct sockaddr sa; + struct sockaddr_in sin; +#ifdef WORKING_IPV6 + struct sockaddr_in6 sin6; +#endif +#ifdef HAVE_SOCKADDR_STORAGE + struct sockaddr_storage ss; /* not used; just here to make the union full-size */ +#endif +} sockaddr_union; + #include "debug.h" #include "file.h" @@ -712,7 +721,7 @@ time_t unctime(char *timestr); /* from old bsd-security.c */ extern int debug; -extern int check_security(struct sockaddr_storage *, char *, unsigned long, char **); +extern int check_security(sockaddr_union *, char *, unsigned long, char **); /* * Handle functions which are not always declared on all systems. This @@ -721,7 +730,7 @@ extern int check_security(struct sockaddr_storage *, char *, unsigned long, char /* AIX #defines accept, and provides a prototype for the alternate name */ #if !defined(HAVE_ACCEPT_DECL) && !defined(accept) -extern int accept(int s, struct sockaddr *addr, socklen_t *addrlen); +extern int accept(int s, struct sockaddr *addr, socklen_t_equiv *addrlen); #endif #ifndef HAVE_ATOF_DECL @@ -737,7 +746,7 @@ extern void bcopy(const void *s1, void *s2, size_t n); #endif #ifndef HAVE_BIND_DECL -extern int bind(int s, const struct sockaddr *name, socklen_t namelen); +extern int bind(int s, const struct sockaddr *name, socklen_t_equiv namelen); #endif #ifndef HAVE_BZERO @@ -753,7 +762,7 @@ extern void closelog(void); #endif #ifndef HAVE_CONNECT_DECL -extern int connect(int s, struct sockaddr *name, socklen_t namelen); +extern int connect(int s, struct sockaddr *name, socklen_t_equiv namelen); #endif #ifndef HAVE_FCLOSE_DECL @@ -800,17 +809,17 @@ extern int getopt(int argc, char * const *argv, const char *optstring); /* AIX #defines getpeername, and provides a prototype for the alternate name */ #if !defined(HAVE_GETPEERNAME_DECL) && !defined(getpeername) -extern int getpeername(int s, struct sockaddr *name, socklen_t *namelen); +extern int getpeername(int s, struct sockaddr *name, socklen_t_equiv *namelen); #endif /* AIX #defines getsockname, and provides a prototype for the alternate name */ #if !defined(HAVE_GETSOCKNAME_DECL) && !defined(getsockname) -extern int getsockname(int s, struct sockaddr *name, socklen_t *namelen); +extern int getsockname(int s, struct sockaddr *name, socklen_t_equiv *namelen); #endif #ifndef HAVE_GETSOCKOPT_DECL extern int getsockopt(int s, int level, int optname, char *optval, - socklen_t *optlen); + socklen_t_equiv *optlen); #endif #ifndef HAVE_INITGROUPS @@ -898,7 +907,7 @@ extern void *realloc(void *ptr, size_t size); /* AIX #defines recvfrom, and provides a prototype for the alternate name */ #if !defined(HAVE_RECVFROM_DECL) && !defined(recvfrom) extern int recvfrom(int s, char *buf, int len, int flags, - struct sockaddr *from, socklen_t *fromlen); + struct sockaddr *from, socklen_t_equiv *fromlen); #endif #ifndef HAVE_REMOVE_DECL