/* RECENT file generator & INDEX file adder. Coded by Jani "Flame / Pygmy Projects" Vaarala. TO DO: Compile: gcc -I/usr/include ms_recent.c -o ms_recent chmod u+r,u+w,u+x,g+r,g+w,g+x,o-r,o-w,o-x ms_recent */ #include #include #include #include #include #include #include /* #include */ #include #define MAIN_PATH "/ftp-service/ftp/pub/msdos/" #define INCOMING_PATH "/ftp-service/ftp/pub/msdos/incoming/checked/" #define MAX_PATH 1024 #define README_SCAN ".txt" #define RECENT_ERR "RECENT.ERR" #define MAX_LINE 1024 #define CP_BUFSIZE 10240 #define INDEX_NAME "00index.txt" #define SEEK_CUR 1 /* miksei tata loydy includeista ?*/ int flm_readline(FILE *,char *); int flm_findeol(char *,int); void flm_strtolow(char *); int flm_copyfile(char *,char *); struct flm_entry { char nimi[MAX_PATH+1]; struct flm_entry *entrii; }; /* hmmm... mitens GCC:ssa ? Tarviiko lisaa ? */ long __stack = 10240; void main() { DIR *dirri; FILE *omaf,*errorf; struct dirent *direntti; struct flm_entry ekaentry; struct flm_entry *curentry,*oldentry; struct stat statti; char linebuf[MAX_LINE+1],desc[MAX_LINE+1]; char movedir[MAX_LINE+1]; char path[MAX_PATH+1]; int i,j,k,fhandle,koko; char *t1,*t2,*t3; curentry = &ekaentry; ekaentry.entrii = NULL; /* Avataan current hakemisto */ if(!(dirri=opendir(INCOMING_PATH))) { printf("Couldn't open INCOMING dir!\n"); exit(0); } /* Luupataan kaikki *.* filet lapi, jotka eivat sisalla .txt paatetta. Tallennetaan taulukkoon. SYY: readdir():n aikana filejen kasittely *EI* ole turvallista. */ for(;;) { if(!(direntti = readdir(dirri))) break; i = strlen(direntti->d_name)-strlen(README_SCAN); j = strcmp(&((direntti->d_name)[i]),README_SCAN); if(j) { /* Tullaan tanne vain, jos *EI* ole *.txt paate. */ strcpy(curentry->nimi,direntti->d_name); curentry->entrii = (struct flm_entry *)malloc(sizeof(struct flm_entry)); curentry = curentry->entrii; *(curentry->nimi) = '\0'; curentry->entrii = NULL; } } closedir(dirri); if(!(errorf=fopen(RECENT_ERR,"w"))) { printf("Unable to open file: %s for write!\n",RECENT_ERR); exit(0); } curentry = &ekaentry; for(;;) { if((*(curentry->nimi))=='\0') { free(curentry); break; } /* Etsitaan filenamesta '.' */ if(!(t1=strstr((curentry->nimi),"."))) { oldentry = curentry; curentry = curentry->entrii; free(oldentry); continue; } /* Jos ei loytynyt --> seuraava file kasittelyyn */ t2 = (char *)malloc(sizeof(char)*(strlen(curentry->nimi)+strlen(README_SCAN)+strlen(INCOMING_PATH)+1)); strcpy(t2,INCOMING_PATH); strcpy(t2+strlen(INCOMING_PATH),curentry->nimi); strcpy((t2+(t1-curentry->nimi)+strlen(INCOMING_PATH)),README_SCAN); t3 = (char *)malloc(sizeof(char)*(strlen(curentry->nimi)+strlen(INCOMING_PATH)+1)); strcpy(t3,INCOMING_PATH); strcpy(t3+strlen(INCOMING_PATH),curentry->nimi); /* Avataan readme file */ if(!(omaf=fopen(t2,"r"))) { free(t2); free(t3); oldentry = curentry; curentry = curentry->entrii; free(oldentry); /* fprintf(errorf,"Can't find readme file: %s\n",t2);*/ continue; } k = 0; for(i=1;i;) { i = flm_readline(omaf,linebuf); flm_strtolow(linebuf); if(t1=strstr(linebuf,"short:")) { /* Short fieldi loytyi */ t1 += 6; /* "short:" yli. /* White spacet yli */ for(;(*t1==' ');t1++) ; /* Kopataan talteen */ strcpy(desc,t1); k++; } if(t1=strstr(linebuf,"type:")) { /* Type fieldi loytyi */ t1 += 5; /* "type:" yli. /* White spacet yli */ for(;(*t1==' ');t1++) ; /* Kopataan talteen */ strcpy(movedir,t1); k++; } if(k==2) break; } fclose(omaf); if((fhandle=open(t3,O_RDONLY,NULL))==-1) { fprintf(errorf,"Can't open() file: %s\n",t3); exit(0); } fstat(fhandle,&statti); close(fhandle); /* Haetaan pituus. Konvertoidaan kiloiksi. */ koko = (statti.st_size/1024)+1; /* Tulostetaan tiedot STDOUTtiin */ sprintf(path,"%s/%s",movedir,curentry->nimi); printf("%4dK %-25s %-45s\n",koko,path,desc); /* Siirretaan file paikalleen */ sprintf(path,"%s%s/%s",MAIN_PATH,movedir,curentry->nimi); if(!flm_copyfile(t3,path)) fprintf(errorf,"Can't COPY file %s to %s\n",curentry->nimi,path); /* Oikkarit kohdalleen */ sprintf(linebuf,"chmod u+r,u+w,g+r,g+w,o+r,o-w %s",path); system(linebuf); /* Kehitetaan INDEX listaan yks entry lisaa */ sprintf(path,"%s%s/%s",MAIN_PATH,movedir,INDEX_NAME); omaf = fopen(path,"a"); fprintf(omaf,"%-15s %-.63s\n",curentry->nimi,desc); fclose(omaf); /* Toteutetaan kohtalaisen "safe" sortti index fileelle. Jos epaonnistuu, niin jaljelle jaa esim. msdos alueella 00index.txt_old */ sprintf(linebuf,"mv %s %s_old",path,path); system(linebuf); sprintf(linebuf,"sort < %s_old > %s",path,path); system(linebuf); sprintf(linebuf,"rm %s_old",path); system(linebuf); sprintf(linebuf,"chmod u+r,u+w,g+r,g+w,o+r,o-w %s",path); system(linebuf); oldentry = curentry; curentry = curentry->entrii; free(oldentry); free(t2); free(t3); } fclose(errorf); } int flm_readline(FILE *fp,char *p) { int i,act; /* fpos_t pos; niinpaniin .. hyvin toimii metsossa ;;) */ if(feof(fp)) return(0); /* Haetaan tamanhetkinen filen pos */ /* if(fgetpos(fp,&pos)) return(0); */ act = fread(p,sizeof(char),MAX_LINE-1,fp); i = flm_findeol(p,act); p[i] = '\0'; /* Palataan kohtaan, joka ennen latausta */ /* fsetpos(fp,&pos); */ /* Kait taakin toimii ... huh ... */ fseek(fp,-act,SEEK_CUR); /* Eteenpain filessa .. Seuraavalle riville */ if(fseek(fp,i+1,SEEK_CUR)==-1) return(0); else return(1); } int flm_findeol(char *in,int limit) { int i; for(i=0;i