cmcs/
cmcs/CVS/
cmcs/Documentation/
cmcs/Documentation/CVS/
cmcs/Historical/CVS/
cmcs/Historical/OldDocumentation/
cmcs/Historical/OldDocumentation/CVS/
cmcs/Historical/OldSource/
cmcs/Historical/OldSource/CVS/
cmcs/makefiles/CVS/
cmcs/src/CVS/
cmcs/tree/CVS/
cmcs/tree/bin/CVS/
cmcs/tree/datafiles/
cmcs/tree/datafiles/CVS/
cmcs/tree/fonts/CVS/
cmcs/tree/helpfiles/CVS/
cmcs/tree/text/
cmcs/tree/text/CVS/
cmcs/tree/userfiles/
cmcs/tree/userfiles/CVS/
cmcs/tree/www/
cmcs/tree/www/CVS/
/**************************************************************************/
/* Userinfo for Crypt userfiles                                           */
/*                                                                        */
/* (c) 1997 Bryan McPhail                                                 */
/*                                                                        */
/**************************************************************************/

#include <stdio.h>  
#include <stdlib.h>
#include <time.h>
#include <setjmp.h>
#include <errno.h>
#include <string.h>
#include <dirent.h>

#include "cryptmcs.h"

#define EMAILS 1
#define RANKS 2
#define WWW 3
#define GENERAL 4

UR_OBJECT create_user();
void usage(char *name);

void usage(char *name)
{
printf("Usage:\n%s -emails\n%s -ranks\n%s -www\n%s -general\n",name,name,name,name);
exit(1);
}

main(int argc, char **argv)
{
FILE *fp;
char name[100],line[81],filename[80];
UR_OBJECT user;
int temp1, temp2, temp3,temp4, has_mail, has_profile,total=0,i,mode=0;
int count[3][7]={{0,0,0},{0,0,0},{0,0,0}};
long int mins;
DIR *dir;
struct dirent *entry;

/* Parse command line */
if (argc<2)
  usage(argv[0]);

if (!strcmp(argv[1],"-emails"))
  mode=EMAILS;

if (!strcmp(argv[1],"-ranks"))
  mode=RANKS;

if (!strcmp(argv[1],"-www"))
  mode=WWW;

if (!strcmp(argv[1],"-general"))
  mode=GENERAL;

if (!mode)
  usage(argv[0]);

/* Create temp user */
user=create_user();

/* Open userfiles dir */
dir = opendir(USERFILES);
if (!dir) {
  printf("Error: Cannot open userfiles directory!\n");
  exit(1);
}

/* Setup screen */
printf("Crypt user-info v1.0 - (c)1997 Bryan McPhail\n");

switch (mode) {
 case GENERAL:
  printf("\n%-12s %-8s %-8s %-4s %-4s %s\n\n","Name", "Level", "Minutes On", "Mail", "Profile","Last Login");
  break;
 case EMAILS:
  printf("\n%-12s %s\n\n","Name","Email Address");
  break;

 case WWW:
  printf("\n%-12s %-10s\n\n","Name","Homepage Address");
  break;
  
 case RANKS:
  printf("\n%-12s %-10s\n\n","Name","Rank");
  break;
}

while ((entry=readdir(dir)) != NULL) {
  /* Only grab .D files */
  if (strncmp(".D",entry->d_name+(strlen(entry->d_name)-2),2) != 0)
    continue;
  
  strcpy(name, entry->d_name);

  /* Open data file for user */
  sprintf(filename,"%s/%s",USERFILES,name);
  fp=fopen(filename,"r");
  if (!fp)
    break;
	
  /* Cut off the .D */
  temp4=strlen(name)-2;
  if (temp4<0) temp4=0;
  name[temp4]='\0';
  
  fscanf(fp,"%s",user->pass); /* password */ 
  
  fscanf(fp,"%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",&temp1,&temp2,&user->last_login_len,&temp3,&user->level,&user->prompt,&user->muzzled,&user->charmode_echo,&user->command_mode,&user->colour,&user->sex,&user->termtype, &user->xterm, &user->figlet, &user->vis_email, &user->examined);

  user->last_login=(time_t)temp1;
  user->total_login=(time_t)temp2;
  user->read_mail=(time_t)temp3;
  fscanf(fp,"%s\n",user->last_site);
 
  fgets(line,USER_DESC_LEN+2,fp);
  line[strlen(line)-1]=0;
  strcpy(user->pre_desc,line);
  
  if (!strcmp(user->pre_desc,"none"))
    user->pre_desc[0]='\0';
  
  /* Need to do the rest like this 'cos they may be more than 1 word each */
  fgets(line,USER_DESC_LEN+2,fp);
  line[strlen(line)-1]=0;
  strcpy(user->desc,line);
  
  fgets(line,PHRASE_LEN+2,fp);
  line[strlen(line)-1]=0;
  strcpy(user->in_phrase,line);
  
  fgets(line,PHRASE_LEN+2,fp);
  line[strlen(line)-1]=0;
  strcpy(user->out_phrase,line);
  
  fgets(line,LOG_PHRASE_LEN+2,fp);
  line[strlen(line)-1]=0;
  strcpy(user->login_phrase,line);
  
  fgets(line,LOG_PHRASE_LEN+2,fp);
  line[strlen(line)-1]=0;
  strcpy(user->logout_phrase,line);

  fscanf(fp,"%s\n",user->email);
  fscanf(fp,"%s\n",user->www);

  fclose(fp);

  /* Calculate total login */
  mins=temp2/60;

  /* Check for mail & profiles */
  sprintf(filename,"%s/%s.M",USERMAIL,name);
  fp=fopen(filename,"r");
  if (!fp)
    has_mail=0; 
  else {
    has_mail=1;
    fclose(fp);
  }
  
  sprintf(filename,"%s/%s.P",USERFILES,name);
  fp=fopen(filename,"r");
  if (!fp)
    has_profile=0; 
  else {
    has_profile=1;
    fclose(fp);
  }
  
  /* Print out data to screen */

  switch (mode) {

  case EMAILS:
    printf("%-12s %s\n",name,user->email);
    break;

  case GENERAL:
    sprintf(line, "%s", ctime(&user->last_login));
    printf("%-12s %-10s %-8d %-4s %-4s %s",name, new_levels[user->sex][user->level], mins, noyes1[has_mail], noyes1[has_profile],line);
    
    break;

  case WWW:
    printf("%-12s %-10s %s\n",name, new_levels[user->sex][user->level],user->www);
    break;

  case RANKS:
    printf("%-12s %-10s\n",name,level_name[user->level]);
    break;

  }
  /* Count 'em */
  count[user->sex][user->level]++;
  total++;
}

closedir(dir);      

if (mode==GENERAL) {
  for (i=1; i<6; i++) 
    printf("\n%15s %d %15s %d %15s %d", new_levels[0][i], count[0][i], new_levels[1][i], count[1][i], new_levels[2][i], count[2][i]);
  
  printf("\n\nTotal number of users: %d\n", total);
}

return 0;
}

