ret = 0;
int MAIN(int argc, char **argv)	{	int ret = 1;	char *infile = NULL;	int in_stdin = 0;	int in_noverify = 0;	char *salt = NULL, *passwd = NULL, **passwds = NULL;	char *salt_malloc = NULL, *passwd_malloc = NULL;	size_t passwd_malloc_size = 0;	int pw_source_defined = 0;	BIO *in = NULL, *out = NULL;	int i, badopt, opt_done;	int passed_salt = 0, quiet = 0, table = 0, reverse = 0;	int usecrypt = 0, use1 = 0, useapr1 = 0;	size_t pw_maxlen = 0;	apps_startup();	if (bio_err == NULL)		if ((bio_err=BIO_new(BIO_s_file())) != NULL)			BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);	out = BIO_new(BIO_s_file());	if (out == NULL)		goto err;	BIO_set_fp(out, stdout, BIO_NOCLOSE | BIO_FP_TEXT);#ifdef OPENSSL_SYS_VMS	{	BIO *tmpbio = BIO_new(BIO_f_linebuffer());	out = BIO_push(tmpbio, out);	}#endif	badopt = 0, opt_done = 0;	i = 0;	while (!badopt && !opt_done && argv[++i] != NULL)		{		if (strcmp(argv[i], "-crypt") == 0)			usecrypt = 1;		else if (strcmp(argv[i], "-1") == 0)			use1 = 1;		else if (strcmp(argv[i], "-apr1") == 0)			useapr1 = 1;		else if (strcmp(argv[i], "-salt") == 0)			{			if ((argv[i+1] != NULL) && (salt == NULL))				{				passed_salt = 1;				salt = argv[++i];				}			else				badopt = 1;			}		else if (strcmp(argv[i], "-in") == 0)			{			if ((argv[i+1] != NULL) && !pw_source_defined)				{				pw_source_defined = 1;				infile = argv[++i];				}			else				badopt = 1;			}		else if (strcmp(argv[i], "-stdin") == 0)			{			if (!pw_source_defined)				{				pw_source_defined = 1;				in_stdin = 1;				}			else				badopt = 1;			}		else if (strcmp(argv[i], "-noverify") == 0)			in_noverify = 1;		else if (strcmp(argv[i], "-quiet") == 0)			quiet = 1;		else if (strcmp(argv[i], "-table") == 0)			table = 1;		else if (strcmp(argv[i], "-reverse") == 0)			reverse = 1;		else if (argv[i][0] == '-')			badopt = 1;		else if (!pw_source_defined)			/* non-option arguments, use as passwords */			{			pw_source_defined = 1;			passwds = &argv[i];			opt_done = 1;			}		else			badopt = 1;		}	if (!usecrypt && !use1 && !useapr1) /* use default */		usecrypt = 1;	if (usecrypt + use1 + useapr1 > 1) /* conflict */		badopt = 1;	/* reject unsupported algorithms */#ifdef OPENSSL_NO_DES	if (usecrypt) badopt = 1;#endif#ifdef NO_MD5CRYPT_1	if (use1 || useapr1) badopt = 1;#endif	if (badopt) 		{		BIO_printf(bio_err, "Usage: passwd [options] [passwords]\n");		BIO_printf(bio_err, "where options are\n");#ifndef OPENSSL_NO_DES		BIO_printf(bio_err, "-crypt             standard Unix password algorithm (default)\n");#endif#ifndef NO_MD5CRYPT_1		BIO_printf(bio_err, "-1                 MD5-based password algorithm\n");		BIO_printf(bio_err, "-apr1              MD5-based password algorithm, Apache variant\n");#endif		BIO_printf(bio_err, "-salt string       use provided salt\n");		BIO_printf(bio_err, "-in file           read passwords from file\n");		BIO_printf(bio_err, "-stdin             read passwords from stdin\n");		BIO_printf(bio_err, "-noverify          never verify when reading password from terminal\n");		BIO_printf(bio_err, "-quiet             no warnings\n");		BIO_printf(bio_err, "-table             format output as table\n");		BIO_printf(bio_err, "-reverse           switch table columns\n");				goto err;		}	if ((infile != NULL) || in_stdin)		{		in = BIO_new(BIO_s_file());		if (in == NULL)			goto err;		if (infile != NULL)			{			assert(in_stdin == 0);			if (BIO_read_filename(in, infile) <= 0)				goto err;			}		else			{			assert(in_stdin);			BIO_set_fp(in, stdin, BIO_NOCLOSE);			}		}		if (usecrypt)		pw_maxlen = 8;	else if (use1 || useapr1)		pw_maxlen = 256; /* arbitrary limit, should be enough for most passwords */	if (passwds == NULL)		{		/* no passwords on the command line */		passwd_malloc_size = pw_maxlen + 2;		/* longer than necessary so that we can warn about truncation */		passwd = passwd_malloc = OPENSSL_malloc(passwd_malloc_size);		if (passwd_malloc == NULL)			goto err;		}	if ((in == NULL) && (passwds == NULL))		{		/* build a null-terminated list */		static char *passwds_static[2] = {NULL, NULL};				passwds = passwds_static;		if (in == NULL)			if (EVP_read_pw_string(passwd_malloc, passwd_malloc_size, "Password: ", !(passed_salt || in_noverify)) != 0)				goto err;		passwds[0] = passwd_malloc;		}	if (in == NULL)		{		assert(passwds != NULL);		assert(*passwds != NULL);				do /* loop over list of passwords */			{			passwd = *passwds++;			if (!do_passwd(passed_salt, &salt, &salt_malloc, passwd, out,				quiet, table, reverse, pw_maxlen, usecrypt, use1, useapr1))				goto err;			}		while (*passwds != NULL);		}	else		/* in != NULL */		{		int done;		assert (passwd != NULL);		do			{			int r = BIO_gets(in, passwd, pw_maxlen + 1);			if (r > 0)				{				char *c = (strchr(passwd, '\n')) ;				if (c != NULL)					*c = 0; /* truncate at newline */				else					{					/* ignore rest of line */					char trash[BUFSIZ];					do						r = BIO_gets(in, trash, sizeof trash);					while ((r > 0) && (!strchr(trash, '\n')));					}								if (!do_passwd(passed_salt, &salt, &salt_malloc, passwd, out,					quiet, table, reverse, pw_maxlen, usecrypt, use1, useapr1))					goto err;				}			done = (r <= 0);			}		while (!done);		}err:	ERR_print_errors(bio_err);	if (salt_malloc)		OPENSSL_free(salt_malloc);	if (passwd_malloc)		OPENSSL_free(passwd_malloc);	if (in)		BIO_free(in);	if (out)		BIO_free_all(out);	EXIT(ret);	}