jcs
/subtext
/amendments
/430
session: Add buf canary stuff, only finalize session log if logged in
This is probably the cause of the session log getting really big...
    jcs made amendment 430 over 2 years ago
--- session.c	Sat Mar 11 13:47:20 2023
+++ session.c	Wed Mar 15 18:38:01 2023
@@ -85,6 +85,11 @@ session_create(char *node, char *via, struct node_func
 	strlcpy(session->via, via, sizeof(session->via));
 	session->last_input_at = session->established_at = Time;
 
+	session->obuf_canary = 0xffffffff;
+	session->ibuf_canary = 0xffffffff;
+	session->obuflen_canary = 0xffffffff;
+	session->ibuflen_canary = 0xffffffff;
+
 	for (n = 0; n < MAX_SESSIONS; n++) {
 		if (sessions[n] != NULL)
 			continue;
@@ -311,8 +316,8 @@ get_another_char:
 		case ACTION_WHOS_ONLINE:
 			session_who(s);
 			break;
-		case ACTION_BOARD_LIST_FIDONET:
-			board_list_fidonet_boards(s);
+		case ACTION_BOARD_LIST_FTN_AREAS:
+			board_list_ftn_areas(s);
 			break;
 		case ACTION_BOARD_SHOW_1:
 			board_show(s, 1, NULL);
@@ -425,14 +430,16 @@ session_close(struct session *session)
 		session->ending = true;
 	}
 	
-	/* finalize session log */
-	session->log.logged_off_at = Time;
+	if (session->log.logged_on_at) {
+		/* finalize session log */
+		session->log.logged_off_at = Time;
+		
+		if (bile_write(db->sessions_bile, SL_LOG_RTYPE, session->log.id,
+		  &session->log, sizeof(session->log)) != sizeof(session->log))
+			panic("bile_write of session log failed: %d",
+			  bile_error(db->sessions_bile));
+	}
 	
-	if (bile_write(db->sessions_bile, SL_LOG_RTYPE, session->log.id,
-	  &session->log, sizeof(session->log)) != sizeof(session->log))
-		panic("bile_write of session log failed: %d",
-		  bile_error(db->sessions_bile));
-	
 	/* close the node */
 	session->node_funcs->close(session);
 	
@@ -458,6 +465,19 @@ session_close(struct session *session)
 }
 
 void
+session_check_buf_canaries(struct session *session)
+{
+	if (session->obuf_canary != 0xffffffff)
+		warn("obuf canary dead");
+	if (session->ibuf_canary != 0xffffffff)
+		warn("ibuf canary dead");
+	if (session->obuflen_canary != 0xffffffff)
+		warn("obuflen canary dead");
+	if (session->ibuflen_canary != 0xffffffff)
+		warn("ibuflen canary dead");
+}
+
+void
 session_flush(struct session *session)
 {
 	if (session->ending || session->obuflen == 0)
@@ -465,6 +485,7 @@ session_flush(struct session *session)
 	
 	while (session->obuflen != 0) {
 		session->node_funcs->output(session);
+		session_check_buf_canaries(session);
 		if (session->obuflen != 0)
 			uthread_yield();
 		if (session->ending)
@@ -546,6 +567,8 @@ session_output(struct session *session, const char *st
 		len -= chunk;
 	}
 	
+	session_check_buf_canaries(session);
+	
 	return olen;
 }
 
@@ -694,7 +717,7 @@ session_get_char(struct session *session, unsigned cha
 		if (session->ibuflen == 0)
 			return 0;
 	}
-		
+	
 	session->last_input_at = Time;
 	
 	*b = session->ibuf[session->ibufoff];
@@ -707,6 +730,8 @@ session_get_char(struct session *session, unsigned cha
 		session->ibufoff++;
 	}
 	
+	session_check_buf_canaries(session);
+	
 	return 1;
 }
 
@@ -735,6 +760,7 @@ session_wait_for_chars(struct session *session, unsign
 	}
 	
 	session->last_input_at = Time;
+	session_check_buf_canaries(session);
 	return true;
 }
 
@@ -1637,16 +1663,19 @@ get_menu_option:
 }
 
 void
-session_purge_logs(short days)
+session_prune_logs(short days)
 {
 	struct bile_object *obj;
 	struct session_log log;
 	size_t n, size = 0, count = 0, delta;
 	unsigned long secs, *ids = NULL;
 	
+	if (days < 1)
+		return;
+		
 	secs = (60UL * 60UL * 24UL * (unsigned long)days);
 	
-	logger_printf("[db] Purging session logs older than %d days", days);
+	logger_printf("[db] Pruning session logs older than %d days", days);
 	
 	for (n = 0;
 	  (obj = bile_get_nth_of_type(db->sessions_bile, n, SL_LOG_RTYPE));
@@ -1663,6 +1692,8 @@ session_purge_logs(short days)
 		
 		xfree(&obj);
 	}
+	
+	uthread_yield();
 	
 	if (count) {
 		logger_printf("[db] Deleting %ld of %ld log entries", count, n);