[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
connect() question (solaris vs obsd (vs linux))
- To: misc@openbsd.org
- Subject: connect() question (solaris vs obsd (vs linux))
- From: Tor Houghton <torh@bogus.net>
- Date: Wed, 29 Sep 1999 16:53:31 +0200 (CEST)
Hi.
I have the following code (well, excerpt from), taken from "bindinfo.c" by
jdrake@pulsar.net.
I modified the code slightly, so as to allow UID 0 users to send UDP
packets with src port 53.
The code excerpt is as follows.
-- begin excerpt --
printf("This code is executing as root, assuming source port 53.\n");
if((sd = socket(AF_INET,SOCK_DGRAM,0)) == -1) {
perror("Unable to create socket()");
return;
}
gethostname(localhost, 128);
printf("localhost: %s\n", localhost);
if ((hp = gethostbyname(localhost)) == NULL) {
perror("Couldn't resolve localhost");
return;
}
sa.sin_port=53;
if(bind(sd,(struct sockaddr *)&sa,sizeof(sa)) == -1) {
perror("Unable to bind()");
if(sd != -1) {close(sd);}
return;
}
if(connect(sd,(struct sockaddr *)&ra,sizeof(ra)) == -1) {
perror("Unable to connect()");
if(sd != -1) {close(sd);}
return;
}
-- end excerpt --
Basically, the change is that I use bind() to change the source address. I
know I should perhaps use raw sockets, or libnet, but I didn't want to
change the code too much.
The odd thing is this.
On Solaris, this code compiles cleanly, and behaves exactly as I want to.
On OpenBSD, the code compiles cleanly, but still uses random source port.
On Linux, the code compiles cleanly, but I get the error
Unable to connect(): Invalid argument
Can anyone shine a light on this? Or perhaps, where should I read about
it? I need to make it run on OpenBSD (preferrably) or Linux.
Regards,
Tor Houghton.