The encoding and decoding tables for Base64 are
[citadel.git] / citadel / whobbs.c
index 189773f3ee0f7aceb1351464f0c61b8933b05e91..f4114bb55802da9686328108c23c7b765d6d2162 100644 (file)
+/*
+ * $Id$
+ * 
+ * Command-line "who is online?" utility
+ *
+ */
+
+#include "sysdep.h"
 #include <stdlib.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <string.h>
+#include <errno.h>
+#include <libcitadel.h>
 #include "citadel.h"
-#include "ipc.h"
+#include "citadel_ipc.h"
+#include "citadel_dirs.h"
 
-/*
- * num_parms()  -  discover number of parameters...
- */
-int num_parms(char *source)
+void logoff(int code)
 {
-       int a;
-       int count = 1;
-
-       for (a=0; a<strlen(source); ++a) 
-               if (source[a]=='|') ++count;
-       return(count);
+       exit(code);
        }
 
-
-/*
- * extract()  -  extract a parameter from a series of "|" separated...
- */
-void extract(char *dest, char *source, int parmnum)
-{
-       char buf[256];
-       int count = 0;
-       int n;
-
-       n = num_parms(source);
-
-       if (parmnum >= n) {
-               strcpy(dest,"");
-               return;
+static void escapize(char *buf, size_t n) {
+       char hold[512];
+       int i, len;
+       size_t tmp;
+
+       strcpy(hold, buf);
+       strcpy(buf, "");
+       tmp = 0;
+       len = strlen(hold);
+       for (i=0; i<len; ++i) {
+               if (hold[i]=='<') {
+                       snprintf(&buf[tmp], n - tmp, "&lt;");
+                       tmp += 4;
                }
-       strcpy(buf,source);
-       if ( (parmnum == 0) && (n == 1) ) {
-               strcpy(dest,buf);
-               return;
+               else if (hold[i]=='>'){
+                       snprintf(&buf[tmp], n - tmp, "&gt;");
+                       tmp += 4;
+               }
+               else if (hold[i]==34){
+                       snprintf(&buf[tmp], n - tmp, "&quot;");
+                       tmp += 6;
+               }
+               else{
+                       snprintf(&buf[tmp], n - tmp, "%c", hold[i]);
+                       tmp ++;
                }
-
-       while (count++ < parmnum) do {
-               strcpy(buf,&buf[1]);
-               } while( (strlen(buf)>0) && (buf[0]!='|') );
-       if (buf[0]=='|') strcpy(buf,&buf[1]);
-       for (count = 0; count<strlen(buf); ++count)
-               if (buf[count] == '|') buf[count] = 0;
-       strcpy(dest,buf);
        }
+}
 
-/*
- * extract_int()  -  extract an int parm w/o supplying a buffer
- */
-int extract_int(char *source, int parmnum)
-{
-       char buf[256];
-       
-       extract(buf,source,parmnum);
-       return(atoi(buf));
-       }
 
 
-void logoff(int code)
-{
-       exit(code);
-       }
 
-void main(int argc, char **argv)
+int main(int argc, char **argv)
 {
-       char buf[256];
-       char nodetitle[256];
-       int a;
+       char buf[512];
+       char nodetitle[SIZ];
+       int www = 0;
        int s_pid = 0;
        int my_pid = 0;
-       char s_user[256];
-       char s_room[256];
-       char s_host[256];
-
-       attach_to_server(argc,argv);
-       serv_gets(buf);
+       char hostbuf[SIZ];
+       char portbuf[SIZ];
+       char s_user[SIZ];
+       char s_room[SIZ];
+       char s_host[SIZ];
+       char s_client[SIZ];
+       int r;                  /* IPC response code */
+       time_t timenow;
+       char *listing = NULL;
+       CtdlIPC *ipc = NULL;
+       int relh=0;
+       int home=0;
+       char relhome[PATH_MAX]="";
+       char ctdldir[PATH_MAX]=CTDLDIR;
+
+       calc_dirs_n_files(relh, home, relhome, ctdldir, 0);
+
+       /* If this environment variable is set, we assume that the program
+        * is being called as a cgi-bin from a webserver and will output
+        * everything as HTML.
+        */     
+       if (getenv("REQUEST_METHOD") != NULL) www = 1;
+
+       ipc = CtdlIPC_new(argc, argv, hostbuf, portbuf);
+       if (!ipc) {
+               fprintf(stderr, "Server not available: %s\n", strerror(errno));
+               logoff(errno);
+       }
+       CtdlIPC_chat_recv(ipc, buf);
        if ((buf[0]!='2')&&(strncmp(buf,"551",3))) {
                fprintf(stderr,"%s: %s\n",argv[0],&buf[4]);
                logoff(atoi(buf));
                }
-       strcpy(nodetitle, "this BBS");
-       serv_puts("INFO");
-       serv_gets(buf);
-       if (buf[0]=='1') {
-               a = 0;
-               while (serv_gets(buf), strcmp(buf,"000")) {
-                       if (a==0) my_pid = atoi(buf);
-                       if (a==2) strcpy(nodetitle, buf);
-                       ++a;
-                       }
-               }
-       printf("            Users currently logged on to %s\n", nodetitle);
-       serv_puts("RWHO");
-       serv_gets(buf);
-       if (buf[0]!='1') {
-               fprintf(stderr,"%s: %s\n",argv[0],&buf[4]);
+       strcpy(nodetitle, "this Citadel site");
+       r = CtdlIPCServerInfo(ipc, buf);
+       if (r / 100 == 1) {
+               my_pid = ipc->ServInfo.pid;
+               strcpy(nodetitle, ipc->ServInfo.humannode);
+       }
+       
+       if (www) {
+               printf( "Content-type: text/html\n"
+                       "\n"
+                       "<HTML><HEAD>"
+                       "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"60\">\n"
+                       "<TITLE>");
+               printf("%s: who is online", nodetitle);
+               printf( "</TITLE></HEAD><BODY><H1>");
+       } else {
+               printf("            ");
+       }
+
+       if (www) {
+               printf("<CENTER><H1>");
+       }
+
+       printf("Users currently logged on to %s\n", nodetitle);
+
+       if (www) {
+               printf("</H1>\n");
+       }
+
+       r = CtdlIPCOnlineUsers(ipc, &listing, &timenow, buf);
+       if (r / 100 != 1) {
+               fprintf(stderr,"%s: %s\n",argv[0], buf);
                logoff(atoi(buf));
-               }
+       }
+
+       if (www) {
+               printf( "<TABLE BORDER=1 WIDTH=100%%>"
+                       "<TR><TH>Session</TH><TH>User name</TH>"
+                       "<TH>Room</TH><TH>From host</TH>"
+                       "<TH>Client software</TH></TR>\n");
+       } else {
+
+               printf( "Session         User name               "
+                       "Room                  From host\n");
+               printf( "------- ------------------------- "
+                       "------------------- ------------------------\n");
+       }
+
+
+       while (!IsEmptyStr(listing)) {
+               extract_token(buf, listing, 0, '\n', sizeof buf);
+               remove_token(listing, 0, '\n');
+
+               /* Escape some stuff if we're using www mode */
+               if (www) escapize(buf, sizeof buf);
 
-       printf("Session         User name               Room                  From host\n");
-       printf("------- ------------------------- -------------------- ------------------------\n");
-       while (serv_gets(buf), strcmp(buf,"000")) {
                s_pid = extract_int(buf,0);
-               extract(s_user,buf,1);
-               extract(s_room,buf,2);
-               extract(s_host,buf,3);
+               extract_token(s_user, buf, 1, '|', sizeof s_user);
+               extract_token(s_room, buf, 2, '|', sizeof s_room);
+               extract_token(s_host, buf, 3, '|', sizeof s_host);
+               extract_token(s_client, buf, 4, '|', sizeof s_client);
                if (s_pid != my_pid) {
-                       printf("%-7d%c%-25s %-20s %-24s\n",
-                               s_pid,
-                               ((s_pid == my_pid) ? '*' : ' '),
-                               s_user,s_room,s_host);
+
+                       if (www) printf("<TR><TD>");
+                       printf("%-7d", s_pid);
+                       printf("%c", 
+                               ((s_pid == my_pid) ? '*' : ' '));
+                       if (www) printf("</TD><TD>");
+                       printf("%-26s", s_user);
+                       if (www) printf("</TD><TD>");
+                       printf("%-19s ", s_room);
+                       if (www) printf("</TD><TD>");
+                       printf("%-24s\n", s_host);
+                       if (www) printf("</TD><TD>%s</TD></TR>\n", s_client);
                        }
                }
+       free(listing);
 
-       serv_puts("QUIT");
-       serv_gets(buf);
-       exit(0);
-       }
+       if (www) printf("</TABLE></CENTER>\n"
+                       "<FONT SIZE=-1>"
+                       "(This display will automatically refresh "
+                       "once per minute)</FONT>\n"
+                       "</BODY></HTML>\n");
+
+       r = CtdlIPCQuit(ipc);
+       return (r / 100 == 2) ? 0 : r;
+}
 
 
-#ifdef NO_STRERROR
+#ifndef HAVE_STRERROR
 /*
  * replacement strerror() for systems that don't have it
  */
@@ -131,7 +190,7 @@ char *strerror(int e)
 {
        static char buf[32];
 
-       sprintf(buf,"errno = %d",e);
+       snprintf(buf, sizeof buf, "errno = %d",e);
        return(buf);
        }
 #endif