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@
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)
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
--- /dev/null
+/*
+ * $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;
+ }