conditional getsockopt

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@1189 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Assar Westerlund
1997-01-26 19:34:04 +00:00
parent 4cbc2ad669
commit 7a4e4936b1
8 changed files with 62 additions and 47 deletions

View File

@@ -115,7 +115,7 @@ hookup(char *host, int port)
code = -1; code = -1;
goto bad; goto bad;
} }
#ifdef IP_TOS #if defined(IP_TOS) && defined(SETSOCKOPT)
tos = IPTOS_LOWDELAY; tos = IPTOS_LOWDELAY;
if (setsockopt(s, IPPROTO_IP, IP_TOS, (char *)&tos, sizeof(int)) < 0) if (setsockopt(s, IPPROTO_IP, IP_TOS, (char *)&tos, sizeof(int)) < 0)
warn("setsockopt TOS (ignored)"); warn("setsockopt TOS (ignored)");
@@ -141,7 +141,7 @@ hookup(char *host, int port)
code = -1; code = -1;
goto bad; goto bad;
} }
#ifdef SO_OOBINLINE #if defined(SO_OOBINLINE) && defined(HAVE_SETSOCKOPT)
{ {
int on = 1; int on = 1;
@@ -572,7 +572,7 @@ copy_stream(FILE *from, FILE *to)
static void static void
set_buffer_size(int fd, int read) set_buffer_size(int fd, int read)
{ {
#if defined(SO_RCVBUF) && defined(SO_SNDBUF) #if defined(SO_RCVBUF) && defined(SO_SNDBUF) && defined(HAVE_SETSOCKOPT)
size_t size = 1048576; size_t size = 1048576;
while(size >= 131072 && while(size >= 131072 &&
setsockopt(fd, SOL_SOCKET, read ? SO_RCVBUF : SO_SNDBUF, setsockopt(fd, SOL_SOCKET, read ? SO_RCVBUF : SO_SNDBUF,
@@ -1132,10 +1132,12 @@ initconn(void)
perror("ftp: socket"); perror("ftp: socket");
return(1); return(1);
} }
#if defined(SO_DEBUG) && defined(HAVE_SETSOCKOPT)
if ((options & SO_DEBUG) && if ((options & SO_DEBUG) &&
setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on, setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on,
sizeof (on)) < 0) sizeof (on)) < 0)
perror("ftp: setsockopt (ignored)"); perror("ftp: setsockopt (ignored)");
#endif
if (command("PASV") != COMPLETE) { if (command("PASV") != COMPLETE) {
printf("Passive mode refused.\n"); printf("Passive mode refused.\n");
goto bad; goto bad;
@@ -1174,7 +1176,7 @@ initconn(void)
perror("ftp: connect"); perror("ftp: connect");
goto bad; goto bad;
} }
#ifdef IP_TOS #if defined(IP_TOS) && defined(HAVE_SETSOCKOPT)
on = IPTOS_THROUGHPUT; on = IPTOS_THROUGHPUT;
if (setsockopt(data, IPPROTO_IP, IP_TOS, (char *)&on, if (setsockopt(data, IPPROTO_IP, IP_TOS, (char *)&on,
sizeof(int)) < 0) sizeof(int)) < 0)
@@ -1196,18 +1198,22 @@ noport:
sendport = 1; sendport = 1;
return (1); return (1);
} }
#if defined(SO_REUSEADDR) && defined(HAVE_SETSOCKOPT)
if (!sendport) if (!sendport)
if (setsockopt(data, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof (on)) < 0) { if (setsockopt(data, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof (on)) < 0) {
warn("setsockopt (reuse address)"); warn("setsockopt (reuse address)");
goto bad; goto bad;
} }
#endif
if (bind(data, (struct sockaddr *)&data_addr, sizeof (data_addr)) < 0) { if (bind(data, (struct sockaddr *)&data_addr, sizeof (data_addr)) < 0) {
warn("bind"); warn("bind");
goto bad; goto bad;
} }
#if defined(SO_DEBUG) && defined(HAVE_SETSOCKOPT)
if (options & SO_DEBUG && if (options & SO_DEBUG &&
setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on, sizeof (on)) < 0) setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on, sizeof (on)) < 0)
warn("setsockopt (ignored)"); warn("setsockopt (ignored)");
#endif
len = sizeof (data_addr); len = sizeof (data_addr);
if (getsockname(data, (struct sockaddr *)&data_addr, &len) < 0) { if (getsockname(data, (struct sockaddr *)&data_addr, &len) < 0) {
warn("getsockname"); warn("getsockname");
@@ -1234,7 +1240,7 @@ noport:
} }
if (tmpno) if (tmpno)
sendport = 1; sendport = 1;
#ifdef IP_TOS #if defined(IP_TOS) && defined(HAVE_SETSOCKOPT)
on = IPTOS_THROUGHPUT; on = IPTOS_THROUGHPUT;
if (setsockopt(data, IPPROTO_IP, IP_TOS, (char *)&on, sizeof(int)) < 0) if (setsockopt(data, IPPROTO_IP, IP_TOS, (char *)&on, sizeof(int)) < 0)
warn("setsockopt TOS (ignored)"); warn("setsockopt TOS (ignored)");
@@ -1264,7 +1270,7 @@ dataconn(char *lmode)
} }
close(data); close(data);
data = s; data = s;
#ifdef IP_TOS #if defined(IP_TOS) && defined(HAVE_SETSOCKOPT)
tos = IPTOS_THROUGHPUT; tos = IPTOS_THROUGHPUT;
if (setsockopt(s, IPPROTO_IP, IP_TOS, (char *)&tos, sizeof(int)) < 0) if (setsockopt(s, IPPROTO_IP, IP_TOS, (char *)&tos, sizeof(int)) < 0)
warn("setsockopt TOS (ignored)"); warn("setsockopt TOS (ignored)");

