当前位置:  技术问答>linux和unix

qmail中两个函数的问题

    来源: 互联网  发布时间:2016-02-11

    本文导语:  qmail源码中两个函数看不太明白 struct cdbmake_hp  {   uint32 h; uint32 p;  } ; struct cdbmake_hplist {   struct cdbmake_hp hp[CDBMAKE_HPLIST];   struct cdbmake_hplist *next;   int num; } ; struct cdbmake {   char final[2048];   uint32 count[2...

qmail源码中两个函数看不太明白
struct cdbmake_hp 
{
  uint32 h; uint32 p; 
} ;

struct cdbmake_hplist {
  struct cdbmake_hp hp[CDBMAKE_HPLIST];
  struct cdbmake_hplist *next;
  int num;
} ;

struct cdbmake {
  char final[2048];
  uint32 count[256];
  uint32 start[256];
  struct cdbmake_hplist *head;
  struct cdbmake_hp *split; 
  struct cdbmake_hp *hash;
  uint32 numentries;
} ;                                         //结构体

//函数正体

int cdbmake_split(cdbm,alloc)
struct cdbmake *cdbm;
char *(*alloc)();
{
  int i;
  uint32 u;
  uint32 memsize;
  struct cdbmake_hplist *x;

  for (i = 0;i count[i] = 0;

  for (x = cdbm->head;x;x = x->next) {
    i = x->num;
    while (i--)
      ++cdbm->count[255 & x->hp[i].h];
  }

  memsize = 1;
  for (i = 0;i count[i] * 2;
    if (u > memsize)
      memsize = u;
  }

  memsize += cdbm->numentries; /* no overflow possible up to now */
  u = (uint32) 0 - (uint32) 1;
  u /= sizeof(struct cdbmake_hp);
  if (memsize > u) return 0;

  cdbm->split = (struct cdbmake_hp *) alloc(memsize * sizeof(struct cdbmake_hp));
  if (!cdbm->split) return 0;

  cdbm->hash = cdbm->split + cdbm->numentries;

  u = 0;
  for (i = 0;i count[i]; /* bounded by numentries, so no overflow */
    cdbm->start[i] = u;
  }

  for (x = cdbm->head;x;x = x->next) {
    i = x->num;
    while (i--)
      cdbm->split[--cdbm->start[255 & x->hp[i].h]] = x->hp[i];
  }

  return 1;
}



uint32 cdbmake_throw(cdbm,pos,b)
struct cdbmake *cdbm;
uint32 pos;
int b;
{
  uint32 len;
  uint32 j;
  uint32 count;
  struct cdbmake_hp *hp;
  uint32 where;

  count = cdbm->count[b];

  len = count + count; /* no overflow possible */
  cdbmake_pack(cdbm->final + 8 * b,pos);
  cdbmake_pack(cdbm->final + 8 * b + 4,len);

  if (len) {
    for (j = 0;j hash[j].h = cdbm->hash[j].p = 0;

    hp = cdbm->split + cdbm->start[b];
    for (j = 0;j h >> 8) % len;
      while (cdbm->hash[where].p)
if (++where == len)
  where = 0;
      cdbm->hash[where] = *hp++;
    }
  }

  return len;
}


看不明白这两个函数到底是要做什么

|
int cdbmake_split(cdbm,alloc) 
struct cdbmake *cdbm; 
char *(*alloc)(); 
晚上心静些,大概看了下
该函数的意思就是给cdbmake *cdbm结构指针,制定用alloc指针函数指的函数体
根据其对象cdbmake_hplist链表分配其对象cdbmake_hp *split的内存空间,具体细节跟存储算法有关

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 谁能帮几个qmail问题?1、qmail-remote进程?2、怎么控制整个服务器用户的收信设置?3、怎么直接删除某规则的邮件而接收?
  • [高分求教]Qmail的SMTP认证失效问题
  • qmail的问题
  • sendmail & qmail的问题
  • 关于Qmail的DNS问题
  • qmailctl问题 qmail起不来
  • qmail的问题 iis7站长之家
  • windows客户端telnet 与linux qmail连接问题
  • Qmail的问题
  • qmail 发信慢的问题
  • 高分请教:qmail+vpopmail的问题!!!在线等待!!!不够可以再加!!!
  • 关于qmail的smtp验证问题,有请各位大中小虾帮忙!
  • 高分请教qmail日志问题!
  • linux下装过qmail服务器的进来看看,刚开始安装就出问题了!!郁闷哦!
  • 【¥¥◎ 高分 ◎¥¥】在linux下安装了qmail做企业级的邮件服务器的问题!我真的很急!!
  • qmail奇怪的问题,急救啊 SOS!
  • Solaris中的Qmail已经装上去了,又有新的问题,fierygnu(va_list)进入帮忙,谢谢
  • Linux Qmail 邮件无法发送的问题
  • Solaris重装Qmail的问题,fierygnu(va_list)进来帮忙解决。
  • 200分qmail入门选手求教一个问题
  • Qmail,能否知道连接Qmail server的客户端地址?
  • 当使用qmail带的sendmail程序替换系统本身的sendmail后,重新启动系统,进程中还存在sendmail么?还是被qmail-inject代替了?
  • 使用iceblood的qmail安装包为什么有如下错误提示
  • qmail-send
  • 急!!!!Qmail-1.03编译不通过!谁能解决??
  • Qmail怎么配置?
  • qmail 如何加smtp认证功能?
  • Qmail 邮件到达通知
  • qmail编译错误
  • 请教--做过邮件系统的朋友,如何对qmail进行操作(100分,在线等候)
  • 做了smtp验证的Qmail服务器邮件列队达2万多,不正常啊,该怎么办?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3