X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fsendcommand.c;h=bd87ff3b48cf3be2f5c251cfb3afd5ddb0a17e3e;hb=HEAD;hp=9960af66737475023a219b11a0095f69dcf2fbad;hpb=4d2ba3513d914336f68942ec89117941c081af9d;p=citadel.git diff --git a/citadel/sendcommand.c b/citadel/sendcommand.c deleted file mode 100644 index 9960af667..000000000 --- a/citadel/sendcommand.c +++ /dev/null @@ -1,196 +0,0 @@ -/* - * $Id$ - * - * Command-line utility to transmit a server command. - * - */ - - -#include -#include -#include -#include -#include -#include -#include -#include - -#if TIME_WITH_SYS_TIME -# include -# include -#else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif -#endif - -#include -#include -#include -#include "citadel.h" -#include "tools.h" -#include "citadel_ipc.h" -#include "server.h" -#include "serv_extensions.h" -#include "config.h" - -#define LOCKFILE "/tmp/LCK.sendcommand" - -static CtdlIPC *ipc = NULL; - -/* - * 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, "%ld\n", (long) 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) - CtdlIPCQuit(ipc); - 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 hostbuf[SIZ], portbuf[SIZ]; - char buf[SIZ]; - char *args[] = - {"sendcommand", NULL}; - int r; - - fprintf(stderr, "Attaching to server...\n"); - ipc = CtdlIPC_new(1, args, hostbuf, portbuf); - CtdlIPC_getline(ipc, buf); - fprintf(stderr, "%s\n", &buf[4]); - snprintf(buf, sizeof buf, "IPGM %d", config.c_ipgm_secret); - r = CtdlIPCInternalProgram(ipc, config.c_ipgm_secret, buf); - fprintf(stderr, "%s\n", buf); - if (r / 100 != 2) { - cleanup(2); - } -} - - - -/* - * main - */ -int main(int argc, char **argv) -{ - int a; - char cmd[SIZ]; - char buf[SIZ]; - - 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 { - if (strlen(cmd) > 0) - strcat(cmd, " "); - strcat(cmd, argv[a]); - } - } - - get_config(); - - signal(SIGINT, cleanup); - signal(SIGQUIT, cleanup); - signal(SIGHUP, cleanup); - signal(SIGTERM, cleanup); - - fprintf(stderr, "sendcommand: started (pid=%d) " - "running in %s\n", - (int) getpid(), - bbs_home_directory); - fflush(stderr); - np_attach_to_server(); - fflush(stderr); - - fprintf(stderr, "%s\n", cmd); - CtdlIPC_putline(ipc, cmd); - CtdlIPC_getline(ipc, buf); - fprintf(stderr, "%s\n", buf); - - if (buf[0] == '1') { - while (CtdlIPC_getline(ipc, buf), strcmp(buf, "000")) { - printf("%s\n", buf); - } - } else if (buf[0] == '4') { - do { - if (fgets(buf, sizeof buf, stdin) == NULL) - strcpy(buf, "000"); - if (strlen(buf) > 0) - if (buf[strlen(buf) - 1] == '\n') - buf[strlen(buf) - 1] = 0; - if (strlen(buf) > 0) - if (buf[strlen(buf) - 1] == '\r') - buf[strlen(buf) - 1] = 0; - if (strcmp(buf, "000")) - CtdlIPC_putline(ipc, buf); - } while (strcmp(buf, "000")); - CtdlIPC_putline(ipc, "000"); - } - fprintf(stderr, "sendcommand: processing ended.\n"); - cleanup(0); - return 0; -}