UR_OBJECT create_user()
{
UR_OBJECT user;

if ((user=(UR_OBJECT)malloc(sizeof(struct user_struct)))==NULL) {
  printf("Error: Memory allocation failure.\n");
  exit(1);
}

/* initialise users - general */
user->type=USER_TYPE;
user->name[0]='\0';
user->desc[0]='\0';
user->in_phrase[0]='\0'; 
user->out_phrase[0]='\0';   
user->pass[0]='\0';
user->site[0]='\0';
user->last_site[0]='\0';
user->page_file[0]='\0';
user->mail_to[0]='\0';
user->buff[0]='\0';  
user->buffpos=0;
user->filepos=0;
user->read_mail=time(0);
user->room=NULL;
user->invite_room=NULL;
user->port=0;
user->login=0;
user->socket=-1;
user->attempts=0;
user->command_mode=0;
user->level=0;
user->vis=1;
user->ignall=0;
user->ignall_store=0;
user->ignshout=0;
user->igntell=0;
user->muzzled=0;
user->last_input=time(0);
user->last_login=time(0);
user->last_login_len=0;
user->total_login=0;
user->prompt=prompt_def;
user->charmode_echo=0;
user->misc_op=0;
user->edit_op=0;
user->edit_line=0;
user->charcnt=0;
user->warned=0;
user->accreq=0;
user->afk=0;
user->colour=colour_def;
user->clone_hear=CLONE_HEAR_ALL;
user->malloc_start=NULL;
user->malloc_end=NULL;
user->owner=NULL;
user->old_tell[0]='\0';
user->ip_name[0]='\0';
user->tell=0;
user->licked=0;
user->been_licked=0;
user->sex=0; 
user->autologout=0;
user->site_port=0;
user->termtype=0;
user->xterm=1;
user->figlet=0;
user->revline=0;
user->auth_addr=0;
user->vis_email=0;
user->examined=0;
user->email[0]='\0';
user->www[0]='\0';
user->logout_phrase[0]='\0';
user->pre_desc[0]='\0';
user->afk_mesg[0]='\0';
user->ip_num[0]='\0';
return user;
}