/**************************************************************************/ /* 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; }