View File

@@ -43,18 +43,21 @@ RCSID("$Id$");
/* /*
* FTP server. * FTP server.
*/ */
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_SYS_PARAM_H #ifdef HAVE_SYS_PARAM_H
#include <sys/param.h> #include <sys/param.h>
#endif #endif
#ifdef HAVE_SYS_STAT_H #ifdef HAVE_SYS_STAT_H
#include <sys/stat.h> #include <sys/stat.h>
#endif #endif
#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
#endif
#ifdef HAVE_SYS_SOCKET_H #ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> #include <sys/socket.h>
#endif #endif
#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
#endif
#ifdef HAVE_SYS_TIME_H #ifdef HAVE_SYS_TIME_H
#include <sys/time.h> #include <sys/time.h>
#endif #endif
@@ -308,15 +311,15 @@ main(int argc, char **argv)
auth_level = parse_auth_level(optarg); auth_level = parse_auth_level(optarg);
break; break;
case 'd': case 'd':
debug = 1; debug = 1;
break; break;
case 'i': case 'i':
not_inetd = 1; not_inetd = 1;
break; break;
case 'l': case 'l':
logging++; /* > 1 == extra logging */ logging++; /* > 1 == extra logging */
break; break;
case 'p': case 'p':
sp = getservbyname(optarg, "tcp"); sp = getservbyname(optarg, "tcp");
@@ -330,16 +333,16 @@ main(int argc, char **argv)
break; break;
case 't': case 't':
ftpd_timeout = atoi(optarg); ftpd_timeout = atoi(optarg);
if (maxtimeout < ftpd_timeout) if (maxtimeout < ftpd_timeout)
maxtimeout = ftpd_timeout; maxtimeout = ftpd_timeout;
break; break;
case 'T': case 'T':
maxtimeout = atoi(optarg); maxtimeout = atoi(optarg);
if (ftpd_timeout > maxtimeout) if (ftpd_timeout > maxtimeout)
ftpd_timeout = maxtimeout; ftpd_timeout = maxtimeout;
break; break;
case 'u': case 'u':
{ {
@@ -347,19 +350,19 @@ main(int argc, char **argv)
val = strtol(optarg, &optarg, 8); val = strtol(optarg, &optarg, 8);
if (*optarg != '\0' || val < 0) if (*optarg != '\0' || val < 0)
warnx("bad value for -u"); warnx("bad value for -u");
else else
defumask = val; defumask = val;
break; break;
} }
case 'v': case 'v':
debug = 1; debug = 1;
break; break;
default: default:
warnx("unknown flag -%c ignored", argv[optind-1][0]); warnx("unknown flag -%c ignored", argv[optind-1][0]);
break; break;
} }
} }
@@ -382,7 +385,7 @@ main(int argc, char **argv)
syslog(LOG_ERR, "getsockname (%s): %m",argv[0]); syslog(LOG_ERR, "getsockname (%s): %m",argv[0]);
exit(1); exit(1);
} }
#ifdef IP_TOS #if defined(IP_TOS) && defined(HAVE_SETSOCKOPT)
tos = IPTOS_LOWDELAY; tos = IPTOS_LOWDELAY;
if (setsockopt(0, IPPROTO_IP, IP_TOS, (void *)&tos, sizeof(int)) < 0) if (setsockopt(0, IPPROTO_IP, IP_TOS, (void *)&tos, sizeof(int)) < 0)
syslog(LOG_WARNING, "setsockopt (IP_TOS): %m"); syslog(LOG_WARNING, "setsockopt (IP_TOS): %m");
@@ -403,7 +406,7 @@ main(int argc, char **argv)
auth_init(); auth_init();
/* Try to handle urgent data inline */ /* Try to handle urgent data inline */
#ifdef SO_OOBINLINE #if defined(SO_OOBINLINE) && defined(HAVE_SETSOCKOPT)
if (setsockopt(0, SOL_SOCKET, SO_OOBINLINE, (void *)&on, if (setsockopt(0, SOL_SOCKET, SO_OOBINLINE, (void *)&on,
sizeof(on)) < 0) sizeof(on)) < 0)
syslog(LOG_ERR, "setsockopt: %m"); syslog(LOG_ERR, "setsockopt: %m");
@@ -785,9 +788,9 @@ pass(char *passwd)
memset (passwd, 0, strlen(passwd)); memset (passwd, 0, strlen(passwd));
/* /*
* If rval == 1, the user failed the authentication check * If rval == 1, the user failed the authentication
* above. If rval == 0, either Kerberos or local authentication * check above. If rval == 0, either Kerberos or
* succeeded. * local authentication succeeded.
*/ */
if (rval) { if (rval) {
reply(530, "Login incorrect."); reply(530, "Login incorrect.");
@@ -815,7 +818,7 @@ pass(char *passwd)
static void static void
set_buffer_size(int fd, int read) set_buffer_size(int fd, int read)
{ {
#if defined(SO_RCVBUF) && defined(SO_SNDBUF) #if defined(SO_RCVBUF) && defined(SO_SNDBUF) && defined(HAVE_SETSOCKOPT)
size_t size = 1048576; size_t size = 1048576;
while(size >= 131072 && while(size >= 131072 &&
setsockopt(fd, SOL_SOCKET, read ? SO_RCVBUF : SO_SNDBUF, setsockopt(fd, SOL_SOCKET, read ? SO_RCVBUF : SO_SNDBUF,
@@ -1052,9 +1055,11 @@ getdatasock(char *mode)
s = socket(AF_INET, SOCK_STREAM, 0); s = socket(AF_INET, SOCK_STREAM, 0);
if (s < 0) if (s < 0)
goto bad; goto bad;
#if defined(SO_REUSEADDR) && defined(HAVE_SETSOCKOPT)
if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR,
(void *) &on, sizeof(on)) < 0) (void *) &on, sizeof(on)) < 0)
goto bad; goto bad;
#endif
/* anchor socket to avoid multi-homing problems */ /* anchor socket to avoid multi-homing problems */
data_source.sin_family = AF_INET; data_source.sin_family = AF_INET;
data_source.sin_addr = ctrl_addr.sin_addr; data_source.sin_addr = ctrl_addr.sin_addr;
@@ -1067,7 +1072,7 @@ getdatasock(char *mode)
sleep(tries); sleep(tries);
} }
seteuid((uid_t)pw->pw_uid); seteuid((uid_t)pw->pw_uid);
#ifdef IP_TOS #if defined(IP_TOS) && defined(HAVE_SETSOCKOPT)
on = IPTOS_THROUGHPUT; on = IPTOS_THROUGHPUT;
if (setsockopt(s, IPPROTO_IP, IP_TOS, (void *)&on, sizeof(int)) < 0) if (setsockopt(s, IPPROTO_IP, IP_TOS, (void *)&on, sizeof(int)) < 0)
syslog(LOG_WARNING, "setsockopt (IP_TOS): %m"); syslog(LOG_WARNING, "setsockopt (IP_TOS): %m");
@@ -1108,7 +1113,7 @@ dataconn(char *name, off_t size, char *mode)
} }
close(pdata); close(pdata);
pdata = s; pdata = s;
#ifdef IP_TOS #if defined(IP_TOS) && defined(HAVE_SETSOCKOPT)
tos = IPTOS_THROUGHPUT; tos = IPTOS_THROUGHPUT;
setsockopt(s, IPPROTO_IP, IP_TOS, (void *)&tos, setsockopt(s, IPPROTO_IP, IP_TOS, (void *)&tos,
sizeof(int)); sizeof(int));
@@ -1808,7 +1813,6 @@ send_file_list(char *whichf)
int simple = 0; int simple = 0;
int freeglob = 0; int freeglob = 0;
glob_t gl; glob_t gl;
char buf[MaxPathLen]; char buf[MaxPathLen];
if (strpbrk(whichf, "~{[*?") != NULL) { if (strpbrk(whichf, "~{[*?") != NULL) {

View File

@@ -183,7 +183,7 @@ get_xsockets (int *unix_socket, int *tcp_socket)
close (unixfd); close (unixfd);
return -1; return -1;
} }
#ifdef TCP_NODELAY #if defined(TCP_NODELAY) && defined(HAVE_SETSOCKOPT)
setsockopt (tcpfd, IPPROTO_TCP, TCP_NODELAY, (void *)&one, setsockopt (tcpfd, IPPROTO_TCP, TCP_NODELAY, (void *)&one,
sizeof(one)); sizeof(one));
#endif #endif
@@ -326,6 +326,9 @@ suspicious_address (int sock, struct sockaddr_in addr)
int len = sizeof(data); int len = sizeof(data);
return addr.sin_addr.s_addr != htonl(INADDR_LOOPBACK) return addr.sin_addr.s_addr != htonl(INADDR_LOOPBACK)
#if defined(IP_OPTIONS) && defined(HAVE_GETSOCKOPT)
|| getsockopt (sock, IPPROTO_IP, IP_OPTIONS, data, &len) < 0 || getsockopt (sock, IPPROTO_IP, IP_OPTIONS, data, &len) < 0
|| len != 0; || len != 0
#endif
;
} }

