* sendcommand.c: added
authorArt Cancro <ajc@citadel.org>
Tue, 1 Dec 1998 00:49:22 +0000 (00:49 +0000)
committerArt Cancro <ajc@citadel.org>
Tue, 1 Dec 1998 00:49:22 +0000 (00:49 +0000)
citadel/ChangeLog
citadel/Makefile.in
citadel/TODO
citadel/sendcommand.c [new file with mode: 0644]
citadel/serv_chat.c

index 2167fc00bd7c74183162f7bd5f44269fc7f4a91b..725d6b6ae4c1c1c6c8b87b179cee04c737103e56 100644 (file)
@@ -1,7 +1,10 @@
+Mon Nov 30 19:48:52 EST 1998 Art Cancro <ajc@uncnsrd.mt-kisco.ny.us>
+       * room_ops.c: added sort_msglist() to move and save operations
+       * sendcommand.c: added
+
 Sun Nov 29 23:57:39 EST 1998 Art Cancro <ajc@uncnsrd.mt-kisco.ny.us>
        * Fixed cmd_regi() to not display a second result code after xfer
        * Makefile.in: Removed "chmod 4755 citmail netmailer"
-       * room_ops.c: added sort_msglist() to move and save operations
 
 1998-11-23 Nathan Bryant <bryant@cs.usm.maine.edu>
        * citadel.spec: added
index 3af7846a26d00655b7f9968eb35fcb5f2cc457a3..3158d004be49c36c337505db32dabe374b734852 100644 (file)
@@ -21,7 +21,7 @@ SERVER_TARGETS=citserver setup
 SERV_MODULES=modules/serv_chat.so modules/serv_test.so \
        modules/serv_upgrade.so modules/serv_expire.so
 UTIL_TARGETS=aidepost netmailer netproc netsetup msgform \
-       readlog rcit stats citmail netpoll mailinglist userlist
+       readlog rcit stats citmail netpoll mailinglist userlist sendcommand
 PROXY_TARGETS=proxy
 
 prefix=@prefix@
@@ -55,7 +55,7 @@ SOURCES=aidepost.c citadel.c citmail.c citserver.c client_chat.c commands.c \
        room_ops.c rooms.c routines.c routines2.c serv_chat.c \
        serv_info.c serv_test.c serv_upgrade.c setup.c snprintf.c stats.c \
        support.c sysdep.c tools.c user_ops.c userlist.c serv_expire.c \
-       whobbs.c
+       whobbs.c sendcommand.c
 
 DEP_FILES=$(SOURCES:.c=.d)
 
@@ -153,6 +153,10 @@ proxy: proxy.o ipc_c_tcp.o
 whobbs: whobbs.o ipc_c_tcp.o tools.o $(SNPRINTF)
        $(CC) whobbs.o ipc_c_tcp.o tools.o $(SNPRINTF) $(LDFLAGS) -o whobbs
 
+sendcommand: sendcommand.o ipc_c_tcp.o tools.o $(SNPRINTF)
+       $(CC) sendcommand.o ipc_c_tcp.o tools.o $(SNPRINTF) $(LDFLAGS) \
+       -o sendcommand
+
 userlist: userlist.o ipc_c_tcp.o tools.o $(SNPRINTF)
        $(CC) userlist.o ipc_c_tcp.o tools.o \
        $(SNPRINTF) $(LDFLAGS) -o userlist
index 91fbcf98e7684bb1583e8cae650ccbf1c67ac1b4..de10d9f74b963302af0ad26a5893f6be404b8280 100644 (file)
@@ -1,7 +1,6 @@
 Citadel/UX v5.50 showstoppers list
 ----------------------------------
 * Figure out a way to auto-launch expire functions (and other functions)
-* Re-establish the sorting of msglists in target room when messages move
 
 Other things that might be nice to take care of:
 ------------------------------------------------
