X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fsendcommand.c;h=bd87ff3b48cf3be2f5c251cfb3afd5ddb0a17e3e;hb=HEAD;hp=c7439dc0dbca681423020307810a64c8ff905f56;hpb=e149f5ad06ec69ad5dc17717ce96ea19afa7f9d8;p=citadel.git diff --git a/citadel/sendcommand.c b/citadel/sendcommand.c deleted file mode 100644 index c7439dc0d..000000000 --- a/citadel/sendcommand.c +++ /dev/null @@ -1,262 +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 "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(char *host, char *port) -{ - char buf[SIZ]; - char hostbuf[256], portbuf[256]; - char *args[] = - {"sendcommand", NULL}; - int r; - - fprintf(stderr, "Attaching to server...\n"); - strcpy(hostbuf, host); - strcpy(portbuf, port); - ipc = CtdlIPC_new(1, args, hostbuf, portbuf); - if (!ipc) { - fprintf(stderr, "Can't connect: %s\n", strerror(errno)); - exit(3); - } - CtdlIPC_chat_recv(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); - } -} - - -void sendcommand_die(void) { - exit(0); -} - - -/* - * main - */ -int main(int argc, char **argv) -{ - int a; - char cmd[SIZ]; - char buf[SIZ]; - - int relh=0; - int home=0; - char relhome[PATH_MAX]=""; - char ctdldir[PATH_MAX]=CTDLDIR; - fd_set read_fd; - struct timeval tv; - int ret, err; - - CtdlInitBase64Table(); - - strcpy(ctdl_home_directory, DEFAULT_PORT); - - strcpy(cmd, ""); - /* - * Change directories if specified - */ - for (a = 1; a < argc; ++a) { - if (!strncmp(argv[a], "-h", 2)) { - relh=argv[a][2]!='/'; - if (!relh) safestrncpy(ctdl_home_directory, &argv[a][2], - sizeof ctdl_home_directory); - else - safestrncpy(relhome, &argv[a][2], - sizeof relhome); - home_specified = 1; - home=1; - } else { - if (!IsEmptyStr(cmd)) - strcat(cmd, " "); - strcat(cmd, argv[a]); - } - } - - calc_dirs_n_files(relh, home, relhome, ctdldir); - 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(), - ctdl_home_directory); - fflush(stderr); - - alarm(5); - signal(SIGALRM, nq_cleanup); /* Set up a watchdog type timer in case we hang */ - - np_attach_to_server(UDS, ctdl_home_directory); - fflush(stderr); - setIPCDeathHook(sendcommand_die); - - fprintf(stderr, "%s\n", cmd); - CtdlIPC_chat_send(ipc, cmd); - CtdlIPC_chat_recv(ipc, buf); - fprintf(stderr, "%s\n", buf); - - tv.tv_sec = 0; - tv.tv_usec = 1000; - - if (buf[0] == '1') { - while (CtdlIPC_chat_recv(ipc, buf), strcmp(buf, "000")) { - printf("%s\n", buf); - alarm(5); /* Kick the watchdog timer */ - } - } else if (buf[0] == '4') { - do { - if (fgets(buf, sizeof buf, stdin) == NULL) - strcpy(buf, "000"); - if (!IsEmptyStr(buf)) - if (buf[strlen(buf) - 1] == '\n') - buf[strlen(buf) - 1] = 0; - if (!IsEmptyStr(buf)) - if (buf[strlen(buf) - 1] == '\r') - buf[strlen(buf) - 1] = 0; - if (strcmp(buf, "000")) - CtdlIPC_chat_send(ipc, buf); - - FD_ZERO(&read_fd); - FD_SET(ipc->sock, &read_fd); - ret = select(ipc->sock+1, &read_fd, NULL, NULL, &tv); - err = errno; - if (err!=0) - printf("select failed: %d", err); - - if (ret == -1) { - if (!(errno == EINTR || errno == EAGAIN)) - printf("select failed: %d", err); - return 1; - } - - if (ret != 0) { - size_t n; - char rbuf[SIZ]; - - rbuf[0] = '\0'; - n = read(ipc->sock, rbuf, SIZ); - if (n>0) { - rbuf[n]='\0'; - fprintf (stderr, rbuf); - fflush (stdout); - } - } - alarm(5); /* Kick the watchdog timer */ - } while (strcmp(buf, "000")); - CtdlIPC_chat_send(ipc, "\n"); - CtdlIPC_chat_send(ipc, "000"); - } - alarm(0); /* Shutdown the watchdog timer */ - fprintf(stderr, "sendcommand: processing ended.\n"); - if (strcasecmp(cmd, "DOWN")) - cleanup(0); - else /* If we downed the server we can't to do CtdlIPCQuit in cleanup()*/ - nq_cleanup(0); - return 0; -}