about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorRen Kararou <[email protected]>2025-01-02 01:16:59 -0600
committerRen Kararou <[email protected]>2025-01-02 01:16:59 -0600
commit70a46fab050c3fdf38b9c72453f6e678cc8341be (patch)
tree0959c8943e8babcf6c9880fe05113965f66b4105
parent527a766b7e6852f0582097b7ecfa42761d0948c1 (diff)
downloadnbtpd-70a46fab050c3fdf38b9c72453f6e678cc8341be.tar.gz
nbtpd-70a46fab050c3fdf38b9c72453f6e678cc8341be.tar.bz2
nbtpd-70a46fab050c3fdf38b9c72453f6e678cc8341be.zip
strerror; socket timeout; more handlers
-rw-r--r--src/handlers.c12
-rw-r--r--src/main.c25
2 files changed, 18 insertions, 19 deletions
diff --git a/src/handlers.c b/src/handlers.c
index 9aea176..7c2b768 100644
--- a/src/handlers.c
+++ b/src/handlers.c
@@ -93,9 +93,17 @@ void *read_req_resp(void *args) {
 		return nbd_nbtpd_resp_error(args);
 	}
 	memset(buf, '\0', 512);
-
+	int s = socket(AF_INET, SOCK_DGRAM, 0);
+	if (s <= 0) {
+		syslog(LOG_ERR, "unable to define socket!");
+		fclose(fp);
+		free(buf);
+		free(args);
+		return (void *)NULL;
+	}
+	
 	//TODO: make new socket and go into main loop
-
+	fclose(fp);
 	free(buf);
 	free(args);
 	return (void *)NULL;
diff --git a/src/main.c b/src/main.c
index 0264050..302f6bf 100644
--- a/src/main.c
+++ b/src/main.c
@@ -10,6 +10,7 @@
 #include <netdb.h>
 #include <pthread.h>
 #include <sys/types.h>
+#include <sys/time.h>
 #include <pwd.h>
 #include <grp.h>
 #include <errno.h>
@@ -112,25 +113,19 @@ int main(int argc, char **argv) {
 		syslog(LOG_ERR, "unable to bind socket!");
 		return -1;
 	}
+	struct timeval timeout = { 1, 0 };
+	if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)) < 0) {
+		syslog(LOG_ERR, "unable to set socket timeout: %s", strerror(errno));
+		close(s);
+		return -1;
+	}
 	struct sockaddr_in saddr;
 	saddr.sin_family = AF_INET;
 	saddr.sin_port = htons(port);
 	saddr.sin_addr.s_addr = inet_addr(addr);
 
 	if (bind(s, (struct sockaddr*)&saddr, sizeof(saddr)) < 0) {
-		switch (errno) {
-			case EACCES:
-				syslog(LOG_ERR, "socket bind failed: permission denied");
-				break;
-			case EADDRINUSE:
-				syslog(LOG_ERR, "socket bind failed: address already in use");
-				break;
-			case EADDRNOTAVAIL:
-				syslog(LOG_ERR, "socket bind failed: address not available");
-				break;
-			default:
-				syslog(LOG_ERR, "socket bind failed");
-		}
+		syslog(LOG_ERR, "socket bind failed: %s", strerror(errno));
 		return -1;
 	}
 	syslog(LOG_INFO, "socket bind success");
@@ -164,10 +159,6 @@ int main(int argc, char **argv) {
 		ssize_t recvd_bytes = 0;
 		if ((recvd_bytes = recvfrom(s, buf, 1024, 0, 
 				(struct sockaddr *)&caddr, &clen)) < 0) {
-			syslog(
-				LOG_ERR,
-				"got a client connection, but unable to receive data!"
-			);
 			continue;
 		}
 		if (recvd_bytes < 4) {