/* * No arguments given, simply pass bytes on stdin/stdout and CLI socket */ static void pass(int sock) { struct pollfd fds[2]; char buf[1024]; int i; char *answer = NULL; unsigned u, status; ssize_t n; fds[0].fd = sock; fds[0].events = POLLIN; fds[1].fd = 0; fds[1].events = POLLIN; while (1) { i = poll(fds, 2, -1); if (i == -1 && errno == EINTR) { continue; } assert(i > 0); if (fds[0].revents & POLLIN) { u = VCLI_ReadResult(fds[0].fd, &status, &answer, timeout); if (u) { if (status == CLIS_COMMS) RL_EXIT(0); if (answer) fprintf(stderr, "%s\n", answer); RL_EXIT(1); } sprintf(buf, "%u\n", status); u = write(1, buf, strlen(buf)); if (answer) { u = write(1, answer, strlen(answer)); u = write(1, "\n", 1); free(answer); answer = NULL; } } if (fds[1].revents & POLLIN || fds[1].revents & POLLHUP) { n = read(fds[1].fd, buf, sizeof buf - 1); if (n == 0) { AZ(shutdown(sock, SHUT_WR)); fds[1].fd = -1; } else if (n < 0) { RL_EXIT(0); } else { buf[n] = '\0'; cli_write(sock, buf); } } } }
void send_line(char *l) { if (l) { cli_write(_line_sock, l); cli_write(_line_sock, "\n"); add_history(l); } else { RL_EXIT(0); } }
static void send_line(char *l) { if (l) { cli_write(_line_sock, l); cli_write(_line_sock, "\n"); add_history(l); rl_callback_handler_install("varnish> ", send_line); } else { RL_EXIT(0); } }
static void cli_write(int sock, const char *s) { int i, l; i = strlen(s); l = write (sock, s, i); if (i == l) return; perror("Write error CLI socket"); RL_EXIT(1); }
/* * No arguments given, simply pass bytes on stdin/stdout and CLI socket * Send a "banner" to varnish, to provoke a welcome message. */ static void pass(int sock) { struct pollfd fds[2]; char buf[1024]; int i; char *answer = NULL; unsigned u, status; #ifndef HAVE_LIBEDIT int n; #endif #ifdef HAVE_LIBEDIT _line_sock = sock; rl_already_prompted = 1; if (isatty(0)) { rl_callback_handler_install("varnish> ", send_line); } else { rl_callback_handler_install("", send_line); } #endif cli_write(sock, "banner\n"); fds[0].fd = sock; fds[0].events = POLLIN; fds[1].fd = 0; fds[1].events = POLLIN; while (1) { i = poll(fds, 2, -1); assert(i > 0); if (fds[0].revents & POLLIN) { /* Get rid of the prompt, kinda hackish */ u = write(1, "\r \r", 13); u = VCLI_ReadResult(fds[0].fd, &status, &answer, timeout); if (u) { if (status == CLIS_COMMS) RL_EXIT(0); if (answer) fprintf(stderr, "%s\n", answer); RL_EXIT(1); } sprintf(buf, "%u\n", status); u = write(1, buf, strlen(buf)); if (answer) { u = write(1, answer, strlen(answer)); u = write(1, "\n", 1); free(answer); answer = NULL; } #ifdef HAVE_LIBEDIT rl_forced_update_display(); #endif } if (fds[1].revents & POLLIN) { #ifdef HAVE_LIBEDIT rl_callback_read_char(); #else n = read(fds[1].fd, buf, sizeof buf); if (n == 0) { AZ(shutdown(sock, SHUT_WR)); fds[1].fd = -1; } else if (n < 0) { RL_EXIT(0); } else { buf[n] = '\0'; cli_write(sock, buf); } #endif } } }
/* * No arguments given, simply pass bytes on stdin/stdout and CLI socket * Send a "banner" to varnish, to provoke a welcome message. */ static void interactive(int sock) { struct pollfd fds[2]; char buf[1024]; int i; char *answer = NULL; unsigned u, status; _line_sock = sock; rl_already_prompted = 1; rl_callback_handler_install("varnish> ", send_line); rl_attempted_completion_function = varnishadm_completion; fds[0].fd = sock; fds[0].events = POLLIN; fds[1].fd = 0; fds[1].events = POLLIN; /* Grab the commands, for completion */ cli_write(sock, "help\n"); u = VCLI_ReadResult(fds[0].fd, &status, &answer, timeout); if (!u) { char *t, c[128]; if (status == CLIS_COMMS) { RL_EXIT(0); } t = answer; i = 0; while (*t) { if (sscanf(t, "%127s", c) == 1) { commands[i++] = strdup(c); while (*t != '\n' && *t != '\0') t++; if (*t == '\n') t++; } else { /* what? */ fprintf(stderr, "Unknown command '%s' parsing " "help output. Tab completion may be " "broken\n", t); break; } } } cli_write(sock, "banner\n"); while (1) { i = poll(fds, 2, -1); if (i == -1 && errno == EINTR) { continue; } assert(i > 0); if (fds[0].revents & POLLIN) { /* Get rid of the prompt, kinda hackish */ u = write(1, "\r \r", 13); u = VCLI_ReadResult(fds[0].fd, &status, &answer, timeout); if (u) { if (status == CLIS_COMMS) RL_EXIT(0); if (answer) fprintf(stderr, "%s\n", answer); RL_EXIT(1); } sprintf(buf, "%u\n", status); u = write(1, buf, strlen(buf)); if (answer) { u = write(1, answer, strlen(answer)); u = write(1, "\n", 1); free(answer); answer = NULL; } rl_forced_update_display(); } if (fds[1].revents & POLLIN) { rl_callback_read_char(); } } }