diff options
author | wens <wens@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2006-12-28 00:38:47 +0800 |
---|---|---|
committer | wens <wens@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2006-12-28 00:38:47 +0800 |
commit | 1132212a3c0286eb4103768c1897f2387ae27cc8 (patch) | |
tree | 530fbdff6b020eb3ce56e123d7171f8fe901c38b | |
parent | 0e6237c6563b4ac2d2d69655c204bf2432af9cd2 (diff) | |
download | pttbbs-1132212a3c0286eb4103768c1897f2387ae27cc8.tar pttbbs-1132212a3c0286eb4103768c1897f2387ae27cc8.tar.gz pttbbs-1132212a3c0286eb4103768c1897f2387ae27cc8.tar.bz2 pttbbs-1132212a3c0286eb4103768c1897f2387ae27cc8.tar.lz pttbbs-1132212a3c0286eb4103768c1897f2387ae27cc8.tar.xz pttbbs-1132212a3c0286eb4103768c1897f2387ae27cc8.tar.zst pttbbs-1132212a3c0286eb4103768c1897f2387ae27cc8.zip |
wretch bbs man converter
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@3461 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r-- | util/Makefile | 1 | ||||
-rw-r--r-- | util/wretch_man.c | 115 |
2 files changed, 116 insertions, 0 deletions
diff --git a/util/Makefile b/util/Makefile index b2bff5ce..fca3d4e7 100644 --- a/util/Makefile +++ b/util/Makefile @@ -26,6 +26,7 @@ CPROG_WITH_UTIL= \ reaper buildAnnounce inndBM mailangel \ outmail chkhbf checkmoney merge_dir \ transman angel gamblegive checkdir \ + wretch_man \ chesscountry tunepasswd buildir xchatd # 下面這些程式, 會直接被 compile diff --git a/util/wretch_man.c b/util/wretch_man.c new file mode 100644 index 00000000..447c8867 --- /dev/null +++ b/util/wretch_man.c @@ -0,0 +1,115 @@ +/* $Id$ */ +/* tool to convert wretch bbs to ptt bbs */ + +#include "bbs.h" + +struct wretch_fheader_t { + time4_t chrono; + char pad[4]; + int xmode; + int xid; + char xname[32]; /* 檔案名稱 */ + char owner[80]; /* 作者 (E-mail address) */ + char nick[50]; /* 暱稱 */ + char date[9]; /* [96/12/01] */ + char title[73]; /* 主題 (TTLEN + 1) */ + char pad2[4]; +}; + +#define GEM_RESTRICT 0x0800 /* 限制級精華區,須 manager 才能看 */ +#define GEM_RESERVED 0x1000 /* 限制級精華區,須 sysop 才能更改 */ +#define GEM_FOLDER 0x00010000 /* folder / article */ +#define GEM_BOARD 0x00020000 /* 看板精華區 */ + +static const char radix32[32] = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', + 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', +}; + +char *path; +char *board; + +int transman(char *fname, char *newpath) +{ + int fd; + char *p; + char buf[PATHLEN]; + struct wretch_fheader_t whdr; + fileheader_t fhdr; + + if (fname[0] == '.') + snprintf(buf, PATHLEN, "%s/%s", path, fname); + else + snprintf(buf, PATHLEN, "%s/%c/%s", path, fname[7], fname); + + if ((fd = open(buf, O_RDONLY, 0)) == -1) + return -1; + + while (read(fd, &whdr, sizeof(whdr)) == sizeof(whdr)) { + if (!(whdr.xmode & 0xffff0000)) { + /* article */ + stampfile(newpath, &fhdr); + strlcpy(fhdr.title, "◇ ", sizeof(fhdr.title)); + + if (whdr.xname[0] == '@') + snprintf(buf, sizeof(buf), "%s/@/%s", newpath, whdr.xname); + else + snprintf(buf, sizeof(buf), "%s/%c/%s", newpath, whdr.xname[7], whdr.xname); + + copy_file(buf, newpath); + } + else if (whdr.xmode & GEM_FOLDER) { + /* folder */ + stampdir(newpath, &fhdr); + strlcpy(fhdr.title, "◆ ", sizeof(fhdr.title)); + + transman(whdr.xname, newpath); + } + + p = strrchr(newpath, '/'); + *p = '\0'; + + if (whdr.xmode & 0x0800) + fhdr.filemode |= FILE_BM; + + strncat(fhdr.title, whdr.title, sizeof(fhdr.title) - strlen(fhdr.title) - 1); + strlcpy(fhdr.owner, whdr.owner, sizeof(fhdr.title)); + + setadir(buf, newpath); + append_record(buf, &fhdr, sizeof(fhdr)); + } + + close(fd); + return 0; +} + +int main(int argc, char *argv[]) +{ + char buf[PATHLEN]; + + if (argc < 2) { + printf("%s <path> <board>\n", argv[0]); + return 0; + } + + path = argv[1]; + board = argv[2]; + + if (!dashd(path)) { + printf("%s is not directory\n", path); + return 0; + } + + setapath(buf, board); + + if (!dashd(buf)) { + printf("%s is not directory\n", buf); + return 0; + } + + transman(".DIR", buf); + + return 0; +} |