-/*
- * 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 "citadel_ipc.h"
-#include "citadel_dirs.h"
-
-void logoff(int code)
-{
- exit(code);
- }
-
-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, "<");
- tmp += 4;
- }
- else if (hold[i]=='>'){
- snprintf(&buf[tmp], n - tmp, ">");
- tmp += 4;
- }
- else if (hold[i]==34){
- snprintf(&buf[tmp], n - tmp, """);
- tmp += 6;
- }
- else{
- snprintf(&buf[tmp], n - tmp, "%c", hold[i]);
- tmp ++;
- }
- }
-}
-
-
-
-
-int main(int argc, char **argv)
-{
- char buf[512];
- char nodetitle[SIZ];
- int www = 0;
- int s_pid = 0;
- int my_pid = 0;
- 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 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);
-
- s_pid = extract_int(buf,0);
- 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) {
-
- 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);
-
- 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;
-}
-
-
-/*
- * Stub function
- */
-void stty_ctdl(int cmd) {
-}
-
-
-#ifndef HAVE_STRERROR
-/*
- * replacement strerror() for systems that don't have it
- */
-char *strerror(int e)
-{
- static char buf[32];
-
- snprintf(buf, sizeof buf, "errno = %d",e);
- return(buf);
- }
-#endif