View File

@@ -138,7 +138,7 @@ connect_host (char *host, char *user, des_cblock *key,
return -1; return -1;
} }
#ifdef TCP_NODELAY #if defined(TCP_NODELAY) && defined(HAVE_SETSOCKOPT)
setsockopt (s, IPPROTO_TCP, TCP_NODELAY, (void *)&one, sizeof(one)); setsockopt (s, IPPROTO_TCP, TCP_NODELAY, (void *)&one, sizeof(one));
#endif #endif
@@ -164,7 +164,7 @@ connect_host (char *host, char *user, des_cblock *key,
status = krb_sendauth (KOPT_DO_MUTUAL, s, &text, "rcmd", status = krb_sendauth (KOPT_DO_MUTUAL, s, &text, "rcmd",
host, krb_realmofhost (host), host, krb_realmofhost (host),
getpid(), &msg, &cred, schedule, getpid(), &msg, &cred, schedule,
&thisaddr, &thataddr, KXVERSION); &thisaddr, &thataddr, KX_VERSION);
if (status != KSUCCESS) { if (status != KSUCCESS) {
fprintf (stderr, "%s: %s: %s\n", prog, host, fprintf (stderr, "%s: %s: %s\n", prog, host,
krb_get_err_text(status)); krb_get_err_text(status));
@@ -435,7 +435,7 @@ doit (char *host, char *user, int passivep, int debugp, int tcpp)
strerror(errno)); strerror(errno));
return 1; return 1;
} }
#ifdef TCP_NODELAY #if defined(TCP_NODELAY) && defined(HAVE_SETSOCKOPT)
setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (void *)&one, sizeof(one)); setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (void *)&one, sizeof(one));
#endif #endif
++nchild; ++nchild;

