/** go ahead and read config, contact server and perform command and display */ static int go(const char* cfgfile, char* svr, int argc, char* argv[]) { struct config_file* cfg; int fd, ret; SSL_CTX* ctx; SSL* ssl; /* read config */ if(!(cfg = config_create())) fatal_exit("out of memory"); if(!config_read(cfg, cfgfile, NULL)) fatal_exit("could not read config file"); if(!cfg->remote_control_enable) log_warn("control-enable is 'no' in the config file."); ctx = setup_ctx(cfg); /* contact server */ fd = contact_server(svr, cfg, argc>0&&strcmp(argv[0],"status")==0); ssl = setup_ssl(ctx, fd); /* send command */ ret = go_cmd(ssl, argc, argv); SSL_free(ssl); #ifndef USE_WINSOCK close(fd); #else closesocket(fd); #endif SSL_CTX_free(ctx); config_delete(cfg); return ret; }
/** go ahead and read config, contact server and perform command and display */ static int go(const char* cfgfile, char* svr, int argc, char* argv[]) { struct nsd_options* opt; int fd, ret; SSL_CTX* ctx; SSL* ssl; /* read config */ if(!(opt = nsd_options_create(region_create(xalloc, free)))) { fprintf(stderr, "out of memory\n"); exit(1); } tsig_init(opt->region); if(!parse_options_file(opt, cfgfile, NULL, NULL)) { fprintf(stderr, "could not read config file\n"); exit(1); } if(!opt->control_enable) fprintf(stderr, "warning: control-enable is 'no' in the config file.\n"); ctx = setup_ctx(opt); /* contact server */ fd = contact_server(svr, opt, argc>0&&strcmp(argv[0],"status")==0); ssl = setup_ssl(ctx, fd); /* send command */ ret = go_cmd(ssl, fd, argc, argv); if(ssl) SSL_free(ssl); close(fd); if(ctx) SSL_CTX_free(ctx); region_destroy(opt->region); return ret; }
/* fonction coupe la connexion. */ int connect_server (flrn_char *host, int port) { int ret, code; int rc,rc2; char *trad; const char *special; flrn_char *tmptrad; init_connection=1; if (host==NULL) { special=_("Pas de serveur où se connecter.\n"); rc=conversion_from_utf8(special, &tmptrad, 0, (size_t)(-1)); rc2=conversion_to_terminal(tmptrad,&trad,0,(size_t)(-1)); fputs(trad,stderr); if (rc2==0) free(trad); if (rc==0) free(tmptrad); return -1; } if (port==0) port=Options.port; rc=conversion_to_utf8(host,&trad,0,(size_t)(-1)); ret=contact_server(host, port); if (rc==0) free(trad); if (ret<0) { special=_("Échec de la connexion au serveur : %s\n"); rc=conversion_from_utf8(special, &tmptrad, 0, (size_t)(-1)); rc2=conversion_to_terminal(tmptrad,&trad,0,(size_t)(-1)); fprintf(stderr,trad,host); if (rc2==0) free(trad); if (rc==0) free(tmptrad); return -1; } code=return_code(); init_connection=0; if ((code!=200) && (code!=201)) { close (tcp_fd); return code; } server_command_status[CMD_QUIT]=CMD_FLAG_MAXIMAL; server_command_status[CMD_MODE_READER]=CMD_FLAG_MAXIMAL; server_command_status[CMD_AUTHINFO]=CMD_FLAG_MAXIMAL; server_command_status[CMD_POST]=(code==200 ? CMD_FLAG_MAXIMAL : CMD_FLAG_TESTED); write_command(CMD_MODE_READER, 0, NULL); ret=return_code(); /* On place juste XMODE READER au cas ou...*/ /* Non nécéssaire (trn4 ne le fait pas) */ /* if (ret>400) { raw_write_server("XMODE READER\r\n", 14); ret=return_code(); } */ /* Authentification */ if ((ret<500) && (Options.auth_cmd)) { return run_auth_cmd(); } if ((ret<500) && (Options.auth_user)) { char *strvar[2]; strvar[0]="user"; rc=conversion_to_utf8(Options.auth_user,&trad,0,(size_t)(-1)); strvar[1]=trad; write_command(CMD_AUTHINFO,2,strvar); if (rc==0) free(trad); ret=return_code(); if ((ret>300) && (ret<400)) { strvar[0]="pass"; if (Options.auth_pass) { rc=conversion_to_utf8(Options.auth_pass,&trad,0,(size_t)(-1)); strvar[1]=trad; } else { char *strpipo; /* on peut supposer que ça n'arrive que la première fois */ special=_("Le serveur demande un mot de passe.\n"); rc=conversion_from_utf8(special, &tmptrad, 0, (size_t)(-1)); rc2=conversion_to_terminal(tmptrad,&trad,0,(size_t)(-1)); fputs(trad,stderr); if (rc2==0) free(trad); if (rc==0) free(tmptrad); special=_("Mot de passe : "); rc=conversion_from_utf8(special, &tmptrad, 0, (size_t)(-1)); rc2=conversion_to_terminal(tmptrad,&trad,0,(size_t)(-1)); strpipo=getpass(trad); if (rc2==0) free(trad); if (rc==0) free(tmptrad); if (strpipo!=NULL) { rc=conversion_from_terminal(strpipo,&(Options.auth_pass), 0,(size_t)(-1)); if (rc!=0) Options.auth_pass=safe_flstrdup(Options.auth_pass); rc=conversion_to_utf8(Options.auth_pass,&trad,0,(size_t)(-1)); strvar[1]=trad; } else { strvar[1]=""; rc=1; } } if (Options.auth_pass) { write_command(CMD_AUTHINFO,2,strvar); ret=return_code(); if (rc==0) free(trad); } else ret=502; } if (ret==502) code=ret; } return code; }