作者amaki.bbs@luna.twbbs.org (午覺羊) 看板: plan
標題Re: [修改]把.USR放入shm裡
時間月下夜想 (2003/12/17 Wed 02:43:23) Updated: 2005/03/18
※ 引述《amaki (午覺羊)》之銘言:
> 2. 簡化整理userno的工作,變成只需要寫一支簡單的utility即可完工(應該很好寫,
> 就是開啟shm然後開始逐一把.USR的位置填入.ACCT裡,只有不正確的才要改)。
放在crontab裡定期跑,不要每天跑,這很操硬碟的-_-;;;
/*-------------------------------------------------------*/
/* util/checkUSERNO.c ( NTHU CS MapleBBS Ver 3.00 ) */
/*-------------------------------------------------------*/
/* target : -??auserno */
/* author : amaki.bbs@luna.twbbs.org */
/* create : 03/12/16 */
/* update : / / */
/*-------------------------------------------------------*/
#include "bbs.h"
static SCACHE *schema_shm;
int
main()
{
int fd, count, c, dirty = 0;
SCHEMA *sch, *sch_set, *seek_set, *shm_set;
struct stat st;
chdir(BBSHOME);
schema_shm = shm_new(SCHESHM_KEY, sizeof(SCACHE));
fd = open(FN_SCHEMA, O_RDONLY, 0600); /* amaki.還沒有.USR那準備倒站了 */
fstat(fd, &st);
/* amaki. 假設有300個孤兒ID且沒有任何空間可用 */
count = st.st_size + sizeof(SCHEMA) * 300;
seek_set = sch = (SCHEMA *) malloc(count);
read(fd, sch, count);
count = count / sizeof(SCHEMA);
close(fd);
for (c = 'a'; c <= 'z'; c++)
{
char buf[64];
struct dirent *de;
DIR *dirp;
sprintf(buf, BBSHOME "/usr/%c", c);
chdir(buf);
if (!(dirp = opendir(".")))
continue;
while (de = readdir(dirp))
{
ACCT cuser;
char *fname;
fname = de->d_name;
if (*fname <= ' ' || *fname == '.')
continue;
sprintf(buf, "%s/.ACCT", fname);
if ((fd = open(buf, O_RDWR | O_CREAT, 0600)) < 0);
continue;
f_exlock(fd);
memset(&cuser, 0, sizeof(ACCT));
read(fd, &cuser, sizeof(cuser));
sch_set = sch + cuser.userno - 1;
if (strncmp(sch_set->userid, cuser.userid, strlen(cuser.userid))
{ /* amaki.孤兒ID */
dirty = 1;
do
{
if (!seek_set->userid[0])
{
shm_set = schema_shm->schema + (seek_set - sch);
strcpy(shm_set->userid, cuser.userid);
strcpy(seek_set->userid, cuser.userid);
shm_set->uptime = seek_set->uptime = time(0);
cuser.userno = (seek_set - sch) + 1;
lseek(fd, -sizeof(ACCT), SEEK_CUR);
write(fd, &cuser, sizeof(ACCT));
break;
}
} while (++seek_set < sch + count);
}
f_unlock(fd);
close(fd);
}
closedir(dirp);
}
if (dirty)
{
chdir(BBSHOME);
unlink(FN_SCHEMA);
if (seek_set < sch + schema_shm->number)
rec_add(FN_SCHEMA, sch, sizeof(SCHEMA) * schema_shm->number);
else
rec_add(FN_SCHEMA, sch, sizeof(SCHEMA) *
(schema_shm->number = seek_set - sch + 1));
}
free(sch);
}
--
Origin: luna.twbbs.org精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