static int do_revoke(X509 *x509, TXT_DB *db)
static int do_revoke(X509 *x509, TXT_DB *db, int type, char *value)
static int do_revoke(X509 *x509, TXT_DB *db)	{	ASN1_UTCTIME *tm=NULL, *revtm=NULL;	char *row[DB_NUMBER],**rrow,**irow;	BIGNUM *bn = NULL;	int ok=-1,i;	for (i=0; i<DB_NUMBER; i++)		row[i]=NULL;	row[DB_name]=X509_NAME_oneline(X509_get_subject_name(x509),NULL,0);	bn = ASN1_INTEGER_to_BN(X509_get_serialNumber(x509),NULL);	row[DB_serial]=BN_bn2hex(bn);	BN_free(bn);	if ((row[DB_name] == NULL) || (row[DB_serial] == NULL))		{		BIO_printf(bio_err,"Memory allocation failure\n");		goto err;		}	/* We have to lookup by serial number because name lookup	 * skips revoked certs 	 */	rrow=TXT_DB_get_by_index(db,DB_serial,row);	if (rrow == NULL)		{		BIO_printf(bio_err,"Adding Entry to DB for %s\n", row[DB_name]);		/* We now just add it to the database */		row[DB_type]=(char *)OPENSSL_malloc(2);		tm=X509_get_notAfter(x509);		row[DB_exp_date]=(char *)OPENSSL_malloc(tm->length+1);		memcpy(row[DB_exp_date],tm->data,tm->length);		row[DB_exp_date][tm->length]='\0';		row[DB_rev_date]=NULL;		/* row[DB_serial] done already */		row[DB_file]=(char *)OPENSSL_malloc(8);		/* row[DB_name] done already */		if ((row[DB_type] == NULL) || (row[DB_exp_date] == NULL) ||			(row[DB_file] == NULL))			{			BIO_printf(bio_err,"Memory allocation failure\n");			goto err;			}		strcpy(row[DB_file],"unknown");		row[DB_type][0]='V';		row[DB_type][1]='\0';		if ((irow=(char **)OPENSSL_malloc(sizeof(char *)*(DB_NUMBER+1))) == NULL)			{			BIO_printf(bio_err,"Memory allocation failure\n");			goto err;			}		for (i=0; i<DB_NUMBER; i++)			{			irow[i]=row[i];			row[i]=NULL;			}		irow[DB_NUMBER]=NULL;		if (!TXT_DB_insert(db,irow))			{			BIO_printf(bio_err,"failed to update database\n");			BIO_printf(bio_err,"TXT_DB error number %ld\n",db->error);			goto err;			}		/* Revoke Certificate */		ok = do_revoke(x509,db);		goto err;		}	else if (index_name_cmp((const char **)row,(const char **)rrow))		{		BIO_printf(bio_err,"ERROR:name does not match %s\n",			   row[DB_name]);		goto err;		}	else if (rrow[DB_type][0]=='R')		{		BIO_printf(bio_err,"ERROR:Already revoked, serial number %s\n",			   row[DB_serial]);		goto err;		}	else		{		BIO_printf(bio_err,"Revoking Certificate %s.\n", rrow[DB_serial]);		revtm = ASN1_UTCTIME_new();		revtm=X509_gmtime_adj(revtm,0);		rrow[DB_type][0]='R';		rrow[DB_type][1]='\0';		rrow[DB_rev_date]=(char *)OPENSSL_malloc(revtm->length+1);		memcpy(rrow[DB_rev_date],revtm->data,revtm->length);		rrow[DB_rev_date][revtm->length]='\0';		ASN1_UTCTIME_free(revtm);		}	ok=1;err:	for (i=0; i<DB_NUMBER; i++)		{		if (row[i] != NULL) 			OPENSSL_free(row[i]);		}	return(ok);	}