Esempio n. 1
0
long ei_reg_getival(ei_reg *reg, const char *key)
{
  ei_hash *tab;
  ei_reg_obj *obj=NULL;

  if (!key || !reg) return -1; /* return EI_BADARG; */
  tab = reg->tab;
  if (!(obj=ei_hash_lookup(tab,key))) return -1; /* return EI_NOTFOUND; */
  if (obj->attr & EI_DELET) return -1; /* return EI_NOTFOUND; */
  if (ei_reg_typeof(obj) != EI_INT) return -1; /* return EI_TYPE; */

  return obj->val.i;
}
Esempio n. 2
0
static int mn_send_write(int fd, erlang_pid *mnesia, const char *key, ei_reg_obj *obj)
{
  char sbuf[EISMALLBUF];
  char *dbuf = NULL;
  char *msgbuf;
  int index = 0;
  int keylen = strlen(key) + 1;
  int len = 32 + keylen + obj->size;

  if (len > EISMALLBUF)
    if (!(dbuf = malloc(len)))
      return -1;
  msgbuf = (dbuf ? dbuf : sbuf);

  ei_encode_version(msgbuf,&index);
  ei_encode_tuple_header(msgbuf,&index,6);
  ei_encode_atom(msgbuf,&index,EI_MNESIA_WRITE);
  ei_encode_string(msgbuf,&index,key);
  ei_encode_long(msgbuf,&index,keylen);
  ei_encode_long(msgbuf,&index,obj->attr);
  ei_encode_long(msgbuf,&index,obj->size);
					      
  switch (ei_reg_typeof(obj)) {
  case EI_INT:
    ei_encode_long(msgbuf,&index,obj->val.i);
    break;
  case EI_FLT:
    ei_encode_double(msgbuf,&index,obj->val.f);
    break;
  case EI_STR:
    if (obj->size > 0) ei_encode_string(msgbuf,&index,obj->val.s);
    else ei_encode_long(msgbuf,&index, (long)NULL);  /* just the NULL pointer */
    break;
  case EI_BIN:
    if (obj->size > 0) ei_encode_binary(msgbuf,&index,obj->val.p,obj->size);
    else ei_encode_long(msgbuf,&index,(long)(obj->val.p));  /* just the pointer */
    break;
  default:
    if (dbuf) free(dbuf);
    return -1;
  }

  /* send it */
  if (ei_send_encoded(fd,mnesia,msgbuf,index)) {
    if (dbuf) free(dbuf);
    return -1;
  }

  if (dbuf) free(dbuf);
  return 0;
}
Esempio n. 3
0
const char *ei_reg_getsval(ei_reg *reg, const char *key)
{
  ei_hash *tab;
  ei_reg_obj *obj=NULL;

  if (!key || !reg) return NULL;  /* return (const char *)EI_BADARG; */
  tab = reg->tab;
  
  if ((!(obj=ei_hash_lookup(tab,key))) || /* return (const char *)EI_NOTFOUND; */
      (obj->attr & EI_DELET) || /* return (const char *)EI_NOTFOUND; */
      (ei_reg_typeof(obj) != EI_STR)) /* return (const char *)EI_TYPE; */
    return NULL;

  return obj->val.s;
}
Esempio n. 4
0
const void *ei_reg_getpval(ei_reg *reg, const char *key, int *size)
{
  ei_hash *tab;
  ei_reg_obj *obj;

  if (!key || !reg) return NULL;
  tab = reg->tab;
  
  if ((!(obj=ei_hash_lookup(tab,key))) || /* return (const void *)EI_NOTFOUND; */
      (obj->attr & EI_DELET)  || /* return (const void *)EI_NOTFOUND; */
      (ei_reg_typeof(obj) != EI_STR)) /* return (const void *)EI_TYPE; */
    return NULL;

  if (size) *size=obj->size;
  return obj->val.p;
}
Esempio n. 5
0
/* really remove an object (help function to hash_freetab) */
static void obj_free(void *p)
{
  ei_reg_obj *obj = p;
  
  if (obj) {
    switch (ei_reg_typeof(obj)) {
    case EI_STR:
      free(obj->val.s);
      break;

    case EI_BIN:
      free(obj->val.p);
      break;
    }

    /* really remove the inode (don't use freelist here) */
    free(obj);
  }
  return;
}
Esempio n. 6
0
int ei_reg_setsval(ei_reg *reg, const char *key, const char *s)
{
  ei_hash *tab;
  ei_reg_obj *obj=NULL;
  int len = 0;

  
  if (!key || !reg) return -1; /* return EI_BADARG; */
  tab = reg->tab;
  if (s) len = strlen(s) +1;

  if ((obj=ei_hash_lookup(tab,key))) {
    /* object with same name already exists */
    switch (ei_reg_typeof(obj)) {
    case EI_INT:
      break;
    case EI_FLT:
      break;
    case EI_STR:
      if (obj->size > 0) free(obj->val.s);
      break;
    case EI_BIN:
      if (obj->size > 0) free(obj->val.p);
      break;
    default:
      return -1;
      /* return EI_UNKNOWN; */
    }
  }
  else {
    /* object is new */
    if (!(obj=ei_reg_make(reg,EI_STR))) return -1; /* return EI_NOMEM; */
    ei_hash_insert(tab,key,obj);
  }
  
  obj->attr = EI_STR | EI_DIRTY;
  obj->val.s=(char *)s;
  obj->size = len;

  return 0;
}
Esempio n. 7
0
/* free a registry object (inode) on the freelist. The "value"
 * contained by the object is removed.
 */
void ei_reg_free(ei_reg *reg, ei_reg_obj *obj)
{
  /* free the value part */
  switch (ei_reg_typeof(obj)) {
    case EI_STR:
      free(obj->val.s);
      break;

    case EI_BIN:
      free(obj->val.p);
      break;
  }

  /* fprintf(stderr,"%s:%d: saving %p on freelist\n",__FILE__,__LINE__,obj);*/
  
  /* save the rest on the freelist */
  obj->next = reg->freelist;
  reg->freelist = obj;

  return;
}