/* $Id$ */ /* tool to convert sob bbs to ptt bbs, based on sob 20030803 pack */ #include "bbs.h" typedef struct { char filename[32]; char pad1[2]; char owner[14]; char date[6]; char title[73]; unsigned char filemode; } sob_fileheader_t; #define SOB_FILE_MARKED 0x02 int convert(const char *oldpath, char *newpath) { int fd; char *p; char buf[PATHLEN]; sob_fileheader_t whdr; fileheader_t fhdr; setadir(buf, oldpath); if ((fd = open(buf, O_RDONLY, 0)) == -1) return -1; while (read(fd, &whdr, sizeof(whdr)) == sizeof(whdr)) { snprintf(buf, sizeof(buf), "%s/%s", oldpath, whdr.filename); if (dashd(buf)) { /* folder */ stampdir(newpath, &fhdr); convert(buf, newpath); } else { /* article */ stampfile(newpath, &fhdr); fhdr.modified = dasht(buf); if (whdr.filemode & SOB_FILE_MARKED) fhdr.filemode |= FILE_MARKED; copy_file(buf, newpath); } p = strrchr(newpath, '/'); *p = '\0'; strlcpy(fhdr.title, whdr.title, sizeof(fhdr.title)); strlcpy(fhdr.owner, whdr.owner, sizeof(fhdr.owner)); strlcpy(fhdr.date, whdr.date, sizeof(fhdr.date)); setadir(buf, newpath); append_record(buf, &fhdr, sizeof(fhdr)); } close(fd); return 0; } int main(int argc, char *argv[]) { char buf[PATHLEN]; char *path; char *board; int opt; int trans_man = 0; while ((opt = getopt(argc, argv, "m")) != -1) { switch (opt) { case 'm': trans_man = 1; break; default: fprintf(stderr, "%s [-m] \n", argv[0]); fprintf(stderr, " -m convert man (default is board)\n"); } } if ((argc - optind + 1) < 2) { fprintf(stderr, "%s [-m] \n", argv[0]); fprintf(stderr, " -m convert man (default is board)\n"); return 0; } path = argv[optind]; board = argv[optind+1]; if (!dashd(path)) { fprintf(stderr, "%s is not directory\n", path); return 0; } attach_SHM(); opt = getbnum(board); if (opt == 0) { fprintf(stderr, "ERR: board `%s' not found\n", board); return 0; } if (trans_man) setapath(buf, board); else setbpath(buf, board); if (!dashd(buf)) { fprintf(stderr, "%s is not directory\n", buf); return 0; } convert(path, buf); if (trans_man) { strlcat(buf, "/.rebuild", sizeof(buf)); if ((opt = open(buf, O_CREAT, 0640)) > 0) close(opt); } else touchbtotal(opt); return 0; }