chiark
/
gitweb
/
~ian
/
secnet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Provide text2iaddr.
[secnet.git]
/
udp.c
diff --git
a/udp.c
b/udp.c
index 90f8e9a36602b7cc6ff3fb72e7d7852e4e6f14ed..b2ab85008213b06d2752667751befc3f411273a7 100644
(file)
--- a/
udp.c
+++ b/
udp.c
@@
-203,22
+203,19
@@
static bool_t udp_sendmsg(void *commst, struct buffer_if *buf,
return True;
}
return True;
}
-static void udp_
phase_hook(void *sst, uint32_t new_phase
)
+static void udp_
make_socket(struct udp *st, struct udp *us
)
{
{
- struct udp *st=sst;
- union iaddr addr;
-
- st->fd=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
- if (st->fd<0) {
+ const union iaddr *addr=&us->addr;
+ us->fd=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ if (us->fd<0) {
fatal_perror("udp (%s:%d): socket",st->loc.file,st->loc.line);
}
fatal_perror("udp (%s:%d): socket",st->loc.file,st->loc.line);
}
- if (fcntl(
st->fd, F_SETFL, fcntl(st
->fd, F_GETFL)|O_NONBLOCK)==-1) {
+ if (fcntl(
us->fd, F_SETFL, fcntl(us
->fd, F_GETFL)|O_NONBLOCK)==-1) {
fatal_perror("udp (%s:%d): fcntl(set O_NONBLOCK)",
st->loc.file,st->loc.line);
}
fatal_perror("udp (%s:%d): fcntl(set O_NONBLOCK)",
st->loc.file,st->loc.line);
}
- setcloexec(
st
->fd);
+ setcloexec(
us
->fd);
- addr=st->addr;
if (st->authbind) {
pid_t c;
int status;
if (st->authbind) {
pid_t c;
int status;
@@
-231,10
+228,10
@@
static void udp_phase_hook(void *sst, uint32_t new_phase)
}
if (c==0) {
char *argv[4], addrstr[9], portstr[5];
}
if (c==0) {
char *argv[4], addrstr[9], portstr[5];
- switch (addr
.
sa.sa_family) {
+ switch (addr
->
sa.sa_family) {
case AF_INET:
case AF_INET:
- sprintf(addrstr,"%08lX",(long)addr
.
sin.sin_addr.s_addr);
- sprintf(portstr,"%04X",addr
.
sin.sin_port);
+ sprintf(addrstr,"%08lX",(long)addr
->
sin.sin_addr.s_addr);
+ sprintf(portstr,"%04X",addr
->
sin.sin_port);
break;
default:
fatal("udp (%s:%d): unsupported address family for authbind",
break;
default:
fatal("udp (%s:%d): unsupported address family for authbind",
@@
-244,7
+241,7
@@
static void udp_phase_hook(void *sst, uint32_t new_phase)
argv[1]=addrstr;
argv[2]=portstr;
argv[3]=NULL;
argv[1]=addrstr;
argv[2]=portstr;
argv[3]=NULL;
- dup2(
st
->fd,0);
+ dup2(
us
->fd,0);
execvp(st->authbind,argv);
_exit(255);
}
execvp(st->authbind,argv);
_exit(255);
}
@@
-261,11
+258,16
@@
static void udp_phase_hook(void *sst, uint32_t new_phase)
st->loc.line, WEXITSTATUS(status));
}
} else {
st->loc.line, WEXITSTATUS(status));
}
} else {
- if (bind(
st->fd, (struct sockaddr *)&addr, sizeof
(addr))!=0) {
+ if (bind(
us->fd, &addr->sa, iaddr_socklen
(addr))!=0) {
fatal_perror("udp (%s:%d): bind",st->loc.file,st->loc.line);
}
}
fatal_perror("udp (%s:%d): bind",st->loc.file,st->loc.line);
}
}
+}
+static void udp_phase_hook(void *sst, uint32_t new_phase)
+{
+ struct udp *st=sst;
+ udp_make_socket(st,st);
register_for_poll(st,udp_beforepoll,udp_afterpoll,1,"udp");
}
register_for_poll(st,udp_beforepoll,udp_afterpoll,1,"udp");
}