Commit Diff


commit - 940f7cb79743357f8ba073c8d63c3681ed468bd2
commit + 5bb19f244b8811038d2b38f286f874ea5776820e
blob - e58dc10e82e04522b731ca41ee0724ed0f3c4697
blob + 11c17f35315108a4c914693933cfc8807a451264
--- log.c
+++ log.c
@@ -222,27 +222,38 @@ open_twind_logs(void)
 }
 
 void
-user_log(int target, const char *fmt, ...)
+log_access(const struct client_connection *cc, const char *fmt, ...)
 {
-	char buffer[MAXLOGLINE];
-	va_list ap;
+	struct tm tm;
+	time_t t;
 
-	memset(buffer, 0, MAXLOGLINE);
+	t = time(NULL);
+	tm = *localtime(&t);
 
+	user_log(0, "%s - - [%d/%d/%d:%d:%d:%d %s] %s", cc->client_addr,
+			tm.tm_mday, tm.tm_mon, tm.tm_year+1900,
+			tm.tm_hour, tm.tm_min, tm.tm_sec,
+			tm.tm_zone, fmt);
+}
 
+void
+user_log(int target, const char *fmt, ...)
+{
+	va_list ap;
+	int fd = -1;
+
 	va_start(ap, fmt);
-	snprintf(buffer, MAXLOGLINE, fmt, ap);
-	switch(target) {
-		case 0:
-			vdprintf(access_fd, fmt, ap);
-			dprintf(access_fd, "\n");
-			break;
-		case 1:
-			vdprintf(error_fd, fmt, ap);
-			dprintf(error_fd, "\n");
-			break;
-		default:
-			log_warn("Non-existent user log target");
+	if (target == 0)
+		fd = access_fd;
+	else if (target == 1)
+		fd = error_fd;
+	else {
+		log_warn("Non-existent user log target");
+		return;
 	}
+
+	vdprintf(fd, fmt, ap);
+	dprintf(fd, "\n");
+
 	va_end(ap);
 }
blob - 3ca04f696d7d58f1ffe9601d9823930f8e087773
blob + bbc7eb10d27ca9dc184312943c2f42a998334b68
--- twind.c
+++ twind.c
@@ -227,9 +227,9 @@ handle_incoming_connections(int counter, int tcpsock, 
 	struct sockaddr_storage addr;
 	struct sockaddr_in clientaddr;
 	struct sockaddr_in6 clientaddr6;
+	struct client_connection *cc;
 	char str[INET6_ADDRSTRLEN];
 	pthread_t thread_id;
-	SSL *ssl_peer;
 	socklen_t len = sizeof(addr);
 	int ret, ssl_err;
 
@@ -244,50 +244,57 @@ handle_incoming_connections(int counter, int tcpsock, 
 		if (ret < 0)
 			fatalx("Error when accepting connection");
 
+		if ((cc = calloc(1, sizeof(struct client_connection))) == NULL)
+				fatalx("Cannot allocate memory for client structure");
+
 		getpeername(ret, (struct sockaddr *)&clientaddr, &len);
 		if (clientaddr.sin_family == AF_INET) {
-			if (inet_ntop(AF_INET, &clientaddr.sin_addr, str, sizeof(str)))
+			if (inet_ntop(AF_INET, &clientaddr.sin_addr, cc->client_addr, sizeof(str)))
 				log_info("Connection from %s on Port %d",
-					str, ntohs(clientaddr.sin_port));
+					cc->client_addr, ntohs(clientaddr.sin_port));
 		} else if (clientaddr.sin_family == AF_INET6) {
 			getpeername(ret, (struct sockaddr *)&clientaddr6, &len);
-			if (inet_ntop(AF_INET6, &clientaddr6.sin6_addr, str, sizeof(str)))
+			if (inet_ntop(AF_INET6, &clientaddr6.sin6_addr, cc->client_addr, sizeof(str)))
 				log_info("Connection from %s on Port %d",
-					str, ntohs(clientaddr6.sin6_port));
+					cc->client_addr, ntohs(clientaddr6.sin6_port));
 		}
 
-		if ((ssl_peer = SSL_new(sslctx)) == NULL) {
+		if ((cc->ssl_peer = SSL_new(sslctx)) == NULL) {
 			log_warn("Creating new TLS structure failed");
+			free(cc);
 			close(ret);
 			continue;
 		}
 
-		if (SSL_set_fd(ssl_peer, ret) == 0) {
+		if (SSL_set_fd(cc->ssl_peer, ret) == 0) {
 			log_warn("TLS cannot set file descriptor");
-			SSL_free(ssl_peer);
+			SSL_free(cc->ssl_peer);
+			free(cc);
 			close(ret);
 			continue;
 		}
 
-		ssl_err = SSL_accept(ssl_peer);
+		ssl_err = SSL_accept(cc->ssl_peer);
 		if (ssl_err < 0) {
 			ERR_print_errors_fp(stderr);
 			log_warn("Fatal TLS error. Cannot accept TLS connection");
-			SSL_shutdown(ssl_peer);
-			SSL_free(ssl_peer);
+			SSL_shutdown(cc->ssl_peer);
+			SSL_free(cc->ssl_peer);
+			free(cc);
 			close(ret);
 			continue;
 		} else if (ssl_err == 0) {
 			log_warn("TLS handshake not successful");
-			SSL_shutdown(ssl_peer);
-			SSL_free(ssl_peer);
+			SSL_shutdown(cc->ssl_peer);
+			SSL_free(cc->ssl_peer);
+			free(cc);
 			close(ret);
 			continue;
 		}
 
-		log_debug("SSL connection using %s\n", SSL_get_cipher (ssl_peer));
+		log_debug("SSL connection using %s\n", SSL_get_cipher(cc->ssl_peer));
 
-		if (pthread_create(&thread_id, NULL, main_request_handler, ((void*)ssl_peer))
+		if (pthread_create(&thread_id, NULL, main_request_handler, ((void*)cc))
 			!= 0) {
 			log_warn("Cannot create handling thread");
 			return -1;
@@ -295,8 +302,9 @@ handle_incoming_connections(int counter, int tcpsock, 
 
 		pthread_join(thread_id, NULL);
 
-		SSL_shutdown(ssl_peer);
-		SSL_free(ssl_peer);
+		SSL_shutdown(cc->ssl_peer);
+		SSL_free(cc->ssl_peer);
+		free(cc);
 		close(ret);
 	}
 
@@ -329,7 +337,7 @@ fork_main_process(int tcpsock[2], SSL_CTX *sslctx)
 void *
 main_request_handler(void *argp)
 {
-	SSL *ssl_peer = (SSL*)argp;
+	struct client_connection *cc = (struct client_connection *)argp;
 	char finalpath[MAXREQLEN];
 	char temp[MAXREQLEN];
 	char request[MAXREQLEN];
@@ -341,14 +349,14 @@ main_request_handler(void *argp)
 	memset(request, 0, sizeof(request));
 	memset(temp, 0, sizeof(temp));
 
-	receive_gemini_request(ssl_peer, request);
+	receive_gemini_request(cc->ssl_peer, request);
 
 	ret = get_path_from_request(request, finalpath);
 	if (ret == -1) { /* Malformed request */
-		send_non_success_response(ssl_peer, STATUS_BAD_REQUEST);
+		send_non_success_response(cc->ssl_peer, STATUS_BAD_REQUEST);
 		return NULL;
 	} else if (ret == -2) { /* 404 */
-		send_non_success_response(ssl_peer, STATUS_NOT_FOUND);
+		send_non_success_response(cc->ssl_peer, STATUS_NOT_FOUND);
 		return NULL;
 	}
 
@@ -359,9 +367,10 @@ main_request_handler(void *argp)
 			log_debug("Cannot get MIME type for %s", ext);
 	}
 
-	user_log(0, "Request for %s", finalpath);
+	//user_log(0, "%s", finalpath);
+	log_access(cc, finalpath);
 
-	if (send_response(ssl_peer, STATUS_SUCCESS, finalpath, mime) < 0) {
+	if (send_response(cc->ssl_peer, STATUS_SUCCESS, finalpath, mime) < 0) {
 		log_warn("Sending response to client failed");
 		return NULL;
 	}
blob - 02ba8c54aa665df12147f2d2bd588f5f7ce04ddd
blob + d6a186e30830edb922fdb1e4787859b34daedff0
--- twind.h
+++ twind.h
@@ -29,27 +29,6 @@
 int access_fd;
 int error_fd;
 
-/* gemini.c */
-int check_gemini_file(const char *);
-int send_response(SSL*, int, const char *, const char *);
-int send_non_success_response(SSL*, int);
-
-/* request.c */
-int get_path_from_request(char *, char *);
-
-/* mime.c */
-char* get_file_extension(const char*);
-char* get_mime_type(const char *);
-
-/* util.c */
-void* xmalloc(size_t);
-char* xstrdup(const char *);
-size_t strlcpy(char *, const char *, size_t);
-
-/* log.c */
-void open_twind_logs(void);
-void user_log(int, const char *, ...);
-
 enum status_codes {
 	STATUS_INPUT = 10,
 	STATUS_SENSITIVE_INPUT = 11,
@@ -75,4 +54,27 @@ struct client_connection {
 	SSL *ssl_peer;
 	char client_addr[INET6_ADDRSTRLEN];
 };
+
+/* gemini.c */
+int check_gemini_file(const char *);
+int send_response(SSL*, int, const char *, const char *);
+int send_non_success_response(SSL*, int);
+
+/* request.c */
+int get_path_from_request(char *, char *);
+
+/* mime.c */
+char* get_file_extension(const char*);
+char* get_mime_type(const char *);
+
+/* util.c */
+void* xmalloc(size_t);
+char* xstrdup(const char *);
+size_t strlcpy(char *, const char *, size_t);
+
+/* log.c */
+void open_twind_logs(void);
+void log_access(const struct client_connection *, const char *, ...);
+void user_log(int, const char *, ...);
+
 #endif