回精華區
作者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翻