- if (update) {
- state += 2;
- snprintf(newfile, sizeof(newfile),
- "%s.new", _SM_STATE_PATH);
- if ((fd = open(newfile, O_CREAT|O_WRONLY, 0644)) < 0) {
- nsm_log(LOG_WARNING, "Cannot create %s: %m", newfile);
- exit(1);
- }
- if (write(fd, &state, sizeof(state)) != sizeof(state)) {
- nsm_log(LOG_WARNING,
- "Failed to write state to %s", newfile);
- exit(1);
- }
- close(fd);
- if (rename(newfile, _SM_STATE_PATH) < 0) {
- nsm_log(LOG_WARNING,
- "Cannot create %s: %m", _SM_STATE_PATH);
- exit(1);
- }
- sync();
- }
-
- return state;
-}
-
-/*
- * Address handling utilities
- */
-static int
-addr_parse(int af, const char *name, nsm_address *addr)
-{
- void *ptr;
-
- if (af == AF_INET)
- ptr = &((struct sockaddr_in *) addr)->sin_addr;
- else if (af == AF_INET6)
- ptr = &((struct sockaddr_in6 *) addr)->sin6_addr;
- else
- return 0;
- if (inet_pton(af, name, ptr) <= 0)
- return 0;
- ((struct sockaddr *) addr)->sa_family = af;
- return 1;
-}
-
-int
-addr_get_port(nsm_address *addr)
-{
- switch (((struct sockaddr *) addr)->sa_family) {
- case AF_INET:
- return ntohs(((struct sockaddr_in *) addr)->sin_port);
- case AF_INET6:
- return ntohs(((struct sockaddr_in6 *) addr)->sin6_port);
- }
- return 0;
-}
-
-static void
-addr_set_port(nsm_address *addr, int port)
-{
- switch (((struct sockaddr *) addr)->sa_family) {
- case AF_INET:
- ((struct sockaddr_in *) addr)->sin_port = htons(port);
- break;
- case AF_INET6:
- ((struct sockaddr_in6 *) addr)->sin6_port = htons(port);
- }
-}
-
-static int
-host_lookup(int af, const char *name, nsm_address *addr)
-{
- struct addrinfo hints, *ai;
- int okay = 0;
-
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = af;
-
- if (getaddrinfo(name, NULL, &hints, &ai) != 0)