X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Futils%2Fsendcommand.c;h=6146dbb654f7a8ae845cc9012f96dce5f84a3238;hb=4daf814a186671f0773b926fbd5bde4f27665e1f;hp=e9e5fbcd639a56dbece398927634d6418f4f0514;hpb=e94bdae14683fd1581f905365fe6eb3b94e90d21;p=citadel.git diff --git a/citadel/utils/sendcommand.c b/citadel/utils/sendcommand.c index e9e5fbcd6..6146dbb65 100644 --- a/citadel/utils/sendcommand.c +++ b/citadel/utils/sendcommand.c @@ -12,6 +12,7 @@ * GNU General Public License for more details. */ +#include #include #include #include @@ -26,7 +27,8 @@ #include #include #include "citadel.h" - +#include "include/citadel_dirs.h" +#include int serv_sock = (-1); @@ -141,33 +143,44 @@ int main(int argc, char **argv) { int a; int watchdog = 60; - char *ctdl_home_directory = CTDLDIR; char buf[SIZ]; int xfermode = 0; + int relh=0; + int home=0; + char relhome[PATH_MAX]=""; + char ctdldir[PATH_MAX]=CTDLDIR; /* Parse command line */ while ((a = getopt(argc, argv, "h:w:")) != EOF) { switch (a) { case 'h': - ctdl_home_directory = strdup(optarg); + relh=optarg[0]!='/'; + if (!relh) { + strncpy(ctdl_home_directory, optarg, sizeof ctdl_home_directory); + } else { + strncpy(relhome, optarg, sizeof relhome); + } + home = 1; break; case 'w': watchdog = atoi(optarg); + break; default: fprintf(stderr, "sendcommand: usage: sendcommand [-h server_dir] [-w watchdog_timeout]\n"); return(1); } } - fprintf(stderr, "sendcommand: started (pid=%d) connecting to Citadel server in %s\n", + calc_dirs_n_files(relh, home, relhome, ctdldir, 0); + + fprintf(stderr, "sendcommand: started (pid=%d) connecting to Citadel server at %s\n", (int) getpid(), - ctdl_home_directory + file_citadel_admin_socket ); fflush(stderr); - alarm(watchdog); - snprintf(buf, sizeof buf, "%s/citadel-admin.socket", ctdl_home_directory); - serv_sock = uds_connectsock(buf); +// alarm(watchdog); + serv_sock = uds_connectsock(file_citadel_admin_socket); serv_gets(buf); fprintf(stderr, "%s\n", buf); @@ -188,19 +201,81 @@ int main(int argc, char **argv) xfermode = buf[0]; if ((xfermode == '4') || (xfermode == '8')) { /* send text */ - while (fgets(buf, sizeof buf, stdin)) { - buf[strlen(buf)-1] = 0; - serv_puts(buf); + IOBuffer IOB; + FDIOBuffer FDIO; + const char *ErrStr; + + memset(&IOB, 0, sizeof(0)); + IOB.Buf = NewStrBufPlain(NULL, SIZ); + IOB.fd = serv_sock; + FDIOBufferInit(&FDIO, &IOB, fileno(stdin), -1); + + while (FileSendChunked(&FDIO, &ErrStr)); alarm(watchdog); /* reset the watchdog timer */ - } + FDIOBufferDelete(&FDIO); + FreeStrBuf(&IOB.Buf); serv_puts("000"); } if ((xfermode == '1') || (xfermode == '8')) { /* receive text */ - while (serv_gets(buf), strcmp(buf, "000")) { - printf("%s\n", buf); - alarm(watchdog); /* reset the watchdog timer */ + IOBuffer IOB; + StrBuf *Line, *OutBuf; + int Finished = 0; + + memset(&IOB, 0, sizeof(IOB)); + IOB.Buf = NewStrBufPlain(NULL, SIZ); + IOB.fd = serv_sock; + Line = NewStrBufPlain(NULL, SIZ); + OutBuf = NewStrBufPlain(NULL, SIZ * 10); + + while (!Finished && (StrBuf_read_one_chunk_callback (serv_sock, 0, &IOB) >= 0)) + { + eReadState State; + + State = eReadSuccess; + while (!Finished && (State == eReadSuccess)) + { + if (IOBufferStrLength(&IOB) == 0) + { + State = eMustReadMore; + break; + } + State = StrBufChunkSipLine(Line, &IOB); + switch (State) + { + case eReadSuccess: + if (!strcmp(ChrPtr(Line), "000")) + { + Finished = 1; + break; + } + StrBufAppendBuf(OutBuf, Line, 0); + StrBufAppendBufPlain(OutBuf, HKEY("\n"), 0); +// alarm(watchdog); /* reset the watchdog timer */ + break; + case eBufferNotEmpty: + break; + case eMustReadMore: + continue; + case eReadFail: + fprintf(stderr, "WTF? Exit!\n"); + exit(-1); + break; + } + if (StrLength(OutBuf) > 5*SIZ) + { + fwrite(ChrPtr(OutBuf), 1, StrLength(OutBuf), stdout); + FlushStrBuf(OutBuf); + } + } + } + if (StrLength(OutBuf) > 0) + { + fwrite(ChrPtr(OutBuf), 1, StrLength(OutBuf), stdout); } + FreeStrBuf(&Line); + FreeStrBuf(&OutBuf); + FreeStrBuf(&IOB.Buf); } if (xfermode == '6') { /* receive binary */