static void addr_set_port(nsm_address *, int);
static struct addrinfo *host_lookup(int, const char *);
void nsm_log(int fac, const char *fmt, ...);
-static int record_pid();
+static int record_pid(void);
static void drop_privs(void);
static void set_kernel_nsm_state(int state);
nsm_address local_addr;
time_t failtime = 0;
int sock = -1;
+ int retry_cnt = 0;
+ retry:
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
perror("socket");
exit(1);
}
} else {
- (void) bindresvport(sock, (struct sockaddr_in *) &local_addr);
+ struct servent *se;
+ struct sockaddr_in *sin = (struct sockaddr_in *)&local_addr;
+ (void) bindresvport(sock, sin);
+ /* try to avoid known ports */
+ se = getservbyport(sin->sin_port, "udp");
+ if (se && retry_cnt < 100) {
+ retry_cnt++;
+ close(sock);
+ goto retry;
+ }
}
if (opt_max_retry)
* program exits.
* If file already exists, fail.
*/
-static int record_pid()
+static int record_pid(void)
{
char pid[20];
int fd;