/* $Id$ */
#include "bbs.h"
#include "cmbbs.h"
// New style (Regform2) file names:
#define FN_REGFORM "regform" // registration form in user home
#define FN_REGFORM_LOG "regform.log" // regform history in user home
#define FN_REQLIST "reg.wait" // request list file, in global directory (replacing fn_register)
#define FN_OLDREG "register.new"
////////////////////////////////////////////////////////////////////////////
// Regform Utilities
////////////////////////////////////////////////////////////////////////////
// TODO define and use structure instead, even in reg request file.
typedef struct {
// current format:
// (optional) num: unum, date
// [0] uid: xxxxx (IDLEN=12)
// [1] name: RRRRRR (20)
// [2] career: YYYYYYYYYYYYYYYYYYYYYYYYYY (40)
// [3] addr: TTTTTTTTT (50)
// [4] phone: 02DDDDDDDD (20)
// [5] email: x (50) (deprecated)
// [6] mobile: (deprecated)
// [7] ----
// lasthost: 16
char userid[IDLEN+1];
char exist;
char online;
char pad [ 5]; // IDLEN(12)+1+1+1+5=20
char name [20];
char career[40];
char addr [50];
char phone [20];
} RegformEntry;
// regform format utilities
int
load_regform_entry(RegformEntry *pre, FILE *fp)
{
char buf[STRLEN];
char *v;
memset(pre, 0, sizeof(RegformEntry));
while (fgets(buf, sizeof(buf), fp))
{
if (buf[0] == '-')
break;
buf[sizeof(buf)-1] = 0;
v = strchr(buf, ':');
if (v == NULL)
continue;
*v++ = 0;
if (*v == ' ') v++;
chomp(v);
if (strcmp(buf, "uid") == 0)
strlcpy(pre->userid, v, sizeof(pre->userid));
else if (strcmp(buf, "name") == 0)
strlcpy(pre->name, v, sizeof(pre->name));
else if (strcmp(buf, "career") == 0)
strlcpy(pre->career, v, sizeof(pre->career));
else if (strcmp(buf, "addr") == 0)
strlcpy(pre->addr, v, sizeof(pre->addr));
else if (strcmp(buf, "phone") == 0)
strlcpy(pre->phone, v, sizeof(pre->phone));
}
return pre->userid[0] ? 1 : 0;
}
int
print_regform_entry(const RegformEntry *pre, FILE *fp, int close)
{
fprintf(fp, "uid: %s\n", pre->userid);
fprintf(fp, "name: %s\n", pre->name);
fprintf(fp, "career: %s\n", pre->career);
fprintf(fp, "addr: %s\n", pre->addr);
fprintf(fp, "phone: %s\n", pre->phone);
if (close)
fprintf(fp, "----\n");
return 1;
}
////////////////////////////////////////////////////////////////////////////
// Regform2 API
////////////////////////////////////////////////////////////////////////////
// registration queue
int
regq_append(const char *userid)
{
if (file_append_record(FN_REQLIST, userid) < 0)
return 0;
return 1;
}
int
regq_find(const char *userid)
{
return file_find_record(FN_REQLIST, userid);
}
// user home regform operation
int
regfrm_exist(const char *userid)
{
char fn[PATHLEN];
sethomefile(fn, userid, FN_REGFORM);
return dashf(fn) ? 1 : 0;
}
int
regfrm_load(const char *userid, RegformEntry *pre)
{
FILE *fp = NULL;
char fn[PATHLEN];
int ret = 0;
sethomefile(fn, userid, FN_REGFORM);
if (!dashf(fn))
return 0;
fp = fopen(fn, "rt");
if (!fp)
return 0;
ret = load_regform_entry(pre, fp);
fclose(fp);
return ret;
}
int
regfrm_save(const char *userid, const RegformEntry *pre)
{
FILE *fp = NULL;
char fn[PATHLEN];
int ret = 0;
sethomefile(fn, userid, FN_REGFORM);
fp = fopen(fn, "wt");
if (!fp)
return 0;
ret = print_regform_entry(pre, fp, 1);
fclose(fp);
return ret;
}
int main()
{
FILE *fp = NULL;
RegformEntry re;
chdir(BBSHOME);
fp = fopen(FN_OLDREG, "rt");
if(!fp) {
printf("no register.new file. abort.\n");
return 0;
}
while (load_regform_entry(&re, fp))
{
printf("converting: %s\n", re.userid);
regfrm_save(re.userid, &re);
if (!regq_find(re.userid))
regq_append(re.userid);
}
fclose(fp);
return 0;
}