diff --git a/tftp.c b/tftp.c index bac02bc..01d96f8 100644 --- a/tftp.c +++ b/tftp.c @@ -331,6 +331,11 @@ int tftp_put(struct nmrpd_args *args) bool rollover; const unsigned rx_timeout = MAX(args->rx_timeout / (args->blind ? 50 : 5), 2000); const unsigned max_timeouts = args->blind ? 3 : 5; +#ifndef NMRPFLASH_WINDOWS + int enabled = 1; +#else + BOOL enabled = TRUE; +#endif sock = -1; ret = -1; @@ -361,27 +366,34 @@ int tftp_put(struct nmrpd_args *args) } #ifndef NMRPFLASH_FUZZ_TFTP - sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { sock_perror("socket"); - ret = sock; goto cleanup; } + + if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &enabled, sizeof(enabled)) != 0) { + sock_perror("setsockopt"); + goto cleanup; + } + #else sock = STDIN_FILENO; #endif memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; + // check if we have an interface address, and bind to it if we do if (args->ipaddr_intf) { + addr.sin_addr.s_addr = inet_addr(args->ipaddr_intf); if ((addr.sin_addr.s_addr = inet_addr(args->ipaddr_intf)) == INADDR_NONE) { xperror("inet_addr"); goto cleanup; } if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) != 0) { + printf("errno=%d\n", errno); sock_perror("bind"); goto cleanup; }