Lines 110-116
Link Here
|
110 |
int sent_null; |
110 |
int sent_null; |
111 |
int no_delay; |
111 |
int no_delay; |
112 |
|
112 |
|
113 |
void doit(struct sockaddr *); |
113 |
void doit(struct sockaddr *, struct sockaddr *); |
114 |
static void rshd_errx(int, const char *, ...) __printf0like(2, 3); |
114 |
static void rshd_errx(int, const char *, ...) __printf0like(2, 3); |
115 |
void getstr(char *, int, const char *); |
115 |
void getstr(char *, int, const char *); |
116 |
int local_domain(char *); |
116 |
int local_domain(char *); |
Lines 128-135
Link Here
|
128 |
extern int __check_rhosts_file; |
128 |
extern int __check_rhosts_file; |
129 |
struct linger linger; |
129 |
struct linger linger; |
130 |
socklen_t fromlen; |
130 |
socklen_t fromlen; |
|
|
131 |
socklen_t locallen; |
131 |
int ch, on = 1; |
132 |
int ch, on = 1; |
132 |
struct sockaddr_storage from; |
133 |
struct sockaddr_storage from; |
|
|
134 |
struct sockaddr_storage local; |
133 |
|
135 |
|
134 |
openlog("rshd", LOG_PID | LOG_ODELAY, LOG_DAEMON); |
136 |
openlog("rshd", LOG_PID | LOG_ODELAY, LOG_DAEMON); |
135 |
|
137 |
|
Lines 165-170
Link Here
|
165 |
syslog(LOG_ERR, "getpeername: %m"); |
167 |
syslog(LOG_ERR, "getpeername: %m"); |
166 |
exit(1); |
168 |
exit(1); |
167 |
} |
169 |
} |
|
|
170 |
if (getsockname(0, (struct sockaddr *)&local, &locallen) < 0) { |
171 |
syslog(LOG_ERR, "getsockname: %m"); |
172 |
exit(1); |
173 |
} |
168 |
if (keepalive && |
174 |
if (keepalive && |
169 |
setsockopt(0, SOL_SOCKET, SO_KEEPALIVE, (char *)&on, |
175 |
setsockopt(0, SOL_SOCKET, SO_KEEPALIVE, (char *)&on, |
170 |
sizeof(on)) < 0) |
176 |
sizeof(on)) < 0) |
Lines 177-183
Link Here
|
177 |
if (no_delay && |
183 |
if (no_delay && |
178 |
setsockopt(0, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)) < 0) |
184 |
setsockopt(0, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)) < 0) |
179 |
syslog(LOG_WARNING, "setsockopt (TCP_NODELAY): %m"); |
185 |
syslog(LOG_WARNING, "setsockopt (TCP_NODELAY): %m"); |
180 |
doit((struct sockaddr *)&from); |
186 |
doit((struct sockaddr *)&from, (struct sockaddr *)&local); |
181 |
/* NOTREACHED */ |
187 |
/* NOTREACHED */ |
182 |
return(0); |
188 |
return(0); |
183 |
} |
189 |
} |
Lines 185-191
Link Here
|
185 |
extern char **environ; |
191 |
extern char **environ; |
186 |
|
192 |
|
187 |
void |
193 |
void |
188 |
doit(struct sockaddr *fromp) |
194 |
doit(struct sockaddr *fromp, struct sockaddr *localp) |
189 |
{ |
195 |
{ |
190 |
extern char *__rcmd_errstr; /* syslog hook from libc/net/rcmd.c. */ |
196 |
extern char *__rcmd_errstr; /* syslog hook from libc/net/rcmd.c. */ |
191 |
struct passwd *pwd; |
197 |
struct passwd *pwd; |
Lines 278-284
Link Here
|
278 |
(void) alarm(0); |
284 |
(void) alarm(0); |
279 |
if (port != 0) { |
285 |
if (port != 0) { |
280 |
int lport = IPPORT_RESERVED - 1; |
286 |
int lport = IPPORT_RESERVED - 1; |
281 |
s = rresvport_af(&lport, af); |
287 |
s = rresvport_af_addr(&lport, af, localp); |
282 |
if (s < 0) { |
288 |
if (s < 0) { |
283 |
syslog(LOG_ERR, "can't get stderr port: %m"); |
289 |
syslog(LOG_ERR, "can't get stderr port: %m"); |
284 |
exit(1); |
290 |
exit(1); |