/* http://www.ccitt5.net/ */
/* gcc -o pwd-gen pwd-gen.c */

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>

#define PWD_SIZE 10 /* How long password should we generate? (PWD_SIZE -2) */

/* Initialize the seed, if we're on a linux system we use /dev/urandom */
/* else we use time() (yes, this solution is ugly.) */

int initseed(void){
FILE *rd;
int seed;

 rd=fopen("/dev/urandom","r");
 if(rd!=NULL){
  fread(&seed,sizeof(int),1,rd);
  fclose(rd);
 } else {
  seed=time(NULL);
 }
return(seed); 
}

/* Check that the 0-250 random value is a alphanumeric character */ 
/* and that it isn't in the list of "user confusing" characters */

int checkchar(int ch){

 if(
    ((isalnum(ch)))&&
    (ch!='l')&&(ch!='I')&&(ch!='O')&&
    (ch!='0')&&(ch!='o')
   )
  return(1);
 else 
  return(0);
}

int main(int argc, char *argv[]){
char pwd[PWD_SIZE];
char bc[2];
int ch;
int i;
int x;
int n_pass=5;
int seed;

 /* We take one argument, how many passwords to generate */
 /* if no value is given it defaults to 5 */

 if(argc>1){
  if(!isdigit(argv[1][0])){
   printf("argument must be integer: %s",argv[1]);
   exit(-1);
  } 
  n_pass=atoi(argv[1]);
 }

 /* Get initial seed */
 seed=initseed();
 
 /* make N_PASS number of loops to generate password(s) */
 for(i=0;i<n_pass;i++){
  memset(pwd,0,PWD_SIZE);
  x=0;
  while(x<PWD_SIZE-2){
   srandom(seed);
   seed=random();
   ch=1+(int) (250.0*random()/(RAND_MAX+1.0));
   if(checkchar(ch)){
    snprintf(bc,2,"%c",(char)ch);
    strncat(pwd,bc,(PWD_SIZE-1)-(strlen(pwd)));
    x++;
   }
  }
 printf("%s\n",pwd);  
 }

/* All done - user can start to forget passwords now. */
return(1);
}     


