int enable_syslog = 0;
-/*
- * CtdlLogPrintf() ... Write logging information;
- * simple here to have the same
- * symbols in the client.
- */
-
-void CtdlLogPrintf(enum LogLevel loglevel, const char *format, ...) {
- va_list arg_ptr;
-
- va_start(arg_ptr, format);
- vfprintf(stderr, format, arg_ptr);
- va_end(arg_ptr);
- fflush(stderr);
-}
-
/*
* here is our 'clean up gracefully and exit' routine
*/
switch(room->RRdefaultview) {
case VIEW_BBS:
case VIEW_MAILBOX:
+ case VIEW_BLOG:
entmsg_ok = 1;
break;
default:
int r; /* IPC response code */
scr_printf("Forgetting all rooms on %s...\n", &floorlist[ffloor][0]);
- scr_flush();
remove_march("_FLOOR_", ffloor);
r = CtdlIPCKnownRooms(ipc, AllAccessibleRooms, ffloor, &flist, buf);
if (r / 100 != 1) {
/*
- * Record compare function for SortOnlineUsers()
+ * Session username compare function for SortOnlineUsers()
+ */
+int rwho_username_cmp(const void *rec1, const void *rec2) {
+ char *u1, *u2;
+
+ u1 = strchr(rec1, '|');
+ u2 = strchr(rec2, '|');
+
+ return strcasecmp( (u1?++u1:"") , (u2?++u2:"") );
+}
+
+
+/*
+ * Idle time compare function for SortOnlineUsers()
*/
int idlecmp(const void *rec1, const void *rec2) {
time_t i1, i2;
* Sort the list of online users by idle time.
* This function frees the supplied buffer, and returns a new one
* to the caller. The caller is responsible for freeing the returned buffer.
+ *
+ * If 'condense' is nonzero, multiple sessions for the same user will be
+ * combined into one for brevity.
*/
-char *SortOnlineUsers(char *listing) {
+char *SortOnlineUsers(char *listing, int condense) {
int rows;
char *sortbuf;
char *retbuf;
memcpy(&sortbuf[i*SIZ], buf, (size_t)SIZ);
}
- /* Do the sort */
+ /* Sort by idle time */
qsort(sortbuf, rows, SIZ, idlecmp);
+ /* Combine multiple sessions for the same user */
+ if (condense) {
+ qsort(sortbuf, rows, SIZ, rwho_username_cmp);
+ if (rows > 1) for (i=1; i<rows; ++i) if (i>0) {
+ char u1[USERNAME_SIZE];
+ char u2[USERNAME_SIZE];
+ extract_token(u1, &sortbuf[(i-1)*SIZ], 1, '|', sizeof u1);
+ extract_token(u2, &sortbuf[i*SIZ], 1, '|', sizeof u2);
+ if (!strcasecmp(u1, u2)) {
+ memcpy(&sortbuf[i*SIZ], &sortbuf[(i+1)*SIZ], (rows-i-1)*SIZ);
+ --rows;
+ --i;
+ }
+ }
+
+ qsort(sortbuf, rows, SIZ, idlecmp); /* idle sort again */
+ }
+
/* Copy back to a \n delimited list */
strcpy(retbuf, "");
for (i=0; i<rows; ++i) {
- strcat(retbuf, &sortbuf[i*SIZ]);
- if (i<(rows-1)) strcat(retbuf, "\n");
+ if (!IsEmptyStr(&sortbuf[i*SIZ])) {
+ strcat(retbuf, &sortbuf[i*SIZ]);
+ if (i<(rows-1)) strcat(retbuf, "\n");
+ }
}
- free(listing);
- free(sortbuf);
+ free(listing);
+ free(sortbuf);
return(retbuf);
}
scr_printf("\n");
}
r = CtdlIPCOnlineUsers(ipc, &listing, &timenow, buf);
- listing = SortOnlineUsers(listing);
+ listing = SortOnlineUsers(listing, (!longlist));
if (r / 100 == 1) {
while (!IsEmptyStr(listing)) {
int isidle = 0;
static void statusHook(char *s) {
scr_printf(s);
- scr_flush();
}
/*
get_serv_info(ipc, telnet_client_host);
scr_printf("%-24s\n%s\n%s\n", ipc->ServInfo.software, ipc->ServInfo.humannode,
ipc->ServInfo.site_location);
- scr_flush();
screenwidth = 80; /* default screen dimensions */
screenheight = 24;
if (!IsEmptyStr(rc_password)) {
strcpy(password, rc_password);
} else {
- newprompt("\rPlease enter your password: ", password, -19);
+ newprompt("\rPlease enter your password: ", password, -(SIZ-1));
}
if (*nonce) {