View File

@@ -110,7 +110,7 @@ recv_conn (int sock, des_cblock *key, des_key_schedule schedule,
&thataddr, &thisaddr, &auth, "", schedule, &thataddr, &thisaddr, &auth, "", schedule,
version); version);
if (status != KSUCCESS || if (status != KSUCCESS ||
strncmp(version, KXVERSION, KRB_SENDAUTH_VLEN) != 0) { strncmp(version, KX_VERSION, KRB_SENDAUTH_VLEN) != 0) {
return 1; return 1;
} }
if (krb_net_read (sock, user, sizeof(user)) != sizeof(user)) if (krb_net_read (sock, user, sizeof(user)) != sizeof(user))
@@ -187,7 +187,7 @@ doit_conn (int fd, struct sockaddr_in *thataddr,
sprintf (msg, "socket: %s", strerror(errno)); sprintf (msg, "socket: %s", strerror(errno));
return fatal (sock, msg); return fatal (sock, msg);
} }
#ifdef TCP_NODELAY #if defined(TCP_NODELAY) && defined(HAVE_SETSOCKOPT)
setsockopt (sock, IPPROTO_TCP, TCP_NODELAY, (void *)&one, sizeof(one)); setsockopt (sock, IPPROTO_TCP, TCP_NODELAY, (void *)&one, sizeof(one));
#endif #endif
if (connect (sock, (struct sockaddr *)thataddr, if (connect (sock, (struct sockaddr *)thataddr,
@@ -291,7 +291,7 @@ doit(int sock, int tcpp)
sprintf (msg, "accept: %s\n", strerror (errno)); sprintf (msg, "accept: %s\n", strerror (errno));
return fatal (sock, msg); return fatal (sock, msg);
} }
#ifdef TCP_NODELAY #if defined(TCP_NODELAY) && defined(HAVE_SETSOCKOPT)
setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (void *)&one, setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (void *)&one,
sizeof(one)); sizeof(one));
#endif #endif

