精華區beta SetupBBS 關於我們 聯絡資訊
/*-------------------------------------------------------*/ /* util/buildir.c ( NTHU CS MapleBBS Ver 2.36.sob )*/ /*-------------------------------------------------------*/ /* target : Maple/Phoenix/Secret_Lover .DIR 重建 */ /* create : 95/03/29 */ /* update : 96/12/19 */ /*-------------------------------------------------------*/ #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/dir.h> #include <fcntl.h> #include <time.h> #include <string.h> #include "config.h" #include "struct.h" #ifndef MAXPATHLEN #define MAXPATHLEN 1024 #endif int alphasort(); int dashl(fname) char *fname; { struct stat st; return (lstat(fname, &st) == 0 && S_ISLNK(st.st_mode)); } dashf(fname) char *fname; { struct stat st; return (stat(fname, &st) == 0 && S_ISREG(st.st_mode)); } int dashd(fname) char *fname; { struct stat st; return (stat(fname, &st) == 0 && S_ISDIR(st.st_mode)); } char* mono(char* s) { int i, j; static char ans[200]; for (i = j = 0; s[i] && j < 199; i++) if (s[i] == 27) while (s[++i] && s[i] != 'm') ; else ans[j++] = s[i]; ans[j] = 0; return ans; } int dirselect(dir) struct direct *dir; { register char *name = dir->d_name; return (strchr("MDSGH", *name) && name[1] == '.'); } main(argc, argv) int argc; char **argv; { int fdir, i, j, wrong; struct stat st; char genbuf[512], path[256], *ptr, *name, fname[MAXPATHLEN]; FILE *fp; int total, count; fileheader fhdr; struct direct **dirlist; time_t filetime; struct tm *ptime; if (argc != 2) { printf("Usage:\t%s <path>\n", argv[0]); exit(-1); } ptr = argv[1]; sprintf(path, "%s/.DIR", ptr); fdir = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); if (fdir == -1) { printf(".DIR create error\n"); exit(-1); } total = scandir(ptr, &dirlist, dirselect, alphasort); ptr = strrchr(path, '.'); for (count = 0; count < total; count++) { name = dirlist[count]->d_name; strcpy(ptr, name); wrong = 1; if (!stat(path, &st)) { if (st.st_size && (fp = fopen(path, "r"))) { fgets(genbuf, 256, fp); if (!strncmp(genbuf, "作者: ", 6) || !strncmp(genbuf, "發信人: ", 8)) { bzero(&fhdr, sizeof(fhdr)); i = 5; while (genbuf[i] != ' ') i++; while (genbuf[i] == ' ') i++; j = i + 1; while (genbuf[j] != ' ') j++; strcpy(fhdr.filename, name); filetime = atoi(name + 2); j -= i; if(j > IDLEN +1) j = IDLEN+1; strncpy(fhdr.owner, &genbuf[i], j); strtok(fhdr.owner, " .@\t\n\r"); if (strtok(NULL, " .@\t\n\r")) strcat(fhdr.owner, "."); while (fgets(genbuf, 256, fp)) { if (!strncmp(genbuf, "標題: ", 6) || !strncmp(genbuf, "標 題: ", 8)) { i = 5; while (genbuf[i] != ' ') i++; while (genbuf[i] == ' ') i++; if (name = strchr(genbuf + i, '\n')) name[0] = '\0'; strncpy(fhdr.title, genbuf + i, TTLEN); if (filetime > 740000000) { ptime = localtime(&filetime); sprintf(fhdr.date, "%2d/%02d", ptime->tm_mon + 1, ptime->tm_mday); } else { strcpy(fhdr.date, " "); } fhdr.filemode = FILE_READ; if(!fhdr.title[0]) strcpy(fhdr.title, name); write(fdir, &fhdr, sizeof(fhdr)); wrong = 0; break; } } } fclose(fp); } } if (wrong) { bzero(&fhdr, sizeof(fhdr)); if (st.st_size && (fp = fopen(path, "r"))) { fgets(genbuf, 256, fp); if (!strncmp(genbuf, "⊙ 歡迎光臨", 11)) { strcpy(fhdr.title, "會議;33m記錄m"); } while (fgets(genbuf, 256, fp)) { if (!strncmp(genbuf, ";35m", 7)) { strtok(genbuf, " :"); if (strtok(NULL, " :")) sprintf(fhdr.title, "對話記錄 ;36m(%s)m",mono(genbuf)); } if (!strncmp(genbuf, ";33;46m★", 12) || !strncmp(genbuf, "To", 2)) strcpy(fhdr.title, "熱線1m記錄m"); } fclose(fp); } strcpy(fhdr.filename, name); if (filetime > 740000000) { ptime = localtime(&filetime); sprintf(fhdr.date, "%2d/%02d", ptime->tm_mon + 1, ptime->tm_mday); } else { strcpy(fhdr.date, " "); } fhdr.filemode = FILE_READ; strcpy(fhdr.owner, "[備.忘.錄]"); if(!fhdr.title[0]) { if(strstr(name,"M")!=NULL) sprintf(fhdr.title, "◇ %s",name); else if(strstr(name,"D")!=NULL) sprintf(fhdr.title, "◆ %s",name); else if(strstr(name,"S")!=NULL) { sprintf(fname,"%s/%s",argv[1],name); if ((i = readlink(fname, fname, MAXPATHLEN-1)) >= 0) { fname[i] = '\0'; if(dashf(fname)) { if(!strcmp(strrchr(fname,'.'),".index")) sprintf(fhdr.title, "◎ %s",name); else sprintf(fhdr.title, "○ %s",name); } else if(dashd(fname)) sprintf(fhdr.title, "● %s",name); else if(dashl(fname)) sprintf(fhdr.title, "? %s",name); else sprintf(fhdr.title, "※ %s",name); } } else strcpy(fhdr.title, name); } if(!fhdr.filename[0]) strcpy(fhdr.filename, name); if(!fhdr.owner[0]) strcpy(fhdr.owner, "Recoverd"); write(fdir, &fhdr, sizeof(fhdr)); printf("%s recovered\n", path); } } close(fdir); }