int main(int argc, char * const *argv) { const char *T_arg = NULL; const char *S_arg = NULL; const char *n_arg = NULL; int opt, sock; while ((opt = getopt(argc, argv, "n:S:T:t:")) != -1) { switch (opt) { case 'n': n_arg = optarg; break; case 'S': S_arg = optarg; break; case 'T': T_arg = optarg; break; case 't': timeout = strtod(optarg, NULL); break; default: usage(); } } argc -= optind; argv += optind; if (n_arg != NULL) { if (T_arg != NULL || S_arg != NULL) { usage(); } sock = n_arg_sock(n_arg); } else if (T_arg == NULL) { sock = n_arg_sock(""); } else { assert(T_arg != NULL); sock = cli_sock(T_arg, S_arg); } if (sock < 0) exit(2); if (argc > 0) do_args(sock, argc, argv); else { if (isatty(0)) { interactive(sock); } else { pass(sock); } } exit(0); }
/* * This function establishes a connection to the specified ip and port and * sends a command to varnishd. If varnishd returns an OK status, the result * is printed and 0 returned. Else, an error message is printed and 1 is * returned */ static int cli_sock(struct vadmin_config_t *vadmin, struct agent_core_t *core) { int fd; unsigned status; char *answer = NULL; char buf[CLI_AUTH_RESPONSE_LEN + 1]; n_arg_sock(core); if (core->config->T_arg == NULL) { logger(vadmin->logger, "No T-arg (Administration port) available. Varnishadm-commands wont work."); return (-1); } vadmin->sock = VSS_open(vadmin->logger, core->config->T_arg, core->config->timeout); if (vadmin->sock < 0) { logger(vadmin->logger, "Connection failed (%s)", core->config->T_arg); return (-1); } (void)VCLI_ReadResult(vadmin->sock, &status, &answer, core->config->timeout); if (status == CLIS_AUTH) { if (core->config->S_arg == NULL) { logger(vadmin->logger, "Authentication required"); assert(close(vadmin->sock) == 0); return(-1); } fd = open(core->config->S_arg, O_RDONLY); if (fd < 0) { logger(vadmin->logger, "Cannot open \"%s\": %s", core->config->S_arg, strerror(errno)); assert(close(vadmin->sock) == 0); return (-1); } VCLI_AuthResponse(fd, answer, buf); assert(close(fd) == 0); free(answer); cli_write(vadmin->sock, "auth "); cli_write(vadmin->sock, buf); cli_write(vadmin->sock, "\n"); (void)VCLI_ReadResult(vadmin->sock, &status, &answer, core->config->timeout); } if (status != CLIS_OK) { logger(vadmin->logger, "Rejected %u\n%s", status, answer); assert(close(vadmin->sock) == 0); return (-1); } free(answer); cli_write(vadmin->sock, "ping\n"); (void)VCLI_ReadResult(vadmin->sock, &status, &answer, core->config->timeout); if (status != CLIS_OK || strstr(answer, "PONG") == NULL) { logger(vadmin->logger, "No pong received from server"); assert(close(vadmin->sock) == 0); return(-1); } free(answer); vadmin->state = 1; return (vadmin->sock); }
int main(int argc, char * const *argv) { const char *T_arg = NULL; const char *S_arg = NULL; const char *n_arg = NULL; int opt, sock; /* * By default linux::getopt(3) mangles the argv order, such that * varnishadm -n bla param.set foo -bar * gets interpreted as * varnishadm -n bla -bar param.set foo * The '+' stops that from happening * See #1496 */ while ((opt = getopt(argc, argv, "+n:S:T:t:")) != -1) { switch (opt) { case 'n': n_arg = optarg; break; case 'S': S_arg = optarg; break; case 'T': T_arg = optarg; break; case 't': timeout = VNUM(optarg); if (isnan(timeout)) usage(); break; default: usage(); } } argc -= optind; argv += optind; if (n_arg != NULL) { if (T_arg != NULL || S_arg != NULL) { usage(); } sock = n_arg_sock(n_arg); } else if (T_arg == NULL) { sock = n_arg_sock(""); } else { assert(T_arg != NULL); sock = cli_sock(T_arg, S_arg); } if (sock < 0) exit(2); if (argc > 0) do_args(sock, argc, argv); else { if (isatty(0)) { interactive(sock); } else { pass(sock); } } exit(0); }