/* $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] <path> <board>\n", argv[0]);
		fprintf(stderr, "  -m convert man (default is board)\n");
	}
    }

    if ((argc - optind + 1) < 2) {
	fprintf(stderr, "%s [-m] <path> <board>\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;
}