int MAIN(int argc, char **argv)
	{
	int ret=1,i;
	int verbose=0,Verbose=0;
	int use_supported = 0;
#ifndef OPENSSL_NO_SSL_TRACE
	int stdname = 0;
#endif
	const char **pp;
	const char *p;
	int badops=0;
	SSL_CTX *ctx=NULL;
	SSL *ssl=NULL;
	char *ciphers=NULL;
	const SSL_METHOD *meth=NULL;
	STACK_OF(SSL_CIPHER) *sk;
	char buf[512];
	BIO *STDout=NULL;
#if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
	meth=SSLv23_server_method();
#elif !defined(OPENSSL_NO_SSL3)
	meth=SSLv3_server_method();
#elif !defined(OPENSSL_NO_SSL2)
	meth=SSLv2_server_method();
#endif
	apps_startup();
	if (bio_err == NULL)
		bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
	STDout=BIO_new_fp(stdout,BIO_NOCLOSE);
#ifdef OPENSSL_SYS_VMS
	{
	BIO *tmpbio = BIO_new(BIO_f_linebuffer());
	STDout = BIO_push(tmpbio, STDout);
	}
#endif
	if (!load_config(bio_err, NULL))
		goto end;
	argc--;
	argv++;
	while (argc >= 1)
		{
		if (strcmp(*argv,"-v") == 0)
			verbose=1;
		else if (strcmp(*argv,"-V") == 0)
			verbose=Verbose=1;
		else if (strcmp(*argv,"-s") == 0)
			use_supported = 1;
#ifndef OPENSSL_NO_SSL_TRACE
		else if (strcmp(*argv,"-stdname") == 0)
			stdname=verbose=1;
#endif
#ifndef OPENSSL_NO_SSL2
		else if (strcmp(*argv,"-ssl2") == 0)
			meth=SSLv2_client_method();
#endif
#ifndef OPENSSL_NO_SSL3
		else if (strcmp(*argv,"-ssl3") == 0)
			meth=SSLv3_client_method();
#endif
#ifndef OPENSSL_NO_TLS1
		else if (strcmp(*argv,"-tls1") == 0)
			meth=TLSv1_client_method();
#endif
		else if ((strncmp(*argv,"-h",2) == 0) ||
			 (strcmp(*argv,"-?") == 0))
			{
			badops=1;
			break;
			}
		else
			{
			ciphers= *argv;
			}
		argc--;
		argv++;
		}
	if (badops)
		{
		for (pp=ciphers_usage; (*pp != NULL); pp++)
			BIO_printf(bio_err,"%s",*pp);
		goto end;
		}
	OpenSSL_add_ssl_algorithms();
	ctx=SSL_CTX_new(meth);
	if (ctx == NULL) goto err;
	if (ciphers != NULL) {
		if(!SSL_CTX_set_cipher_list(ctx,ciphers)) {
			BIO_printf(bio_err, "Error in cipher list\n");
			goto err;
		}
	}
	ssl=SSL_new(ctx);
	if (ssl == NULL) goto err;
	if (use_supported)
		sk=SSL_get1_supported_ciphers(ssl);
	else
		sk=SSL_get_ciphers(ssl);
	if (!verbose)
		{
		for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
			{
			SSL_CIPHER *c = sk_SSL_CIPHER_value(sk,i);
			p = SSL_CIPHER_get_name(c);
			if (p == NULL) break;
			if (i != 0) BIO_printf(STDout,":");
			BIO_printf(STDout,"%s",p);
			}
		BIO_printf(STDout,"\n");
		}
	else
		{
		for (i=0; i<sk_SSL_CIPHER_num(sk); i++)
			{
			SSL_CIPHER *c;
			c = sk_SSL_CIPHER_value(sk,i);
			if (Verbose)
				{
				unsigned long id = SSL_CIPHER_get_id(c);
				int id0 = (int)(id >> 24);
				int id1 = (int)((id >> 16) & 0xffL);
				int id2 = (int)((id >> 8) & 0xffL);
				int id3 = (int)(id & 0xffL);
				if ((id & 0xff000000L) == 0x02000000L)
					BIO_printf(STDout, "     0x%02X,0x%02X,0x%02X - ", id1, id2, id3);
				else if ((id & 0xff000000L) == 0x03000000L)
					BIO_printf(STDout, "          0x%02X,0x%02X - ", id2, id3);
				else
					BIO_printf(STDout, "0x%02X,0x%02X,0x%02X,0x%02X - ", id0, id1, id2, id3);
				}
#ifndef OPENSSL_NO_SSL_TRACE
			if (stdname)
				{
				const char *nm = SSL_CIPHER_standard_name(c);
				if (nm == NULL)
					nm = "UNKNOWN";
				BIO_printf(STDout, "%s - ", nm);
				}
#endif
			BIO_puts(STDout,SSL_CIPHER_description(c,buf,sizeof buf));
			}
		}
	ret=0;
	if (0)
		{
err:
		SSL_load_error_strings();
		ERR_print_errors(bio_err);
		}
end:
	if (use_supported && sk)
		sk_SSL_CIPHER_free(sk);
	if (ctx != NULL) SSL_CTX_free(ctx);
	if (ssl != NULL) SSL_free(ssl);
	if (STDout != NULL) BIO_free_all(STDout);
	apps_shutdown();
	OPENSSL_EXIT(ret);
	}