View File

@@ -2295,7 +2295,7 @@ tn(int argc, char **argv)
perror("telnet: socket"); perror("telnet: socket");
return 0; return 0;
} }
#if defined(IP_OPTIONS) && defined(IPPROTO_IP) #if defined(IP_OPTIONS) && defined(IPPROTO_IP) && defined(HAVE_SETSOCKOPT)
if (srp && setsockopt(net, IPPROTO_IP, IP_OPTIONS, (void *)srp, if (srp && setsockopt(net, IPPROTO_IP, IP_OPTIONS, (void *)srp,
srlen) < 0) srlen) < 0)
perror("setsockopt (IP_OPTIONS)"); perror("setsockopt (IP_OPTIONS)");

View File

@@ -459,7 +459,7 @@ int main(int argc, char **argv)
syslog(LOG_WARNING, "setsockopt (SO_KEEPALIVE): %m"); syslog(LOG_WARNING, "setsockopt (SO_KEEPALIVE): %m");
} }
#if defined(IPPROTO_IP) && defined(IP_TOS) #if defined(IPPROTO_IP) && defined(IP_TOS) && defined(HAVE_SETSOCKOPT)
{ {
# if defined(HAS_GETTOS) # if defined(HAS_GETTOS)
struct tosent *tp; struct tosent *tp;
@@ -979,7 +979,7 @@ telnet(f, p)
ioctl(f, FIONBIO, (char *)&on); ioctl(f, FIONBIO, (char *)&on);
ioctl(p, FIONBIO, (char *)&on); ioctl(p, FIONBIO, (char *)&on);
#if defined(SO_OOBINLINE) #if defined(SO_OOBINLINE) && defined(HAVE_SETSOCKOPT)
setsockopt(net, SOL_SOCKET, SO_OOBINLINE, setsockopt(net, SOL_SOCKET, SO_OOBINLINE,
(void *)&on, sizeof on); (void *)&on, sizeof on);
#endif /* defined(SO_OOBINLINE) */ #endif /* defined(SO_OOBINLINE) */

View File

@@ -67,11 +67,13 @@ mini_inetd (int port)
perror("socket"); perror("socket");
exit(1); exit(1);
} }
#if defined(SO_REUSEADDR) && defined(HAVE_SETSOCKOPT)
if(setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void *)&one, if(setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void *)&one,
sizeof(one)) < 0){ sizeof(one)) < 0){
perror("setsockopt"); perror("setsockopt");
exit(1); exit(1);
} }
#endif
memset(&sa, 0, sizeof(sa)); memset(&sa, 0, sizeof(sa));
sa.sin_family = AF_INET; sa.sin_family = AF_INET;
sa.sin_port = port; sa.sin_port = port;