summaryrefslogtreecommitdiffstats
path: root/libexec/rexecd
diff options
context:
space:
mode:
authorume <ume@FreeBSD.org>2002-04-16 10:15:30 +0000
committerume <ume@FreeBSD.org>2002-04-16 10:15:30 +0000
commit7027bf8c9b80d6f5e8dabd7e0a3f22162712c4e4 (patch)
treef3a88f6fe2119955e01338ced1c6a42be3157359 /libexec/rexecd
parent577209724fe9324abea6f29a06d371bf1d658430 (diff)
downloadFreeBSD-src-7027bf8c9b80d6f5e8dabd7e0a3f22162712c4e4.zip
FreeBSD-src-7027bf8c9b80d6f5e8dabd7e0a3f22162712c4e4.tar.gz
Add an IPv6 support.
I dunno if there is an IPv6 supported rexec client. So, it was tested that this change doesn't break an IPv4. Tested by: kuriyama (IPv4 only)
Diffstat (limited to 'libexec/rexecd')
-rw-r--r--libexec/rexecd/rexecd.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/libexec/rexecd/rexecd.c b/libexec/rexecd/rexecd.c
index dea2479..1d61041 100644
--- a/libexec/rexecd/rexecd.c
+++ b/libexec/rexecd/rexecd.c
@@ -75,9 +75,9 @@ char *envinit[] =
char **environ;
char remote[MAXHOSTNAMELEN];
-struct sockaddr_in asin = { AF_INET };
+struct sockaddr_storage asin;
-void doit(int, struct sockaddr_in *);
+void doit(int, struct sockaddr *);
void getstr(char *, int, char *);
void error(const char *fmt, ...);
@@ -101,7 +101,7 @@ usage(void)
int
main(int argc, char *argv[])
{
- struct sockaddr_in from;
+ struct sockaddr_storage from;
int fromlen;
int ch;
@@ -122,14 +122,15 @@ main(int argc, char *argv[])
if (getpeername(0, (struct sockaddr *)&from, &fromlen) < 0)
err(1, "getpeername");
- realhostname(remote, sizeof(remote) - 1, &from.sin_addr);
+ realhostname_sa(remote, sizeof(remote) - 1,
+ (struct sockaddr *)&from, fromlen);
- doit(0, &from);
+ doit(0, (struct sockaddr *)&from);
return(0);
}
void
-doit(int f, struct sockaddr_in *fromp)
+doit(int f, struct sockaddr *fromp)
{
FILE *fp;
char cmdbuf[NCARGS+1], *cp;
@@ -174,14 +175,26 @@ doit(int f, struct sockaddr_in *fromp)
}
(void) alarm(0);
if (port != 0) {
- s = socket(AF_INET, SOCK_STREAM, 0);
+ s = socket(fromp->sa_family, SOCK_STREAM, 0);
if (s < 0)
exit(1);
- if (bind(s, (struct sockaddr *)&asin, sizeof (asin)) < 0)
+ bzero(&asin, sizeof(asin));
+ asin.ss_family = fromp->sa_family;
+ asin.ss_len = fromp->sa_len;
+ if (bind(s, (struct sockaddr *)&asin, asin.ss_len) < 0)
exit(1);
(void) alarm(60);
- fromp->sin_port = htons(port);
- if (connect(s, (struct sockaddr *)fromp, sizeof (*fromp)) < 0)
+ switch (fromp->sa_family) {
+ case AF_INET:
+ ((struct sockaddr_in *)fromp)->sin_port = htons(port);
+ break;
+ case AF_INET6:
+ ((struct sockaddr_in6 *)fromp)->sin6_port = htons(port);
+ break;
+ default:
+ exit(1);
+ }
+ if (connect(s, fromp, fromp->sa_len) < 0)
exit(1);
(void) alarm(0);
}
OpenPOWER on IntegriCloud