BOOL DLLCALL load_cfg(scfg_t* cfg, char* text[], BOOL prep, char* error) { int i; #ifdef SBBS long line=0L; FILE *instream; char str[256],fname[13]; #endif if(cfg->size!=sizeof(scfg_t)) { sprintf(error,"cfg->size (%"PRIu32") != sizeof(scfg_t) (%d)" ,cfg->size,sizeof(scfg_t)); return(FALSE); } free_cfg(cfg); /* free allocated config parameters */ cfg->prepped=FALSE; /* reset prepped flag */ if(cfg->node_num<1) cfg->node_num=1; backslash(cfg->ctrl_dir); if(read_main_cfg(cfg, error)==FALSE) return(FALSE); if(prep) for(i=0;i<cfg->sys_nodes;i++) prep_dir(cfg->ctrl_dir, cfg->node_path[i], sizeof(cfg->node_path[i])); SAFECOPY(cfg->node_dir,cfg->node_path[cfg->node_num-1]); prep_dir(cfg->ctrl_dir, cfg->node_dir, sizeof(cfg->node_dir)); if(read_node_cfg(cfg, error)==FALSE) return(FALSE); if(read_msgs_cfg(cfg, error)==FALSE) return(FALSE); if(read_file_cfg(cfg, error)==FALSE) return(FALSE); if(read_xtrn_cfg(cfg, error)==FALSE) return(FALSE); if(read_chat_cfg(cfg, error)==FALSE) return(FALSE); if(read_attr_cfg(cfg, error)==FALSE) return(FALSE); #ifdef SBBS if(text!=NULL) { /* Free existing text if allocated */ free_text(text); strcpy(fname,"text.dat"); sprintf(str,"%s%s",cfg->ctrl_dir,fname); if((instream=fnopen(NULL,str,O_RDONLY))==NULL) { sprintf(error,"%d opening %s",errno,str); return(FALSE); } for(i=0;i<TOTAL_TEXT;i++) if((text[i]=readtext(&line,instream,i))==NULL) { i--; break; } fclose(instream); if(i<TOTAL_TEXT) { sprintf(error,"line %d in %s: Less than TOTAL_TEXT (%u) strings defined in %s." ,i,fname ,TOTAL_TEXT,fname); return(FALSE); } } #endif /* Override com-port settings */ cfg->com_base=0xf; /* All nodes use FOSSIL */ cfg->com_port=1; /* All nodes use "COM1" */ if(prep) prep_cfg(cfg); /* Auto-toggle daylight savings time in US time-zones */ sys_timezone(cfg); return(TRUE); }
void prep_cfg(scfg_t* cfg) { int i; #if 0 /* def __unix__ */ strlwr(cfg->text_dir); /* temporary Unix-compatibility hack */ strlwr(cfg->temp_dir); /* temporary Unix-compatibility hack */ strlwr(cfg->data_dir); /* temporary Unix-compatibility hack */ strlwr(cfg->exec_dir); /* temporary Unix-compatibility hack */ #endif /* Fix-up paths */ prep_dir(cfg->ctrl_dir, cfg->data_dir, sizeof(cfg->data_dir)); prep_dir(cfg->ctrl_dir, cfg->logs_dir, sizeof(cfg->logs_dir)); prep_dir(cfg->ctrl_dir, cfg->exec_dir, sizeof(cfg->exec_dir)); prep_dir(cfg->ctrl_dir, cfg->mods_dir, sizeof(cfg->mods_dir)); prep_dir(cfg->ctrl_dir, cfg->text_dir, sizeof(cfg->text_dir)); prep_dir(cfg->ctrl_dir, cfg->netmail_dir, sizeof(cfg->netmail_dir)); prep_dir(cfg->ctrl_dir, cfg->echomail_dir, sizeof(cfg->echomail_dir)); prep_dir(cfg->ctrl_dir, cfg->fidofile_dir, sizeof(cfg->fidofile_dir)); prep_path(cfg->netmail_sem); prep_path(cfg->echomail_sem); prep_path(cfg->inetmail_sem); #if 0 /* def __unix__ */ /* temporary hack for Unix compatibility */ strlwr(cfg->logon_mod); strlwr(cfg->logoff_mod); strlwr(cfg->newuser_mod); strlwr(cfg->login_mod); strlwr(cfg->logout_mod); strlwr(cfg->sync_mod); strlwr(cfg->expire_mod); #endif for(i=0;i<cfg->total_subs;i++) { if(!cfg->sub[i]->data_dir[0]) /* no data storage path specified */ sprintf(cfg->sub[i]->data_dir,"%ssubs",cfg->data_dir); prep_dir(cfg->ctrl_dir, cfg->sub[i]->data_dir, sizeof(cfg->sub[i]->data_dir)); /* default QWKnet tagline */ if(!cfg->sub[i]->tagline[0]) SAFECOPY(cfg->sub[i]->tagline,cfg->qnet_tagline); /* default origin line */ if(!cfg->sub[i]->origline[0]) SAFECOPY(cfg->sub[i]->origline,cfg->origline); /* A sub-board's internal code is the combination of the grp's code_prefix & the sub's code_suffix */ SAFEPRINTF2(cfg->sub[i]->code,"%s%s" ,cfg->grp[cfg->sub[i]->grp]->code_prefix ,cfg->sub[i]->code_suffix); strlwr(cfg->sub[i]->code); /* data filenames are all lowercase */ prep_path(cfg->sub[i]->post_sem); } for(i=0;i<cfg->total_libs;i++) { if(cfg->lib[i]->parent_path[0]) prep_dir(cfg->ctrl_dir, cfg->lib[i]->parent_path, sizeof(cfg->lib[i]->parent_path)); } for(i=0;i<cfg->total_dirs;i++) { if(!cfg->dir[i]->data_dir[0]) /* no data storage path specified */ sprintf(cfg->dir[i]->data_dir,"%sdirs",cfg->data_dir); prep_dir(cfg->ctrl_dir, cfg->dir[i]->data_dir, sizeof(cfg->dir[i]->data_dir)); /* A directory's internal code is the combination of the lib's code_prefix & the dir's code_suffix */ SAFEPRINTF2(cfg->dir[i]->code,"%s%s" ,cfg->lib[cfg->dir[i]->lib]->code_prefix ,cfg->dir[i]->code_suffix); strlwr(cfg->dir[i]->code); /* data filenames are all lowercase */ if(!cfg->dir[i]->path[0]) /* no file storage path specified */ sprintf(cfg->dir[i]->path,"%sdirs/%s/",cfg->data_dir,cfg->dir[i]->code); else if(cfg->lib[cfg->dir[i]->lib]->parent_path[0]) prep_dir(cfg->lib[cfg->dir[i]->lib]->parent_path, cfg->dir[i]->path, sizeof(cfg->dir[i]->path)); else prep_dir(cfg->ctrl_dir, cfg->dir[i]->path, sizeof(cfg->dir[i]->path)); prep_path(cfg->dir[i]->upload_sem); } /* make data filenames are all lowercase */ for(i=0;i<cfg->total_shells;i++) strlwr(cfg->shell[i]->code); for(i=0;i<cfg->total_gurus;i++) strlwr(cfg->guru[i]->code); for(i=0;i<cfg->total_txtsecs;i++) strlwr(cfg->txtsec[i]->code); for(i=0;i<cfg->total_xtrnsecs;i++) strlwr(cfg->xtrnsec[i]->code); for(i=0;i<cfg->total_xtrns;i++) { strlwr(cfg->xtrn[i]->code); prep_dir(cfg->ctrl_dir, cfg->xtrn[i]->path, sizeof(cfg->xtrn[i]->path)); } for(i=0;i<cfg->total_events;i++) { strlwr(cfg->event[i]->code); /* data filenames are all lowercase */ prep_dir(cfg->ctrl_dir, cfg->event[i]->dir, sizeof(cfg->event[i]->dir)); } for(i=0;i<cfg->total_xedits;i++) strlwr(cfg->xedit[i]->code); cfg->prepped=TRUE; /* data prepared for run-time, DO NOT SAVE TO DISK! */ }
void node_menu() { char str[81],savnode=0; int i,j; static int node_menu_dflt, node_bar; while(1) { for(i=0;i<cfg.sys_nodes;i++) sprintf(opt[i],"Node %d",i+1); opt[i][0]=0; j=WIN_ORG|WIN_ACT|WIN_INSACT|WIN_DELACT; if(cfg.sys_nodes>1) j|=WIN_DEL|WIN_GET; if(cfg.sys_nodes<MAX_NODES && cfg.sys_nodes<MAX_OPTS) j|=WIN_INS; if(savnode) j|=WIN_PUT; uifc.helpbuf= "Node List:\n" "\n" "This is the list of configured nodes in your system.\n" "\n" "To add a node, hit INS .\n" "\n" "To delete a node, hit DEL .\n" "\n" "To configure a node, select it using the arrow keys and hit ENTER .\n" "\n" "To copy a node's configuration to another node, first select the source\n" "node with the arrow keys and hit F5 . Then select the destination\n" "node and hit F6 .\n" ; i=uifc.list(j,0,0,13,&node_menu_dflt,&node_bar,"Nodes",opt); if(i==-1) { if(savnode) { free_node_cfg(&cfg); savnode=0; } return; } if((i&MSK_ON)==MSK_DEL) { strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); opt[2][0]=0; sprintf(str,"Delete Node %d",cfg.sys_nodes); i=1; uifc.helpbuf= "Delete Node:\n" "\n" "If you are positive you want to delete this node, select Yes. Otherwise,\n" "select No or hit ESC .\n" ; i=uifc.list(WIN_MID,0,0,0,&i,0,str,opt); if(!i) { --cfg.sys_nodes; /* free(cfg.node_path[cfg.sys_nodes]); */ cfg.new_install=new_install; write_main_cfg(&cfg,backup_level); refresh_cfg(&cfg); } continue; } if((i&MSK_ON)==MSK_INS) { strcpy(cfg.node_dir,cfg.node_path[cfg.sys_nodes-1]); i=cfg.sys_nodes+1; uifc.pop("Reading NODE.CNF..."); read_node_cfg(&cfg,error); uifc.pop(0); sprintf(str,"../node%d/",i); sprintf(tmp,"Node %d Path",i); uifc.helpbuf= "Node Path:\n" "\n" "This is the path to this node's private directory where its separate\n" "configuration and data files are stored.\n" "\n" "The drive and directory of this path can be set to any valid DOS\n" "directory that can be accessed by ALL nodes and MUST NOT be on a RAM disk\n" "or other volatile media.\n" "\n" "If you want to abort the creation of this new node, hit ESC .\n" ; j=uifc.input(WIN_MID,0,0,tmp,str,50,K_EDIT); uifc.changes=0; if(j<2) continue; truncsp(str); strcpy(cfg.node_path[i-1],str); if(str[strlen(str)-1]=='\\' || str[strlen(str)-1]=='/') str[strlen(str)-1]=0; MKDIR(str); cfg.node_num=++cfg.sys_nodes; SAFEPRINTF(cfg.node_name,"Node %u",cfg.node_num); SAFECOPY(cfg.node_phone,"N/A"); cfg.new_install=new_install; write_node_cfg(&cfg,backup_level); write_main_cfg(&cfg,backup_level); free_node_cfg(&cfg); refresh_cfg(&cfg); continue; } if((i&MSK_ON)==MSK_GET) { if(savnode) free_node_cfg(&cfg); i&=MSK_OFF; strcpy(cfg.node_dir,cfg.node_path[i]); uifc.pop("Reading NODE.CNF..."); read_node_cfg(&cfg,error); uifc.pop(0); savnode=1; continue; } if((i&MSK_ON)==MSK_PUT) { i&=MSK_OFF; strcpy(cfg.node_dir,cfg.node_path[i]); cfg.node_num=i+1; write_node_cfg(&cfg,backup_level); refresh_cfg(&cfg); uifc.changes=1; continue; } if(savnode) { free_node_cfg(&cfg); savnode=0; } strcpy(cfg.node_dir,cfg.node_path[i]); prep_dir(cfg.ctrl_dir, cfg.node_dir, sizeof(cfg.node_dir)); uifc.pop("Reading NODE.CNF..."); read_node_cfg(&cfg,error); uifc.pop(0); if(cfg.node_num!=i+1) { /* Node number isn't right? */ cfg.node_num=i+1; /* so fix it */ write_node_cfg(&cfg,backup_level); } /* and write it back */ node_cfg(); free_node_cfg(&cfg); } }
int main(int argc, char **argv) { char revision[16]; char error[512]; char *p,str[256],fname[256],ext,not[MAX_NOTS][9]; uchar *datbuf,*ixbbuf; int i,j,file,dirnum,libnum,desc_off,lines,nots=0 ,omode=O_WRONLY|O_CREAT|O_TRUNC; ulong l,m,n,cdt,misc=0,total_cdt=0,total_files=0,dir_files,datbuflen; time32_t uld,dld,now; long max_age=0; FILE *in,*out=NULL; sscanf("$Revision$", "%*s %s", revision); fprintf(stderr,"\nFILELIST v%s-%s (rev %s) - Generate Synchronet File " "Directory Lists\n" ,FILELIST_VER ,PLATFORM_DESC ,revision ); if(argc<2 || strcmp(argv[1],"-?")==0 || strcmp(argv[1],"-help")==0 || strcmp(argv[1],"--help")==0 || strcmp(argv[1],"/?")==0 ) { printf("\n usage: FILELIST <dir_code or - for ALL> [switches] [outfile]\n"); printf("\n"); printf("switches: -lib name All directories of specified library\n"); printf(" -not code Exclude specific directory\n"); printf(" -new days Include only new files in listing (days since upload)\n"); printf(" -cat Concatenate to existing outfile\n"); printf(" -pad Pad filename with spaces\n"); printf(" -hdr Include directory headers\n"); printf(" -cdt Include credit value\n"); printf(" -tot Include credit totals\n"); printf(" -uln Include uploader's name\n"); printf(" -uld Include upload date\n"); printf(" -dfd Include DOS file date\n"); printf(" -dld Include download date\n"); printf(" -dls Include total downloads\n"); printf(" -nod Exclude normal descriptions\n"); printf(" -noe Exclude normal descriptions, if extended " "exists\n"); printf(" -ext Include extended descriptions\n"); printf(" -jst Justify extended descriptions under normal\n"); printf(" -+ Include extended description indicator (+)\n"); printf(" -- Include offline file indicator (-)\n"); printf(" -* Short-hand for -pad -hdr -cdt -+ --\n"); exit(0); } p=getenv("SBBSCTRL"); if(p==NULL) { printf("\nSBBSCTRL environment variable not set.\n"); printf("\nExample: SET SBBSCTRL=/sbbs/ctrl\n"); exit(1); } now=time32(NULL); memset(&scfg,0,sizeof(scfg)); scfg.size=sizeof(scfg); SAFECOPY(scfg.ctrl_dir,p); if(chdir(scfg.ctrl_dir)!=0) fprintf(stderr,"!ERROR changing directory to: %s", scfg.ctrl_dir); printf("\nLoading configuration files from %s\n",scfg.ctrl_dir); if(!load_cfg(&scfg,NULL,TRUE,error)) { fprintf(stderr,"!ERROR loading configuration files: %s\n",error); exit(1); } SAFECOPY(scfg.temp_dir,"../temp"); prep_dir(scfg.ctrl_dir, scfg.temp_dir, sizeof(scfg.temp_dir)); dirnum=libnum=-1; if(argv[1][0]=='*' || strcmp(argv[1],"-")==0) misc|=ALL; else if(argv[1][0]!='-') { strupr(argv[1]); for(i=0;i<scfg.total_dirs;i++) if(!stricmp(argv[1],scfg.dir[i]->code)) break; if(i>=scfg.total_dirs) { printf("\nDirectory code '%s' not found.\n",argv[1]); exit(1); } dirnum=i; } for(i=1;i<argc;i++) { if(!stricmp(argv[i],"-lib")) { if(dirnum!=-1) { printf("\nBoth directory code and -lib parameters were used.\n"); exit(1); } i++; if(i>=argc) { printf("\nLibrary short name must follow -lib parameter.\n"); exit(1); } strupr(argv[i]); for(j=0;j<scfg.total_libs;j++) if(!stricmp(scfg.lib[j]->sname,argv[i])) break; if(j>=scfg.total_libs) { printf("\nLibrary short name '%s' not found.\n",argv[i]); exit(1); } libnum=j; } else if(!stricmp(argv[i],"-not")) { if(nots>=MAX_NOTS) { printf("\nMaximum number of -not options (%u) exceeded.\n" ,MAX_NOTS); exit(1); } i++; if(i>=argc) { printf("\nDirectory internal code must follow -not parameter.\n"); exit(1); } sprintf(not[nots++],"%.8s",argv[i]); } else if(!stricmp(argv[i],"-all")) { if(dirnum!=-1) { printf("\nBoth directory code and -all parameters were used.\n"); exit(1); } if(libnum!=-1) { printf("\nBoth library name and -all parameters were used.\n"); exit(1); } misc|=ALL; } else if(!stricmp(argv[i],"-new")) { i++; if(i>=argc) { printf("\nDays since upload must follow -new parameter.\n"); exit(1); } max_age=strtol(argv[i],NULL,0); } else if(!stricmp(argv[i],"-pad")) misc|=PAD; else if(!stricmp(argv[i],"-cat")) omode=O_WRONLY|O_CREAT|O_APPEND; else if(!stricmp(argv[i],"-hdr")) misc|=HDR; else if(!stricmp(argv[i],"-cdt")) misc|=CDT_; else if(!stricmp(argv[i],"-tot")) misc|=TOT; else if(!stricmp(argv[i],"-ext")) misc|=EXT; else if(!stricmp(argv[i],"-uln")) misc|=ULN; else if(!stricmp(argv[i],"-uld")) misc|=ULD; else if(!stricmp(argv[i],"-dld")) misc|=DLD; else if(!stricmp(argv[i],"-dfd")) misc|=DFD; else if(!stricmp(argv[i],"-dls")) misc|=DLS; else if(!stricmp(argv[i],"-nod")) misc|=NOD; else if(!stricmp(argv[i],"-jst")) misc|=(EXT|JST); else if(!stricmp(argv[i],"-noe")) misc|=(EXT|NOE); else if(!stricmp(argv[i],"-+")) misc|=PLUS; else if(!stricmp(argv[i],"--")) misc|=MINUS; else if(!stricmp(argv[i],"-*")) misc|=(HDR|PAD|CDT_|PLUS|MINUS); else if(i!=1) { if(argv[i][0]=='*' || strcmp(argv[i],"-")==0) { misc|=AUTO; continue; } if((j=nopen(argv[i],omode))==-1) { printf("\nError opening/creating %s for output.\n",argv[i]); exit(1); } out=fdopen(j,"wb"); } } if(!out && !(misc&AUTO)) { printf("\nOutput file not specified, using FILES.BBS in each " "directory.\n"); misc|=AUTO; } for(i=0;i<scfg.total_dirs;i++) { dir_files=0; if(!(misc&ALL) && i!=dirnum && scfg.dir[i]->lib!=libnum) continue; for(j=0;j<nots;j++) if(!stricmp(not[j],scfg.dir[i]->code)) break; if(j<nots) continue; if(misc&AUTO && scfg.dir[i]->seqdev) /* CD-ROM */ continue; printf("\n%-*s %s",LEN_GSNAME,scfg.lib[scfg.dir[i]->lib]->sname,scfg.dir[i]->lname); sprintf(str,"%s%s.ixb",scfg.dir[i]->data_dir,scfg.dir[i]->code); if((file=nopen(str,O_RDONLY))==-1) continue; l=filelength(file); if(misc&AUTO) { sprintf(str,"%sFILES.BBS",scfg.dir[i]->path); if((j=nopen(str,omode))==-1) { printf("\nError opening/creating %s for output.\n",str); exit(1); } out=fdopen(j,"wb"); } if(misc&HDR) { sprintf(fname,"%-*s %-*s Files: %4lu" ,LEN_GSNAME,scfg.lib[scfg.dir[i]->lib]->sname ,LEN_SLNAME,scfg.dir[i]->lname,l/F_IXBSIZE); fprintf(out,"%s\r\n",fname); memset(fname,'-',strlen(fname)); fprintf(out,"%s\r\n",fname); } if(!l) { close(file); if(misc&AUTO) fclose(out); continue; } if((ixbbuf=(uchar *)malloc(l))==NULL) { close(file); if(misc&AUTO) fclose(out); printf("\7ERR_ALLOC %s %lu\n",str,l); continue; } if(read(file,ixbbuf,l)!=(int)l) { close(file); if(misc&AUTO) fclose(out); printf("\7ERR_READ %s %lu\n",str,l); free((char *)ixbbuf); continue; } close(file); sprintf(str,"%s%s.dat",scfg.dir[i]->data_dir,scfg.dir[i]->code); if((file=nopen(str,O_RDONLY))==-1) { printf("\7ERR_OPEN %s %u\n",str,O_RDONLY); free((char *)ixbbuf); if(misc&AUTO) fclose(out); continue; } datbuflen=filelength(file); if((datbuf=malloc(datbuflen))==NULL) { close(file); printf("\7ERR_ALLOC %s %lu\n",str,datbuflen); free((char *)ixbbuf); if(misc&AUTO) fclose(out); continue; } if(read(file,datbuf,datbuflen)!=(int)datbuflen) { close(file); printf("\7ERR_READ %s %lu\n",str,datbuflen); free((char *)datbuf); free((char *)ixbbuf); if(misc&AUTO) fclose(out); continue; } close(file); m=0L; while(m<l && !ferror(out)) { for(j=0;j<12 && m<l;j++) if(j==8) str[j]=ixbbuf[m]>' ' ? '.' : ' '; else str[j]=ixbbuf[m++]; /* Turns FILENAMEEXT into FILENAME.EXT */ str[j]=0; unpadfname(str,fname); n=ixbbuf[m]|((long)ixbbuf[m+1]<<8)|((long)ixbbuf[m+2]<<16); uld=(ixbbuf[m+3]|((long)ixbbuf[m+4]<<8)|((long)ixbbuf[m+5]<<16) |((long)ixbbuf[m+6]<<24)); dld=(ixbbuf[m+7]|((long)ixbbuf[m+8]<<8)|((long)ixbbuf[m+9]<<16) |((long)ixbbuf[m+10]<<24)); m+=11; if(n>=datbuflen /* index out of bounds */ || datbuf[n+F_DESC+LEN_FDESC]!=CR) { /* corrupted data */ fprintf(stderr,"\n\7%s%s is corrupted!\n" ,scfg.dir[i]->data_dir,scfg.dir[i]->code); exit(-1); } if(max_age && ((now - uld) / (24*60*60) > max_age)) continue; fprintf(out,"%-12.12s",misc&PAD ? str : fname); total_files++; dir_files++; if(misc&PLUS && datbuf[n+F_MISC]!=ETX && (datbuf[n+F_MISC]-' ')&FM_EXTDESC) fputc('+',out); else fputc(' ',out); desc_off=12; if(misc&(CDT_|TOT)) { getrec((char *)&datbuf[n],F_CDT,LEN_FCDT,str); cdt=atol(str); total_cdt+=cdt; if(misc&CDT_) { fprintf(out,"%7lu",cdt); desc_off+=7; } } if(misc&MINUS) { sprintf(str,"%s%s",scfg.dir[i]->path,fname); if(!fexistcase(str)) fputc('-',out); else fputc(' ',out); } else fputc(' ',out); desc_off++; if(misc&DFD) { sprintf(str,"%s%s",scfg.dir[i]->path,fname); fprintf(out,"%s ",unixtodstr(&scfg,(time32_t)fdate(str),str)); desc_off+=9; } if(misc&ULD) { fprintf(out,"%s ",unixtodstr(&scfg,uld,str)); desc_off+=9; } if(misc&ULN) { getrec((char *)&datbuf[n],F_ULER,25,str); fprintf(out,"%-25s ",str); desc_off+=26; } if(misc&DLD) { fprintf(out,"%s ",unixtodstr(&scfg,dld,str)); desc_off+=9; } if(misc&DLS) { getrec((char *)&datbuf[n],F_TIMESDLED,5,str); j=atoi(str); fprintf(out,"%5u ",j); desc_off+=6; } if(datbuf[n+F_MISC]!=ETX && (datbuf[n+F_MISC]-' ')&FM_EXTDESC) ext=1; /* extended description exists */ else ext=0; /* it doesn't */ if(!(misc&NOD) && !(misc&NOE && ext)) { getrec((char *)&datbuf[n],F_DESC,LEN_FDESC,str); fprintf(out,"%s",str); } if(misc&EXT && ext) { /* Print ext desc */ sprintf(str,"%s%s.exb",scfg.dir[i]->data_dir,scfg.dir[i]->code); if(!fexist(str)) continue; if((j=nopen(str,O_RDONLY))==-1) { printf("\7ERR_OPEN %s %u\n",str,O_RDONLY); continue; } if((in=fdopen(j,"rb"))==NULL) { close(j); continue; } fseek(in,(n/F_LEN)*512L,SEEK_SET); lines=0; if(!(misc&NOE)) { fprintf(out,"\r\n"); lines++; } while(!feof(in) && !ferror(in) && ftell(in)<(long)((n/F_LEN)+1)*512L) { if(!fgets(str,128,in) || !str[0]) break; stripctrlz(str); if(lines) { if(misc&JST) fprintf(out,"%*s",desc_off,""); fputc(' ',out); /* indent one character */ } fprintf(out,"%s",str); lines++; } fclose(in); } fprintf(out,"\r\n"); } free((char *)datbuf); free((char *)ixbbuf); if(dir_files) fprintf(out,"\r\n"); /* blank line at end of dir */ if(misc&AUTO) fclose(out); } if(misc&TOT && !(misc&AUTO)) fprintf(out,"TOTALS\n------\n%lu credits/bytes in %lu files.\r\n" ,total_cdt,total_files); printf("\nDone.\n"); return(0); }
int main(int argc, char **argv) { GtkWidget *w; int i; char str[1025]; char flags[33]; GtkListStore *lstore = NULL; GtkTreeSelection *lsel; char glade_path[MAX_PATH+1]; char *p; gtk_init(&argc, &argv); glade_init(); /* Read .cfg files here */ memset(&cfg,0,sizeof(cfg)); p=getenv("SBBSCTRL"); if(p==NULL) { display_message("Environment Error","SBBSCTRL not set","gtk-dialog-error"); return(-1); } SAFECOPY(cfg.ctrl_dir, p); prep_dir("",cfg.ctrl_dir,sizeof(cfg.ctrl_dir)); if(!isdir(cfg.ctrl_dir)) { display_message("Environment Error","SBBSCTRL does not point to a directory","gtk-dialog-error"); return(-1); } cfg.size=sizeof(cfg); if(!load_cfg(&cfg, NULL, TRUE, str)) { fprintf(stderr,"Cannot load configuration data (%s)",str); return; } /* load the interface */ strcpy(glade_path, argv[0]); strcpy(getfname(glade_path), "gtkuserlist.glade"); lxml = glade_xml_new(glade_path, "UserListWindow", NULL); if(lxml==NULL) { fprintf(stderr,"Could not locate UserListWindow widget\n"); return; } /* connect the signals in the interface */ glade_xml_signal_autoconnect(lxml); /* Set up user list */ w=glade_xml_get_widget(lxml, "lUserList"); lstore = gtk_list_store_new(17 ,G_TYPE_INT ,G_TYPE_STRING ,G_TYPE_STRING ,G_TYPE_INT ,G_TYPE_INT ,G_TYPE_STRING ,G_TYPE_STRING ,G_TYPE_STRING ,G_TYPE_STRING ,G_TYPE_STRING ,G_TYPE_STRING ,G_TYPE_STRING ,G_TYPE_INT ,G_TYPE_STRING ,G_TYPE_STRING ,G_TYPE_INT ,G_TYPE_INT ); gtk_tree_view_set_model(GTK_TREE_VIEW(w), GTK_TREE_MODEL(lstore)); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(w) ,0 ,"Num" ,gtk_cell_renderer_text_new() ,"text" ,0 ,NULL); gtk_tree_view_column_set_sort_column_id( gtk_tree_view_get_column( GTK_TREE_VIEW(w), 0 ) ,0 ); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(w) ,1 ,"Alias" ,gtk_cell_renderer_text_new() ,"text" ,1 ,NULL); gtk_tree_view_column_set_sort_column_id( gtk_tree_view_get_column( GTK_TREE_VIEW(w), 1 ) ,1 ); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(w) ,2 ,"Name" ,gtk_cell_renderer_text_new() ,"text" ,2 ,NULL); gtk_tree_view_column_set_sort_column_id( gtk_tree_view_get_column( GTK_TREE_VIEW(w), 2 ) ,2 ); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(w) ,3 ,"Lev" ,gtk_cell_renderer_text_new() ,"text" ,3 ,NULL); gtk_tree_view_column_set_sort_column_id( gtk_tree_view_get_column( GTK_TREE_VIEW(w), 3 ) ,3 ); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(w) ,4 ,"Age" ,gtk_cell_renderer_text_new() ,"text" ,4 ,NULL); gtk_tree_view_column_set_sort_column_id( gtk_tree_view_get_column( GTK_TREE_VIEW(w), 4 ) ,4 ); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(w) ,5 ,"Sex" ,gtk_cell_renderer_text_new() ,"text" ,5 ,NULL); gtk_tree_view_column_set_sort_column_id( gtk_tree_view_get_column( GTK_TREE_VIEW(w), 5 ) ,5 ); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(w) ,6 ,"Location" ,gtk_cell_renderer_text_new() ,"text" ,6 ,NULL); gtk_tree_view_column_set_sort_column_id( gtk_tree_view_get_column( GTK_TREE_VIEW(w), 6 ) ,6 ); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(w) ,7 ,"Protocol" ,gtk_cell_renderer_text_new() ,"text" ,7 ,NULL); gtk_tree_view_column_set_sort_column_id( gtk_tree_view_get_column( GTK_TREE_VIEW(w), 7 ) ,7 ); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(w) ,8 ,"Address" ,gtk_cell_renderer_text_new() ,"text" ,8 ,NULL); gtk_tree_view_column_set_sort_column_id( gtk_tree_view_get_column( GTK_TREE_VIEW(w), 8 ) ,8 ); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(w) ,9 ,"Host Name" ,gtk_cell_renderer_text_new() ,"text" ,9 ,NULL); gtk_tree_view_column_set_sort_column_id( gtk_tree_view_get_column( GTK_TREE_VIEW(w), 9 ) ,9 ); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(w) ,10 ,"Phone" ,gtk_cell_renderer_text_new() ,"text" ,10 ,NULL); gtk_tree_view_column_set_sort_column_id( gtk_tree_view_get_column( GTK_TREE_VIEW(w), 10 ) ,10 ); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(w) ,11 ,"Email" ,gtk_cell_renderer_text_new() ,"text" ,11 ,NULL); gtk_tree_view_column_set_sort_column_id( gtk_tree_view_get_column( GTK_TREE_VIEW(w), 11 ) ,11 ); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(w) ,12 ,"Logons" ,gtk_cell_renderer_text_new() ,"text" ,12 ,NULL); gtk_tree_view_column_set_sort_column_id( gtk_tree_view_get_column( GTK_TREE_VIEW(w), 12 ) ,12 ); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(w) ,13 ,"First On" ,gtk_cell_renderer_text_new() ,"text" ,13 ,NULL); gtk_tree_view_column_set_sort_column_id( gtk_tree_view_get_column( GTK_TREE_VIEW(w), 13 ) ,15 ); gtk_tree_view_insert_column_with_attributes( GTK_TREE_VIEW(w) ,14 ,"Last On" ,gtk_cell_renderer_text_new() ,"text" ,14 ,NULL); gtk_tree_view_column_set_sort_column_id( gtk_tree_view_get_column( GTK_TREE_VIEW(w), 14 ) ,16 ); lsel = gtk_tree_view_get_selection (GTK_TREE_VIEW (w)); gtk_tree_selection_set_mode (lsel, GTK_SELECTION_MULTIPLE); g_signal_connect (G_OBJECT (lsel), "changed", G_CALLBACK (update_userlist_sensitive_callback), NULL); /* Set up users */ update_userlist_callback(GTK_WIDGET(w), NULL); update_userlist_sensitive_callback(lsel, NULL); /* Set up quick validation values */ w=glade_xml_get_widget(lxml, "cQuickValidate"); gtk_combo_box_set_active(GTK_COMBO_BOX(w), 0); for(i=0;i<10;i++) { sprintf(str,"%d SL: %-2d F1: %s",i,cfg.val_level[i],ltoaf(cfg.val_flags1[i],flags)); gtk_combo_box_append_text(GTK_COMBO_BOX(w), str); } /* Show 'er to the user */ gtk_window_present(GTK_WINDOW(glade_xml_get_widget(lxml, "UserListWindow"))); gtk_main(); }