Cosmetic improvements for change_listen_mode(). Printed messages now

look better, and epoll_add() is not called before exit() in the failure
case.
This commit is contained in:
Nicholas J. Kain
2011-06-11 05:03:33 -04:00
parent 25ee07db95
commit 13862b488c

View File

@ -1,5 +1,5 @@
/* packet.c - send and react to DHCP message packets /* packet.c - send and react to DHCP message packets
* Time-stamp: <2011-06-11 04:26:22 njk> * Time-stamp: <2011-06-11 05:02:18 njk>
* *
* (c) 2004-2011 Nicholas J. Kain <njkain at gmail dot com> * (c) 2004-2011 Nicholas J. Kain <njkain at gmail dot com>
* (c) 2001 Russ Dill <Russ.Dill@asu.edu> * (c) 2001 Russ Dill <Russ.Dill@asu.edu>
@ -205,32 +205,34 @@ int kernel_packet(struct dhcpMessage *payload, uint32_t source_ip,
return result; return result;
} }
/* Switch listen socket between raw (if-bound), kernel (ip-bound), and none */ // Switch listen socket between raw (if-bound), kernel (ip-bound), and none
void change_listen_mode(struct client_state_t *cs, int new_mode) void change_listen_mode(struct client_state_t *cs, int new_mode)
{ {
log_line("entering %s listen mode",
new_mode ? (new_mode == 1 ? "kernel" : "raw") : "none");
cs->listenMode = new_mode; cs->listenMode = new_mode;
if (cs->listenFd >= 0) { if (cs->listenFd >= 0) {
epoll_del(cs, cs->listenFd); epoll_del(cs, cs->listenFd);
close(cs->listenFd); close(cs->listenFd);
cs->listenFd = -1; cs->listenFd = -1;
} }
if (new_mode == LM_KERNEL) { switch (new_mode) {
case LM_NONE:
log_line("Stopped listening for DHCP packets.");
return;
case LM_RAW:
cs->listenFd = raw_socket(client_config.ifindex);
break;
case LM_KERNEL:
cs->listenFd = listen_socket(INADDR_ANY, DHCP_CLIENT_PORT, cs->listenFd = listen_socket(INADDR_ANY, DHCP_CLIENT_PORT,
client_config.interface); client_config.interface);
epoll_add(cs, cs->listenFd); break;
} }
else if (new_mode == LM_RAW) {
cs->listenFd = raw_socket(client_config.ifindex);
epoll_add(cs, cs->listenFd);
}
else /* LM_NONE */
return;
if (cs->listenFd < 0) { if (cs->listenFd < 0) {
log_error("FATAL: couldn't listen on socket: %s.", strerror(errno)); log_error("FATAL: couldn't listen on socket: %s.", strerror(errno));
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
epoll_add(cs, cs->listenFd);
log_line("Listening for DHCP packets using a %s socket.",
new_mode == LM_RAW ? "raw" : "cooked");
} }
static void init_selecting_packet(struct client_state_t *cs, static void init_selecting_packet(struct client_state_t *cs,