/* echoclient.c */ | |
#include "openssl/ssl.h" | |
#include "../test.h" | |
int main(int argc, char** argv) | |
{ | |
SOCKET_T sockfd = 0; | |
FILE* fin = stdin; | |
FILE* fout = stdout; | |
int inCreated = 0; | |
int outCreated = 0; | |
char send[1024]; | |
char reply[1024]; | |
SSL_METHOD* method = 0; | |
SSL_CTX* ctx = 0; | |
SSL* ssl = 0; | |
#ifdef _WIN32 | |
WSADATA wsd; | |
WSAStartup(0x0002, &wsd); | |
#endif | |
if (argc >= 2) { | |
fin = fopen(argv[1], "r"); | |
inCreated = 1; | |
} | |
if (argc >= 3) { | |
fout = fopen(argv[2], "w"); | |
outCreated = 1; | |
} | |
if (!fin) err_sys("can't open input file"); | |
if (!fout) err_sys("can't open output file"); | |
tcp_connect(&sockfd); | |
method = SSLv3_client_method(); | |
ctx = SSL_CTX_new(method); | |
if (SSL_CTX_load_verify_locations(ctx, caCert, 0) != SSL_SUCCESS) | |
err_sys("can't load ca file"); | |
ssl = SSL_new(ctx); | |
SSL_set_fd(ssl, sockfd); | |
if (SSL_connect(ssl) != SSL_SUCCESS) err_sys("SSL_connect failed"); | |
while (fgets(send, sizeof(send), fin)) { | |
int sendSz = strlen(send) + 1; | |
if (SSL_write(ssl, send, sendSz) != sendSz) | |
err_sys("SSL_write failed"); | |
if (strncmp(send, "quit", 4) == 0) { | |
fputs("sending server shutdown command: quit!\n", fout); | |
break; | |
} | |
if (SSL_read(ssl, reply, sizeof(reply)) > 0) | |
fputs(reply, fout); | |
} | |
SSL_shutdown(ssl); | |
SSL_free(ssl); | |
SSL_CTX_free(ctx); | |
fflush(fout); | |
if (inCreated) fclose(fin); | |
if (outCreated) fclose(fout); | |
#ifdef _WIN32 | |
closesocket(sockfd); | |
#else | |
close(sockfd); | |
#endif | |
return 0; | |
} | |