/* $Id$ */
/* 自動砍user目錄檔案程式 */

#include "bbs.h"

#define HOLDWRITELOG
#define DELZEROFILE
#define USERHOME BBSHOME "/home"

int bad_user_id(char *userid)
{
    register char ch;

    if (strlen(userid) < 2)
	return 1;

    if (!isalpha(*userid))
	return 1;

    if (!strcasecmp(userid, "new"))
	return 1;

    while ((ch = *(++userid)))
	if (!isalnum(ch))
	    return 1;
    return 0;
}

void del_file(char *userid)
{
    char buf[200], buf1[200];
    struct dirent *de;
    DIR *dirp;
    char *ptr;

    sprintf(buf, BBSHOME "/home/%c/%s", userid[0], userid);

    if (chdir(buf) == -1)
	return;

    if (!(dirp = opendir(buf)))
	return;

    while ((de = readdir(dirp)))
    {
	ptr = de->d_name;
	if (ptr[0] > ' ' && ptr[0] != '.')
	{
	    if (strstr(ptr, "writelog"))
#ifdef HOLDWRITELOG
	    {
		fileheader_t mymail;

		stampfile(buf, &mymail);
		mymail.filemode = FILE_READ|FILE_HOLD;
		strcpy(mymail.owner, userid);
		strcpy(mymail.title, "熱線記錄");
		sprintf(buf1, BBSHOME "/home/%c/%s/writelog",
			userid[0], userid);
		rename(buf1, buf);
		sprintf(buf1, BBSHOME "/home/%c/%s/.DIR", userid[0], userid);
		append_record(buf1, &mymail, sizeof(mymail));
	    }
#else
	    unlink(ptr);
#endif
	    else if (strstr(ptr, "chat_"))
		unlink(ptr);
	    else if (strstr(ptr, "ve_"))
		unlink(ptr);
	    else if (strstr(ptr, "SR."))
		unlink(ptr);
	    else if (strstr(ptr, ".old"))
		unlink(ptr);
	    else if (strstr(ptr, "talk_"))
		unlink(ptr);
	}
    }
    closedir(dirp);
}

void mv_user_home(char *ptr)
{
    char buf[200];

    printf("move user %s to tmp\n", ptr);
    sprintf(buf, "cp -R " BBSHOME "/home/%c/%s " BBSHOME "/tmp", ptr[0], ptr);
//      sprintf(buf,"rm -rf " BBSHOME "/home/%c/%s",ptr[0],ptr);
    if (!system(buf))
    {				//Copy success

	sprintf(buf, "rm -rf " BBSHOME "/home/%c/%s", ptr[0], ptr);
	system(buf);
    }
}

int main(int argc, char **argv)
{
    struct dirent *de;
    DIR *dirp;
    char *ptr, buf[200], ch;
    int count = 0;
/* visit all users  */

    printf("new version, deleting\n");

    attach_SHM();

    for (ch = 'A'; ch <= 'z'; ch++)
    {
	if(ch > 'Z' && ch < 'a')
	    continue;
	printf("Cleaning %c\n", ch);
	sprintf(buf, USERHOME "/%c", ch);
	if (!(dirp = opendir(buf)))
	{
	    printf("unable to open %s\n", buf);
	    continue;
	}

	while ((de = readdir(dirp)))
	{
	    ptr = de->d_name;

	    /* 預防錯誤 */
	    if (!bad_user_id(ptr))
	    {
		if (!(count++ % 300))
		    printf(".\n");
		if (!searchuser(ptr))
		    mv_user_home(ptr);
		else
		    del_file(ptr);
	    }
	}
	closedir(dirp);
    }
    return 0;
}