['int MAIN(int argc, char **argv)\n\t{\n\tint ret=1,i;\n\tint verbose=0,Verbose=0;\n\tint use_supported = 0;\n#ifndef OPENSSL_NO_SSL_TRACE\n\tint stdname = 0;\n#endif\n\tconst char **pp;\n\tconst char *p;\n\tint badops=0;\n\tSSL_CTX *ctx=NULL;\n\tSSL *ssl=NULL;\n\tchar *ciphers=NULL;\n\tconst SSL_METHOD *meth=NULL;\n\tSTACK_OF(SSL_CIPHER) *sk;\n\tchar buf[512];\n\tBIO *STDout=NULL;\n#if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)\n\tmeth=SSLv23_server_method();\n#elif !defined(OPENSSL_NO_SSL3)\n\tmeth=SSLv3_server_method();\n#elif !defined(OPENSSL_NO_SSL2)\n\tmeth=SSLv2_server_method();\n#endif\n\tapps_startup();\n\tif (bio_err == NULL)\n\t\tbio_err=BIO_new_fp(stderr,BIO_NOCLOSE);\n\tSTDout=BIO_new_fp(stdout,BIO_NOCLOSE);\n#ifdef OPENSSL_SYS_VMS\n\t{\n\tBIO *tmpbio = BIO_new(BIO_f_linebuffer());\n\tSTDout = BIO_push(tmpbio, STDout);\n\t}\n#endif\n\tif (!load_config(bio_err, NULL))\n\t\tgoto end;\n\targc--;\n\targv++;\n\twhile (argc >= 1)\n\t\t{\n\t\tif (strcmp(*argv,"-v") == 0)\n\t\t\tverbose=1;\n\t\telse if (strcmp(*argv,"-V") == 0)\n\t\t\tverbose=Verbose=1;\n\t\telse if (strcmp(*argv,"-s") == 0)\n\t\t\tuse_supported = 1;\n#ifndef OPENSSL_NO_SSL_TRACE\n\t\telse if (strcmp(*argv,"-stdname") == 0)\n\t\t\tstdname=verbose=1;\n#endif\n#ifndef OPENSSL_NO_SSL2\n\t\telse if (strcmp(*argv,"-ssl2") == 0)\n\t\t\tmeth=SSLv2_client_method();\n#endif\n#ifndef OPENSSL_NO_SSL3\n\t\telse if (strcmp(*argv,"-ssl3") == 0)\n\t\t\tmeth=SSLv3_client_method();\n#endif\n#ifndef OPENSSL_NO_TLS1\n\t\telse if (strcmp(*argv,"-tls1") == 0)\n\t\t\tmeth=TLSv1_client_method();\n#endif\n\t\telse if ((strncmp(*argv,"-h",2) == 0) ||\n\t\t\t (strcmp(*argv,"-?") == 0))\n\t\t\t{\n\t\t\tbadops=1;\n\t\t\tbreak;\n\t\t\t}\n\t\telse\n\t\t\t{\n\t\t\tciphers= *argv;\n\t\t\t}\n\t\targc--;\n\t\targv++;\n\t\t}\n\tif (badops)\n\t\t{\n\t\tfor (pp=ciphers_usage; (*pp != NULL); pp++)\n\t\t\tBIO_printf(bio_err,"%s",*pp);\n\t\tgoto end;\n\t\t}\n\tOpenSSL_add_ssl_algorithms();\n\tctx=SSL_CTX_new(meth);\n\tif (ctx == NULL) goto err;\n\tif (ciphers != NULL) {\n\t\tif(!SSL_CTX_set_cipher_list(ctx,ciphers)) {\n\t\t\tBIO_printf(bio_err, "Error in cipher list\\n");\n\t\t\tgoto err;\n\t\t}\n\t}\n\tssl=SSL_new(ctx);\n\tif (ssl == NULL) goto err;\n\tif (use_supported)\n\t\tsk=SSL_get1_supported_ciphers(ssl);\n\telse\n\t\tsk=SSL_get_ciphers(ssl);\n\tif (!verbose)\n\t\t{\n\t\tfor (i=0; i<sk_SSL_CIPHER_num(sk); i++)\n\t\t\t{\n\t\t\tSSL_CIPHER *c = sk_SSL_CIPHER_value(sk,i);\n\t\t\tp = SSL_CIPHER_get_name(c);\n\t\t\tif (p == NULL) break;\n\t\t\tif (i != 0) BIO_printf(STDout,":");\n\t\t\tBIO_printf(STDout,"%s",p);\n\t\t\t}\n\t\tBIO_printf(STDout,"\\n");\n\t\t}\n\telse\n\t\t{\n\t\tfor (i=0; i<sk_SSL_CIPHER_num(sk); i++)\n\t\t\t{\n\t\t\tSSL_CIPHER *c;\n\t\t\tc = sk_SSL_CIPHER_value(sk,i);\n\t\t\tif (Verbose)\n\t\t\t\t{\n\t\t\t\tunsigned long id = SSL_CIPHER_get_id(c);\n\t\t\t\tint id0 = (int)(id >> 24);\n\t\t\t\tint id1 = (int)((id >> 16) & 0xffL);\n\t\t\t\tint id2 = (int)((id >> 8) & 0xffL);\n\t\t\t\tint id3 = (int)(id & 0xffL);\n\t\t\t\tif ((id & 0xff000000L) == 0x02000000L)\n\t\t\t\t\tBIO_printf(STDout, "     0x%02X,0x%02X,0x%02X - ", id1, id2, id3);\n\t\t\t\telse if ((id & 0xff000000L) == 0x03000000L)\n\t\t\t\t\tBIO_printf(STDout, "          0x%02X,0x%02X - ", id2, id3);\n\t\t\t\telse\n\t\t\t\t\tBIO_printf(STDout, "0x%02X,0x%02X,0x%02X,0x%02X - ", id0, id1, id2, id3);\n\t\t\t\t}\n#ifndef OPENSSL_NO_SSL_TRACE\n\t\t\tif (stdname)\n\t\t\t\t{\n\t\t\t\tconst char *nm = SSL_CIPHER_standard_name(c);\n\t\t\t\tif (nm == NULL)\n\t\t\t\t\tnm = "UNKNOWN";\n\t\t\t\tBIO_printf(STDout, "%s - ", nm);\n\t\t\t\t}\n#endif\n\t\t\tBIO_puts(STDout,SSL_CIPHER_description(c,buf,sizeof buf));\n\t\t\t}\n\t\t}\n\tret=0;\n\tif (0)\n\t\t{\nerr:\n\t\tSSL_load_error_strings();\n\t\tERR_print_errors(bio_err);\n\t\t}\nend:\n\tif (use_supported && sk)\n\t\tsk_SSL_CIPHER_free(sk);\n\tif (ctx != NULL) SSL_CTX_free(ctx);\n\tif (ssl != NULL) SSL_free(ssl);\n\tif (STDout != NULL) BIO_free_all(STDout);\n\tapps_shutdown();\n\tOPENSSL_EXIT(ret);\n\t}']