diff --git a/citadel/sendcommand.c b/citadel/sendcommand.c
new file mode 100644 (file)
index 0000000..6658bc7
--- /dev/null
@@ -0,0 +1,156 @@
+/*
+ * $Id$
+ */
+
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <string.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <time.h>
+#include <signal.h>
+#include <errno.h>
+#include <limits.h>
+#include "citadel.h"
+#include "tools.h"
+#include "ipc.h"
+#include "config.h"
+
+#define LOCKFILE "/var/lock/LCK.sendcommand"
+
+struct config config;
+extern int home_specified;
+
+
+/*
+ * make sure only one copy of sendcommand runs at a time, using lock files
+ */
+int set_lockfile(void) {
+       FILE *lfp;
+       int onppid;
+
+       if ((lfp = fopen(LOCKFILE,"r")) != NULL) {
+                fscanf(lfp,"%d",&onppid);
+                fclose(lfp);
+               if (!kill(onppid, 0) || errno == EPERM) return 1;
+               }
+
+       lfp=fopen(LOCKFILE,"w");
+       fprintf(lfp,"%d\n",getpid());
+       fclose(lfp);
+       return(0);
+       }
+
+void remove_lockfile(void) {
+       unlink(LOCKFILE);
+       }
+
+/*
+ * Why both cleanup() and nq_cleanup() ?  Notice the alarm() call in
+ * cleanup() .  If for some reason sendcommand hangs waiting for the server
+ * to clean up, the alarm clock goes off and the program exits anyway.
+ * The cleanup() routine makes a check to ensure it's not reentering, in
+ * case the ipc module looped it somehow.
+ */
+void nq_cleanup(int e)
+{
+       remove_lockfile();
+       exit(e);
+       }
+
+void cleanup(int e)
+{
+       static int nested = 0;
+
+       alarm(30);
+       signal(SIGALRM,nq_cleanup);
+       if (nested++ < 1) serv_puts("QUIT");
+       nq_cleanup(e);
+       }
+
+/*
+ * This is implemented as a function rather than as a macro because the
+ * client-side IPC modules expect logoff() to be defined.  They call logoff()
+ * when a problem connecting or staying connected to the server occurs.
+ */
+void logoff(int e)
+{
+       cleanup(e);
+       }
+
+/*
+ * Connect sendcommand to the Citadel server running on this computer.
+ */
+void np_attach_to_server(void) {
+       char buf[256];
+       char portname[8];
+       char *args[] = { "sendcommand", "localhost", NULL, NULL } ;
+
+       fprintf(stderr, "Attaching to server...\n");
+       sprintf(portname, "%d", config.c_port_number);
+       args[2] = portname;
+       attach_to_server(3, args);
+       serv_gets(buf);
+       fprintf(stderr, "%s\n",&buf[4]);
+       sprintf(buf,"IPGM %d", config.c_ipgm_secret);
+       serv_puts(buf);
+       serv_gets(buf);
+       fprintf(stderr, "%s\n",&buf[4]);
+       if (buf[0]!='2') {
+               cleanup(2);
+               }
+       }
+
+
+
+/*
+ * main
+ */
+int main(int argc, char **argv)
+{
+       int a;
+       char cmd[256];
+       char buf[256];
+
+       strcpy(bbs_home_directory, BBSDIR);
+
+       strcpy(cmd, "");
+       /*
+        * Change directories if specified
+        */
+       for (a=1; a<argc; ++a) {
+               if (!strncmp(argv[a], "-h", 2)) {
+                       strcpy(bbs_home_directory, argv[a]);
+                       strcpy(bbs_home_directory, &bbs_home_directory[2]);
+                       home_specified = 1;
+                       }
+               else {
+                       strcat(cmd, argv[a]);
+                       }
+               }
+
+       get_config();
+
+       signal(SIGINT,cleanup);
+       signal(SIGQUIT,cleanup);
+       signal(SIGHUP,cleanup);
+       signal(SIGTERM,cleanup);
+
+       fprintf(stderr, "sendcommand: started.  pid=%d\n",getpid());
+       fflush(stderr);
+       np_attach_to_server();
+       fflush(stderr);
+
+       fprintf(stderr, "%s\n", cmd);
+       serv_puts(cmd);
+       serv_gets(buf);
+       fprintf(stderr, "%s\n", buf);
+
+       fprintf(stderr, "sendcommand: processing ended.\n");
+       cleanup(0);
+       return 0;
+       }
index 8325d768207122d86183a4e0cf75f983f578d386..1e8dd93e39abffadcf13267e9339a4daf17fc7fe 100644 (file)
@@ -397,7 +397,7 @@ void cmd_sexp(char *argbuf)
        struct ExpressMessage *emptr, *emnew;
        char *lun;              /* <bc> */
 
-       if (!(CC->logged_in)) {
+       if ((!(CC->logged_in))&&(!(CC->internal_pgm))) {
                cprintf("%d Not logged in.\n",ERROR+NOT_LOGGED_IN);
                return;
                }