Exemplo n.º 1
0
static int storecontent (const char * username) {

	 datum d,k;
	 int res;

	if ( pdb == NULL || concntr < 2 ) return 1;

	DOUT2("store:\n%s\ncontent:\n%s",username,content);

	d.dptr = content;
	d.dsize = concntr + 1;

	k.dptr = username;
	k.dsize = strlen(username) + 1;

	res = dbm_store(pdb, k, d, DBM_INSERT);
	if ( res == 1 ) dbm_store(pdb, k, d, DBM_REPLACE);
	if ( res < 0 ) {
	  perror("Couldn't insert record");
	  st_errors++;
	  st_skiped++;
	}  else st_loaded++;

	concntr = 0;
	*content = '\0';
	return 0;
}
Exemplo n.º 2
0
int
pw_dbm_update(const struct passwd *pw)
{
	datum	key;
	datum	content;
	char	data[BUFSIZ];
	int	len;
	static	int	once;

	if (! once) {
		if (! pw_dbm)
			setpwent ();
		once++;
	}
	if (! pw_dbm)
		return 0;

	len = pw_pack (pw, data);
	content.dsize = len;
	content.dptr = data;

	key.dsize = strlen (pw->pw_name);
	key.dptr = pw->pw_name;

	if (dbm_store(pw_dbm, key, content, DBM_REPLACE))
		return 0;

	/*
	 * XXX - on systems with 16-bit UIDs (such as Linux/x86)
	 * name "aa" and UID 24929 will give the same key.  This
	 * happens only rarely, but code which only "works most
	 * of the time" is not good enough...
	 *
	 * This needs to be fixed in several places (pwdbm.c,
	 * grdbm.c, pwent.c, grent.c).  Fixing it will cause
	 * incompatibility with existing dbm files.
	 *
	 * Summary: don't use this stuff for now.  --marekm
	 */

	key.dsize = sizeof pw->pw_uid;
	key.dptr = (char *) &pw->pw_uid;

	if (dbm_store(pw_dbm, key, content, DBM_REPLACE))
		return 0;

	return 1;
}
Exemplo n.º 3
0
void dbm_del_user(DBM *dbmgroup, char *group, char *user) {
  datum key, resp;
  char *userlist;
  char *tmp;

  key.dptr = group;
  key.dsize = strlen(group);
  resp = dbm_fetch(dbmgroup,key);

  if (resp.dptr) {
    if (resp.dptr[0] != '\0') {
      if (!strcmp(resp.dptr,user)) {
	resp.dptr[0] = '\0';
	resp.dsize = 1;
	dbm_store(dbmgroup,key,resp,DBM_REPLACE);
      } else {
	tmp = resp.dptr;
	while ((tmp = strstr(tmp,user))) {
	  if ((tmp[strlen(user)] == '\0') || (tmp[strlen(user)] == ' ') ||
	      (tmp[strlen(user)] == ',')) {
	    break;
	  } else tmp++;
	}
	if (!tmp) {
	  fprintf(stderr,"The user %s is not in group %s.\n",user,group);
	  exit(1);
	}
	printf("Deleting user %s from group %s.\n",user,group);
	userlist = (char *)malloc(strlen(resp.dptr) - strlen(user)+1);
	if (tmp != resp.dptr) {
	  strncpy(userlist,resp.dptr,tmp-resp.dptr-1);
	  strcat(userlist,(tmp+strlen(user)));
	} else {
	  strcpy(userlist,(tmp+strlen(user)));
	}
	resp.dptr = userlist;
	resp.dsize = strlen(userlist);
	dbm_store(dbmgroup,key,resp,DBM_REPLACE);
      }
    } else {
      fprintf(stderr,"The group %s is emptry.\n",group);
      exit(1);
    }
  } else {
    fprintf(stderr,"There is no group %s.\n",group);
    exit(1);
  }
}
Exemplo n.º 4
0
static krb5_error_code
NDBM__put(krb5_context context, HDB *db, int replace,
	krb5_data key, krb5_data value)
{
#ifdef WRITE_SUPPORT
    struct ndbm_db *d = (struct ndbm_db *)db->hdb_db;
    datum k, v;
    int code;

    k.dptr  = key.data;
    k.dsize = key.length;
    v.dptr  = value.data;
    v.dsize = value.length;

    code = db->hdb_lock(context, db, HDB_WLOCK);
    if(code)
	return code;
    code = dbm_store(d->db, k, v, replace ? DBM_REPLACE : DBM_INSERT);
    db->hdb_unlock(context, db);
    if(code == 1)
	return HDB_ERR_EXISTS;
    if (code < 0)
	return code;
    return 0;
#else
    return HDB_ERR_NO_WRITE_SUPPORT;
#endif
}
Exemplo n.º 5
0
static int
_ndbm_store (mu_dbm_file_t db,
	     struct mu_dbm_datum const *key,
	     struct mu_dbm_datum const *contents,
	     int replace)
{
  DBM *dbm = db->db_descr;
  datum keydat, condat;
  
  keydat.dptr = key->mu_dptr;
  keydat.dsize = key->mu_dsize;
  condat.dptr = contents->mu_dptr;
  condat.dsize = contents->mu_dsize;
  errno = 0;
  switch (dbm_store (dbm, keydat, condat,
		     replace ? DBM_REPLACE : DBM_INSERT))
    {
    case 0:
      break;
      
    case 1:
      return MU_ERR_EXISTS;
      
    case -1:
      db->db_errno.n = errno;
      return MU_ERR_FAILURE;
    }
  return 0;
}
Exemplo n.º 6
0
static PyObject *
dbm_setdefault(register dbmobject *dp, PyObject *args)
{
	datum key, val;
	PyObject *defvalue = NULL;
	int tmp_size;

	if (!PyArg_ParseTuple(args, "s#|S:setdefault",
                              &key.dptr, &tmp_size, &defvalue))
		return NULL;
	key.dsize = tmp_size;
        check_dbmobject_open(dp);
	val = dbm_fetch(dp->di_dbm, key);
	if (val.dptr != NULL)
		return PyString_FromStringAndSize(val.dptr, val.dsize);
	if (defvalue == NULL) {
		defvalue = PyString_FromStringAndSize(NULL, 0);
		if (defvalue == NULL)
			return NULL;
	}
	else
		Py_INCREF(defvalue);
	val.dptr = PyString_AS_STRING(defvalue);
	val.dsize = PyString_GET_SIZE(defvalue);
	if (dbm_store(dp->di_dbm, key, val, DBM_INSERT) < 0) {
		dbm_clearerr(dp->di_dbm);
		PyErr_SetString(DbmError, "cannot add item to database");
		return NULL;
	}
	return defvalue;
}
Exemplo n.º 7
0
/* This function adds a new catalog entry. The access key is the
   catalog string and track number acting as a composite key */
int add_cdt_entry(const cdt_entry entry_to_add)
{
    char key_to_add[CAT_CAT_LEN + 10];
    datum local_data_datum;
    datum local_key_datum;
    int result;

    /* check database initialized and parameters valid */
    if (!cdc_dbm_ptr || !cdt_dbm_ptr) return (0);
    if (strlen(entry_to_add.catalog) >= CAT_CAT_LEN) return (0);

    /* ensure the search key contains only the valid string and nulls */
    memset(&key_to_add, '\0', sizeof(key_to_add));
    sprintf(key_to_add, "%s %d", entry_to_add.catalog, entry_to_add.track_no);

    local_key_datum.dptr = (void *) key_to_add;
    local_key_datum.dsize = sizeof(key_to_add);
    local_data_datum.dptr = (void *) &entry_to_add;
    local_data_datum.dsize = sizeof(entry_to_add);

    result = dbm_store(cdt_dbm_ptr, local_key_datum, local_data_datum, DBM_REPLACE);

    /* dbm_store() uses 0 for success and -ve numbers for errors */
    if (result == 0)
	return (1);
    return (0);
} /* add_cdt_entry */
Exemplo n.º 8
0
int main()
{
	const char *database_name = "/tmp/ndbm" ;
	//create a dbm
	DBM *dbmptr = 0 ;
	TFUNVR(0, dbmptr, dbm_open(database_name, O_RDWR | O_CREAT,  0666))
	
	//append some item to dbm from user
	const int DATA_MAX_LEN = 101 ;
	datum key_datum, data_datum ;
	int key, result ;
	char data[DATA_MAX_LEN] ;

	printf("Enter a database item, form is 'key data', when key is -1 to end.\n") ;
	scanf("%d", &key) ;
	while(-1 != key) {
		key_datum.dptr = (void *)&key ;
		key_datum.dsize = sizeof(key) ;
		
		fgets(data, DATA_MAX_LEN , stdin) ;
		data_datum.dptr = data ;
		data_datum.dsize = strlen(data) ;
		
		do{
		if(1 == (result = dbm_store(dbmptr, key_datum, data_datum, DBM_INSERT))) {
			fprintf(stderr, "dbm_store has been a same key\n") ;
			break ;
		} else if(0 > result) {
			fprintf(stderr, "dbm_store failed\n") ;
			exit(1) ;
		}
		}while(0) ; //use for break can scanf
		scanf("%d", &key) ;
	}
	

	//read data frm dbm
	printf("Now you can search itme, enter a key, when key is -1 to end\n") ;
	scanf("%d", &key) ;
	while(-1 != key) 
	{
		key_datum.dptr = (void *)&key ;
		key_datum.dsize = sizeof(key) ;
		data_datum = dbm_fetch(dbmptr, key_datum) ;
		if(NULL == data_datum.dptr) {
			printf("No has this key item, try again:") ;
		} else {
			printf("key:%-4d:%s\n", key, (char *)data_datum.dptr) ; 
		}
		scanf("%d", &key) ;
	}

	//close dbm
	dbm_close(dbmptr) ;

	return 0 ;
}
Exemplo n.º 9
0
int
otp_put (void *v, OtpContext *ctx)
{
  DBM *dbm = (DBM *)v;
  datum dat, key;
  char buf[1024], *p;
  time_t zero = 0;
  size_t len, rem;

  key.dsize = strlen(ctx->user);
  key.dptr  = ctx->user;

  p = buf;
  rem = sizeof(buf);

  if (rem < sizeof(zero))
      return -1;
  memcpy (p, &zero, sizeof(zero));
  p += sizeof(zero);
  rem -= sizeof(zero);
  len = strlen(ctx->alg->name) + 1;

  if (rem < len)
      return -1;
  strlcpy (p, ctx->alg->name, rem);
  p += len;
  rem -= len;

  if (rem < 4)
      return -1;
  {
    unsigned char *up = (unsigned char *)p;
    *up++ = (ctx->n >> 24) & 0xFF;
    *up++ = (ctx->n >> 16) & 0xFF;
    *up++ = (ctx->n >>  8) & 0xFF;
    *up++ = (ctx->n >>  0) & 0xFF;
  }
  p += 4;
  rem -= 4;

  if (rem < OTPKEYSIZE)
      return -1;
  memcpy (p, ctx->key, OTPKEYSIZE);
  p += OTPKEYSIZE;
  rem -= OTPKEYSIZE;

  len = strlen(ctx->seed) + 1;
  if (rem < len)
      return -1;
  strlcpy (p, ctx->seed, rem);
  p += len;
  rem -= len;
  dat.dptr  = buf;
  dat.dsize = p - buf;
  return dbm_store (dbm, key, dat, DBM_REPLACE);
}
Exemplo n.º 10
0
int
ldbm_store( LDBM ldbm, Datum key, Datum data, int flags )
{
	int rc;

	LDBM_WLOCK;
	rc = dbm_store( ldbm, key, data, flags );
	LDBM_WUNLOCK;

	return rc;
}
Exemplo n.º 11
0
static int
store_data(voidp db, char *k, char *v)
{
  datum key, val;

  key.dptr = k;
  val.dptr = v;
  key.dsize = strlen(k) + 1;
  val.dsize = strlen(v) + 1;
  return dbm_store((DBM *) db, key, val, DBM_INSERT);
}
Exemplo n.º 12
0
void dbm_add_user(DBM *dbmgroup, char *group, char *user) {
  datum key,resp;
  char *newusers;
  char *tmp;

  key.dptr = group;
  key.dsize = strlen(group);
  resp = dbm_fetch(dbmgroup,key);
  if (resp.dptr) {
    printf("Adding %s to group %s.\n",user,group);
    if (resp.dptr[0]) {
      if (!(newusers = (char *)malloc(resp.dsize + strlen(user) + 2))) {
	fprintf(stderr,"Not enough memory to complete operation.\n");
	perror("malloc");
	exit(1);
      }
      tmp = resp.dptr;
      while ((tmp = strstr(tmp,user))) {
	if ((tmp[strlen(user)] == '\0') || (tmp[strlen(user)] == ' ') ||
	    (tmp[strlen(user)] == ',')) {
	  printf("User %s is already in group %s.\n",user,group);
	  exit(0);
	} else tmp++;
      }
      strcpy(newusers,resp.dptr);
      sprintf(newusers,"%s %s",newusers,user);
      resp.dptr = newusers;
      resp.dsize = strlen(newusers);
      dbm_store(dbmgroup,key,resp,DBM_REPLACE);
    } else {
      resp.dptr = user;
      resp.dsize = strlen(user);
      dbm_store(dbmgroup,key,resp,DBM_INSERT);
    }
  } else {
    printf("Creating group %s and adding user %s.\n",group,user);
    resp.dptr = user;
    resp.dsize = strlen(user);
    dbm_store(dbmgroup,key,resp,DBM_INSERT);
  }
}
Exemplo n.º 13
0
static int
otp_get_internal (void *v, OtpContext *ctx, int lockp)
{
  DBM *dbm = (DBM *)v;
  datum dat, key;
  char *p;
  time_t now, then;

  key.dsize = strlen(ctx->user);
  key.dptr  = ctx->user;

  dat = dbm_fetch (dbm, key);
  if (dat.dptr == NULL) {
    ctx->err = "Entry not found";
    return -1;
  }
  p = dat.dptr;

  memcpy (&then, p, sizeof(then));
  ctx->lock_time = then;
  if (lockp) {
    time(&now);
    if (then && now - then < OTP_USER_TIMEOUT) {
      ctx->err = "Entry locked";
      return -1;
    }
    memcpy (p, &now, sizeof(now));
  }
  p += sizeof(now);
  ctx->alg = otp_find_alg (p);
  if (ctx->alg == NULL) {
    ctx->err = "Bad algorithm";
    return -1;
  }
  p += strlen(p) + 1;
  {
    unsigned char *up = (unsigned char *)p;
    ctx->n = (up[0] << 24) | (up[1] << 16) | (up[2] << 8) | up[3];
  }
  p += 4;
  memcpy (ctx->key, p, OTPKEYSIZE);
  p += OTPKEYSIZE;
  strlcpy (ctx->seed, p, sizeof(ctx->seed));
  if (lockp)
    return dbm_store (dbm, key, dat, DBM_REPLACE);
  else
    return 0;
}
Exemplo n.º 14
0
value caml_dbm_replace(value vdb, value vkey, value vcontent) /* ML */
{
  datum key, content;
  
  key.dptr = String_val(vkey);
  key.dsize = string_length(vkey);
  content.dptr = String_val(vcontent);
  content.dsize = string_length(vcontent);

  switch(dbm_store(extract_dbm(vdb), key, content, DBM_REPLACE)) {
  case 0:
    return Val_unit;
  default:
    raise_dbm("dbm_store failed");
  }
}
Exemplo n.º 15
0
/*
 * save the user status in *accessdb
 * 
 * return 0  -> ok
 *        -1 -> failed to update accessdb
 */
int save_access_status (char *accessdb, char *loginname, int status, int delay,char *cookie) {
   char txt_nul[]="0";
   DBM *db;
   datum key;
   datum data;
   time_t t;
   struct access_data access;
   if (cookie==NULL) {
      cookie=txt_nul;
      }
   db=dbm_open(accessdb, O_RDWR | O_CREAT, 0600);
   if (!db) return(-1);               /* failed to create db */
   key.dptr=(void *)loginname;
   key.dsize=strlen(loginname);
   time(&t);
   access.status=1;
   if (status) 
     {
         data=dbm_fetch(db,key);
         if (data.dptr) 
	   {

            if(sizeof(access)!=data.dsize) { dbm_close(db); return(-1); }

            memcpy(&access,data.dptr,data.dsize);
	    if (access.status && (t-access.ti>delay))
	      {
		access.status=0;
	      }
            ++access.status;
           }
      }
   else access.status=0;
   access.ti=t;
   memset(access.cookie,'\0',sizeof(access.cookie));
   strncpy(access.cookie,cookie,59);
   data.dptr=(void *)&access;
   data.dsize=sizeof(access);
   if (dbm_store(db,key,data,DBM_REPLACE)!=0) 
     {
       dbm_close(db);     
       return(-1); /* failed to store user data */
     }
   dbm_close(db);
   return(0);
}
Exemplo n.º 16
0
static apr_status_t vt_ndbm_store(apr_dbm_t *dbm, apr_datum_t key,
                                  apr_datum_t value)
{
    int rc;
    datum kd, vd;

    kd.dptr = key.dptr;
    kd.dsize = key.dsize;

    vd.dptr = value.dptr;
    vd.dsize = value.dsize;

    rc = dbm_store(dbm->file, kd, vd, DBM_REPLACE);

    /* store any error info into DBM, and return a status code. */
    return set_error(dbm, ndbm2s(rc));
}
Exemplo n.º 17
0
static int
dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w)
{
        datum krec, drec;
	int tmp_size;
	
        if ( !PyArg_Parse(v, "s#", &krec.dptr, &tmp_size) ) {
		PyErr_SetString(PyExc_TypeError,
				"dbm mappings have string indices only");
		return -1;
	}
	krec.dsize = tmp_size;
        if (dp->di_dbm == NULL) {
                 PyErr_SetString(DbmError, "DBM object has already been closed"); 
                 return -1;
        }
	dp->di_size = -1;
	if (w == NULL) {
		if ( dbm_delete(dp->di_dbm, krec) < 0 ) {
			dbm_clearerr(dp->di_dbm);
			PyErr_SetString(PyExc_KeyError,
				      PyString_AS_STRING((PyStringObject *)v));
			return -1;
		}
	} else {
		if ( !PyArg_Parse(w, "s#", &drec.dptr, &tmp_size) ) {
			PyErr_SetString(PyExc_TypeError,
				     "dbm mappings have string elements only");
			return -1;
		}
		drec.dsize = tmp_size;
		if ( dbm_store(dp->di_dbm, krec, drec, DBM_REPLACE) < 0 ) {
			dbm_clearerr(dp->di_dbm);
			PyErr_SetString(DbmError,
					"cannot add item to database");
			return -1;
		}
	}
	if ( dbm_error(dp->di_dbm) ) {
		dbm_clearerr(dp->di_dbm);
		PyErr_SetString(DbmError, "");
		return -1;
	}
	return 0;
}
Exemplo n.º 18
0
/*
 *  This stores the passed text in the database with the key `key'.
 *  Returns 0 on success and -1 on failure.
 */
int
cache_store(char *key, const char *text)
{
#ifndef NOCACHE
  datum dbkey;
  datum dbstore;
  int ret;
#ifdef HAVE_GDBM_OPEN
  GDBM_FILE dbf;
#else
  DBM *dbf;
#endif
  time_t *timeptr;
  char *ptr;

  if (cache)
    {
      dbkey.dptr = key;
      dbkey.dsize = strlen(key);

      ptr = malloc(strlen(text)+sizeof(time_t)+1);
      if (!ptr)
	return -1;
      memcpy(ptr+sizeof(time_t), text, strlen(text)+1);
      
      timeptr = (time_t *)ptr;
      *timeptr = time(NULL);
      
      dbstore.dptr = ptr;
      dbstore.dsize = strlen(text)+sizeof(time_t)+1;
      
      dbf = dbm_open(cfname, DBM_WOPTIONS, DBM_MODE);
      if (!dbf)
	return -1;
      else
	{
	  ret = dbm_store(dbf, dbkey, dbstore, DBM_IOPTIONS);
	  if (ret < 0)
	    return -1;
	  dbm_close(dbf);
	}
    }
#endif
  return 0;
}
Exemplo n.º 19
0
void dbm_add_group(DBM *dbmgroup, char *group) {
  datum key,resp;
  char tmp[5];

  key.dptr = group;
  key.dsize = strlen(group);
  resp = dbm_fetch(dbmgroup,key);
  if (resp.dptr) {
    fprintf(stderr,"Group %s already exists.\n",group);
    exit(1);
  } else {
    printf("Adding group %s.\n",group);
    resp.dptr = tmp;
    tmp[0] = '\0';
    resp.dsize = 1;
    dbm_store(dbmgroup,key,resp,DBM_INSERT);
  }
}
Exemplo n.º 20
0
value caml_dbm_insert(value vdb, value vkey, value vcontent) /* ML */
{
  datum key, content;
  
  key.dptr = String_val(vkey);
  key.dsize = string_length(vkey);
  content.dptr = String_val(vcontent);
  content.dsize = string_length(vcontent);

  switch(dbm_store(extract_dbm(vdb), key, content, DBM_INSERT)) {
  case 0:
    return Val_unit;
  case 1:                       /* DBM_INSERT and already existing */
    raise_dbm("Entry already exists");
  default:
    raise_dbm("dbm_store failed");
  }
}
Exemplo n.º 21
0
static PyObject *
dbm_setdefault(dbmobject *dp, PyObject *args)
{
    datum key, val;
    PyObject *defvalue = NULL;
    char *tmp_ptr;
    Py_ssize_t tmp_size;

    if (!PyArg_ParseTuple(args, "s#|O:setdefault",
                          &tmp_ptr, &tmp_size, &defvalue))
        return NULL;
    key.dptr = tmp_ptr;
    key.dsize = tmp_size;
    check_dbmobject_open(dp);
    val = dbm_fetch(dp->di_dbm, key);
    if (val.dptr != NULL)
        return PyBytes_FromStringAndSize(val.dptr, val.dsize);
    if (defvalue == NULL) {
        defvalue = PyBytes_FromStringAndSize(NULL, 0);
        if (defvalue == NULL)
            return NULL;
        val.dptr = NULL;
        val.dsize = 0;
    }
    else {
        if ( !PyArg_Parse(defvalue, "s#", &val.dptr, &tmp_size) ) {
            PyErr_SetString(PyExc_TypeError,
                "dbm mappings have byte string elements only");
            return NULL;
        }
        val.dsize = tmp_size;
        Py_INCREF(defvalue);
    }
    if (dbm_store(dp->di_dbm, key, val, DBM_INSERT) < 0) {
        dbm_clearerr(dp->di_dbm);
        PyErr_SetString(DbmError, "cannot add item to database");
        Py_DECREF(defvalue);
        return NULL;
    }
    return defvalue;
}
Exemplo n.º 22
0
static PyObject *
_dbm_dbm_setdefault_impl(dbmobject *self, const char *key,
                         Py_ssize_clean_t key_length,
                         PyObject *default_value)
/*[clinic end generated code: output=52545886cf272161 input=6a3b99ae91f20203]*/
{
    datum dbm_key, val;
    Py_ssize_t tmp_size;

    dbm_key.dptr = (char *)key;
    dbm_key.dsize = key_length;
    check_dbmobject_open(self);
    val = dbm_fetch(self->di_dbm, dbm_key);
    if (val.dptr != NULL)
        return PyBytes_FromStringAndSize(val.dptr, val.dsize);
    if (default_value == NULL) {
        default_value = PyBytes_FromStringAndSize(NULL, 0);
        if (default_value == NULL)
            return NULL;
        val.dptr = NULL;
        val.dsize = 0;
    }
    else {
        if ( !PyArg_Parse(default_value, "s#", &val.dptr, &tmp_size) ) {
            PyErr_SetString(PyExc_TypeError,
                "dbm mappings have byte string elements only");
            return NULL;
        }
        val.dsize = tmp_size;
        Py_INCREF(default_value);
    }
    if (dbm_store(self->di_dbm, dbm_key, val, DBM_INSERT) < 0) {
        dbm_clearerr(self->di_dbm);
        PyErr_SetString(DbmError, "cannot add item to database");
        Py_DECREF(default_value);
        return NULL;
    }
    return default_value;
}
Exemplo n.º 23
0
void store(char *what, int value)
{
datum name, val;
char blah[15];
int old;


    name.dptr=what;
    name.dsize=strlen(what);

    val=dbm_fetch(db, name);
    if(val.dptr == NULL)
        old=0;
    else
        old=atoi(val.dptr);

    sprintf(blah, "%d", value+old);

    val.dptr=blah;
    val.dsize=strlen(blah);

    dbm_store(db, name, val, DBM_REPLACE);
}
Exemplo n.º 24
0
int main(int argc, char *argv[])
{
#ifdef FBSD_DATABASE
	DBT inKey, inVal;
	DB * db;
#else
	DBM * db;
	datum Key;
	datum Val;
#endif

	FILE *ifd;
	char line[256];
	char *iptr;
	char *optr;
        extern char *optarg;
        extern int optind;

	char c;
	int  i;

	/* read in file name  */
	if(argc==1) {
        (void)fprintf(stderr, "Usage: %s",argv[0]);
        (void)fprintf(stderr,"\t-o output_file_without_extention -i input_file\n");
                exit(2);
	}
	while((c = getopt(argc,argv,"i:o:")) != -1) {
                switch(c) {
                        case 'i':
                                iptr = optarg;
                                break;
                        case 'o':
                                optr = optarg;
                                break;
			default:
				(void)fprintf(stderr, "Usage: %s",argv[0]);
				(void)fprintf(stderr,"\t-o output_file_without_extention -i input_file\n");
				exit(2);
		}
	}

	if(!strcmp(iptr,"-")) {
		ifd = stdin;
        } else if ((ifd=fopen(iptr,"r")) == NULL) {
                (void)fprintf(stderr,"Can't open file %s\n",iptr);
                exit(1);
        }


#ifdef FBSD_DATABASE
        db = dbopen(optr,O_RDWR|O_CREAT, 0000644, DB_HASH, &openinfo);

	while(fgets(line,256,ifd)) {
		inKey.data = strtok(line," ");
		inKey.size = strlen(inKey.data)+1;
		inVal.data = strtok(NULL,"\n");
		inVal.size = strlen(inVal.data)+1;
                (db->put)(db,&inKey,&inVal,R_NOOVERWRITE);

		i++;
		fprintf(stderr,"%d\r",i);
	}

        (void)(db->close)(db);
#else
        db = dbm_open(optr,O_RDWR|O_CREAT, 0000644);

	while(fgets(line,256,ifd)) {
		Key.dptr = strtok(line," ");
		Key.dsize = strlen(Key.dptr)+1;
		Val.dptr = strtok(NULL,"\n");
		Val.dsize = strlen(Val.dptr)+1;
		dbm_store(db,Key,Val,DBM_INSERT);

		i++;
		fprintf(stderr,"%d\r",i);
	}

        dbm_close(db);
#endif

	return(0);
}
Exemplo n.º 25
0
int main() {
    struct test_data items_to_store[ITEMS_USED];
    struct test_data item_retrieved;
    char key_to_use[20];
    int i, result;
    // a datum is dbm's wrapper around binary data. It consists of a void*
    // to our data and a size_t giving the data size
    datum key_datum;
    datum data_datum;
    // a DBM struct is a wrapper around two files, one used to track indices
    // and another used to store the binary data.
    DBM *dbm_p;

    dbm_p = dbm_open(TEST_DB_FILE, O_RDWR | O_CREAT, 0666);
    if (!dbm_p) {
        fprintf(stderr, "Failed to open database\n");
        exit(EXIT_FAILURE);
    }

    // set all data to zero first, then set some data
    //    note that we *need* all zeros in some cases, e.g. if we use
    //    char arrays as keys. If they are only used for values it's less
    //    important.
    memset(items_to_store, '\0', sizeof(items_to_store));
    // Ff47
    strcpy(items_to_store[0].misc_chars, "First!");
    items_to_store[0].any_integer = 47;
    strcpy(items_to_store[0].more_chars, "foo");
    // bu13
    strcpy(items_to_store[1].misc_chars, "bar");
    items_to_store[1].any_integer = 13;
    strcpy(items_to_store[1].more_chars, "unlucky?");
    // Tb3
    strcpy(items_to_store[2].misc_chars, "Third");
    items_to_store[2].any_integer = 3;
    strcpy(items_to_store[2].more_chars, "baz");

    for (i = 0; i < ITEMS_USED; i++) {
        // make the key string
        sprintf(key_to_use, "%c%c%d",
                items_to_store[i].misc_chars[0],
                items_to_store[i].more_chars[0],
                items_to_store[i].any_integer);
        // make the key. Check that you understand why we *must* use
        // strlen() here and not sizeof()
        key_datum.dptr = (void *) key_to_use;
        key_datum.dsize = strlen(key_to_use);
        // make the data
        data_datum.dptr = (void *) &items_to_store[i];
        data_datum.dsize = sizeof(struct test_data);

        // write the data. Note that we have a choice of what to do
        // if we see a known key; here it doesn't matter.
        result = dbm_store(dbm_p, key_datum, data_datum, DBM_REPLACE);
        if (result != 0) {
            fprintf(stderr, "Failed to write to database\n");
            exit(2);
        }
    }

    // now try retrieving the second entry
    sprintf(key_to_use, "bu%d", 13);
    key_datum.dptr = (void *) key_to_use;
    key_datum.dsize = strlen(key_to_use);
    data_datum = dbm_fetch(dbm_p, key_datum);
    // if we don't find a key, we get a datum with NULL dptr
    if (data_datum.dptr) {
        printf("Data retrieved\n");
        memcpy(&item_retrieved, data_datum.dptr, data_datum.dsize);
        printf("Retrieved item - %s %d %s\n",
                item_retrieved.misc_chars,
                item_retrieved.any_integer,
                item_retrieved.more_chars);
    } else {
        printf("No data found for key %s\n", key_to_use);
    }

    printf("\n\nNow we'll try deleting and then cycling\n\n");

    // delete the entry we just looked at
    if (dbm_delete(dbm_p, key_datum) == 0) {
        printf("Data with key %s deleted\n", key_to_use);
    } else {
        printf("Nothing deleted for key %s\n", key_to_use);
    }

    // now use dbm_firstkey and dbm_nextkey to iterate over keys.
    //   ... the order in which they appear is not defined
    for (key_datum = dbm_firstkey(dbm_p);
         key_datum.dptr;                    // the end condition is a NULL dptr
         key_datum = dbm_nextkey(dbm_p)) {
        // get the data. The data_datum shouldn't be null in this situation,
        // but it could happen due to race conditions and such, so we should
        // still guard against it.
        data_datum = dbm_fetch(dbm_p, key_datum);
        if (data_datum.dptr) {
        printf("Data retrieved for key %s\n", (char *)key_datum.dptr);
        memcpy(&item_retrieved, data_datum.dptr, data_datum.dsize);
        printf("Retrieved item - %s %d %s\n",
                item_retrieved.misc_chars,
                item_retrieved.any_integer,
                item_retrieved.more_chars);

        } else {
            // the authors oopsed here, don't use `key_to_use`
            printf("No data found for key %s\n", (char *) key_datum.dptr);
        }
    }
    
    // don't forget to close the database!
    dbm_close(dbm_p);
    exit(EXIT_SUCCESS);
}
Exemplo n.º 26
0
int main(void)
{
   struct test_data items_to_store[ITEMS_USED];
   struct test_data items_retrieved;
   
   char key_to_use[20];
   int i, result;
   
   datum key_datum;
   datum data_datum;
   DBM *dbm_ptr;
 
   dbm_ptr = dbm_open(TEST_DB_FILE, O_RDWR | O_CREAT, 0666);
   if(!dbm_ptr)  {
       fprintf(stderr, "Failed to open database\n");
       exit(EXIT_FAILURE);
   }
   
   memset(items_to_store, '\0', sizeof(items_to_store));
   strcpy(items_to_store[0].misc_chars, "First!");
   items_to_store[0].any_integer = 47;
   strcpy(items_to_store[0].more_chars, "foo");
   
   strcpy(items_to_store[1].misc_chars, "bar");
   items_to_store[1].any_integer = 13;
   strcpy(items_to_store[1].more_chars, "unlucky?");

   strcpy(items_to_store[2].misc_chars, "Third");
   items_to_store[2].any_integer = 3;
   strcpy(items_to_store[2].more_chars, "baz");
   
   for(i = 0; i < ITEMS_USED; i++)  {
       sprintf(key_to_use, "%c%c%d", items_to_store[i].misc_chars[0],
       items_to_store[i].more_chars[0], items_to_store[i].any_integer);

       key_datum.dptr = (void *)key_to_use;
       key_datum.dsize = strlen(key_to_use);
       data_datum.dptr = (void *)&items_to_store[i];
       data_datum.dsize = sizeof(struct test_data);

       result = dbm_store(dbm_ptr, key_datum, data_datum, DBM_REPLACE);
       if(result != 0)  { 
           fprintf(stderr, "dbm_store failed on key %s\n", key_to_use);
           exit(2);
      }
   }
   /* let's delete some data */
   sprintf(key_to_use, "bu%d", 13);
   key_datum.dptr = key_to_use;
   key_datum.dsize = strlen(key_to_use);

   if(dbm_delete(dbm_ptr, key_datum) == 0) 
       printf("Data with key %s deleted\n", key_to_use);
   else
      printf("nothing deleted for key %s", key_to_use);

   for(key_datum =dbm_firstkey(dbm_ptr); key_datum.dptr; 
                  key_datum = dbm_nextkey(dbm_ptr))  {
       data_datum = dbm_fetch(dbm_ptr, key_datum);
       if(data_datum.dptr)  {
           printf("Data retrieved\n");
           memcpy(&items_retrieved, data_datum.dptr, data_datum.dsize);
           printf("Retrieved items - %s %d %s\n", items_retrieved.misc_chars,
              items_retrieved.any_integer, items_retrieved.more_chars);
       }
       else 
           printf("No data found for key %s\n", key_to_use);
   }    
   
   dbm_close(dbm_ptr);
   exit(EXIT_SUCCESS);
}
Exemplo n.º 27
0
int main() {

    struct test_data items_to_store[ITEMS_USED];
    struct test_data item_retrieved;

    char key_to_use[20];
    int i, result;

    datum key_datum;
    datum data_datum;
    
    DBM *dbm_ptr;

    dbm_ptr = dbm_open(TEST_DB_FILE, O_RDWR | O_CREAT, 0666);
    if (!dbm_ptr) {
        fprintf(stderr, "Failed to open database\n");
        exit(EXIT_FAILURE);
    }

        /* put some data in the structures */
    memset(items_to_store, '\0', sizeof(items_to_store));
    strcpy(items_to_store[0].misc_chars, "First!");
    items_to_store[0].any_integer = 47;
    strcpy(items_to_store[0].more_chars, "foo");
    strcpy(items_to_store[1].misc_chars, "bar");
    items_to_store[1].any_integer = 13;
    strcpy(items_to_store[1].more_chars, "unlucky?");
    strcpy(items_to_store[2].misc_chars, "Third");
    items_to_store[2].any_integer = 3;
    strcpy(items_to_store[2].more_chars, "baz");

    for (i = 0; i < ITEMS_USED; i++) {
            /* build a key to use */
        sprintf(key_to_use, "%c%c%d",
            items_to_store[i].misc_chars[0],
            items_to_store[i].more_chars[0],
            items_to_store[i].any_integer);

            /* build the key datum strcture */
        key_datum.dptr = (void *)key_to_use;
        key_datum.dsize = strlen(key_to_use);
        data_datum.dptr = (void *)&items_to_store[i];
        data_datum.dsize = sizeof(struct test_data);

        result = dbm_store(dbm_ptr, key_datum, data_datum, DBM_REPLACE);
        if (result != 0) {
            fprintf(stderr, "dbm_store failed on key %s\n", key_to_use);
            exit(2);
        }
    } /* for */

        /* now try and retrieve some data */
    sprintf(key_to_use, "bu%d", 13); /* this is the key for the second item */
    key_datum.dptr = key_to_use;
    key_datum.dsize = strlen(key_to_use);

    data_datum = dbm_fetch(dbm_ptr, key_datum);
    if (data_datum.dptr) {
        printf("Data retrieved\n");
        memcpy(&item_retrieved, data_datum.dptr, data_datum.dsize);
        printf("Retrieved item - %s %d %s\n",
               item_retrieved.misc_chars,
               item_retrieved.any_integer,
               item_retrieved.more_chars);
    }
    else {
        printf("No data found for key %s\n", key_to_use);
    }

    dbm_close(dbm_ptr);

    exit(EXIT_SUCCESS);
}
Exemplo n.º 28
0
int
main(int argc, char **argv)
{
        typedef enum {
                YOW, FETCH, STORE, DELETE, SCAN, REGEXP
        } commands;
        char opt;
        int flags;
        int giveusage = 0;
        int verbose = 0;
        commands what = YOW;
        char *comarg[3];
        int st_flag = DBM_INSERT;
        int argn;
        DBM *db;
        datum key;
        datum content;

        flags = O_RDWR;
        argn = 0;

        while ((opt = getopt(argc, argv, "acdfFm:rstvx")) != ':') {
                switch (opt) {
                case 'a':
                        what = SCAN;
                        break;
                case 'c':
                        flags |= O_CREAT;
                        break;
                case 'd':
                        what = DELETE;
                        break;
                case 'f':
                        what = FETCH;
                        break;
                case 'F':
                        what = REGEXP;
                        break;
                case 'm':
                        flags &= ~(000007);
                        if (strcmp(optarg, "r") == 0)
                                flags |= O_RDONLY;
                        else if (strcmp(optarg, "w") == 0)
                                flags |= O_WRONLY;
                        else if (strcmp(optarg, "rw") == 0)
                                flags |= O_RDWR;
                        else {
                                fprintf(stderr, "Invalid mode: \"%s\"\n", optarg);
                                giveusage = 1;
                        }
                        break;
                case 'r':
                        st_flag = DBM_REPLACE;
                        break;
                case 's':
                        what = STORE;
                        break;
                case 't':
                        flags |= O_TRUNC;
                        break;
                case 'v':
                        verbose = 1;
                        break;
                case 'x':
                        flags |= O_EXCL;
                        break;
                case '!':
                        giveusage = 1;
                        break;
                case '?':
                        if (argn < 3)
                                comarg[argn++] = optarg;
                        else {
                                fprintf(stderr, "Too many arguments.\n");
                                giveusage = 1;
                        }
                        break;
                }
        }

        if (giveusage || what == YOW || argn < 1) {
                fprintf(stderr, "Usage: %s database [-m r|w|rw] [-crtx] -a|-d|-f|-F|-s [key [content]]\n", argv[0]);
                exit(-1);
        }

        if ((db = dbm_open(comarg[0], flags, 0777)) == NULL) {
                fprintf(stderr, "Error opening database \"%s\"\n", comarg[0]);
                exit(-1);
        }

        if (argn > 1)
                key = read_datum(comarg[1]);
        if (argn > 2)
                content = read_datum(comarg[2]);

        switch (what) {

        case SCAN:
                key = dbm_firstkey(db);
                if (dbm_error(db)) {
                        fprintf(stderr, "Error when fetching first key\n");
                        goto db_exit;
                }
                while (key.dptr != NULL) {
                        content = dbm_fetch(db, key);
                        if (dbm_error(db)) {
                                fprintf(stderr, "Error when fetching ");
                                print_datum(key);
                                printf("\n");
                                goto db_exit;
                        }
                        print_datum(key);
                        printf(": ");
                        print_datum(content);
                        printf("\n");
                        if (dbm_error(db)) {
                                fprintf(stderr, "Error when fetching next key\n");
                                goto db_exit;
                        }
                        key = dbm_nextkey(db);
                }
                break;

        case REGEXP:
                if (argn < 2) {
                        fprintf(stderr, "Missing regular expression.\n");
                        goto db_exit;
                }
                if (re_comp(comarg[1])) {
                        fprintf(stderr, "Invalid regular expression\n");
                        goto db_exit;
                }
                key = dbm_firstkey(db);
                if (dbm_error(db)) {
                        fprintf(stderr, "Error when fetching first key\n");
                        goto db_exit;
                }
                while (key.dptr != NULL) {
                        if (re_exec(key2s(key))) {
                                content = dbm_fetch(db, key);
                                if (dbm_error(db)) {
                                        fprintf(stderr, "Error when fetching ");
                                        print_datum(key);
                                        printf("\n");
                                        goto db_exit;
                                }
                                print_datum(key);
                                printf(": ");
                                print_datum(content);
                                printf("\n");
                                if (dbm_error(db)) {
                                        fprintf(stderr, "Error when fetching next key\n");
                                        goto db_exit;
                                }
                        }
                        key = dbm_nextkey(db);
                }
                break;

        case FETCH:
                if (argn < 2) {
                        fprintf(stderr, "Missing fetch key.\n");
                        goto db_exit;
                }
                content = dbm_fetch(db, key);
                if (dbm_error(db)) {
                        fprintf(stderr, "Error when fetching ");
                        print_datum(key);
                        printf("\n");
                        goto db_exit;
                }
                if (content.dptr == NULL) {
                        fprintf(stderr, "Cannot find ");
                        print_datum(key);
                        printf("\n");
                        goto db_exit;
                }
                print_datum(key);
                printf(": ");
                print_datum(content);
                printf("\n");
                break;

        case DELETE:
                if (argn < 2) {
                        fprintf(stderr, "Missing delete key.\n");
                        goto db_exit;
                }
                if (dbm_delete(db, key) || dbm_error(db)) {
                        fprintf(stderr, "Error when deleting ");
                        print_datum(key);
                        printf("\n");
                        goto db_exit;
                }
                if (verbose) {
                        print_datum(key);
                        printf(": DELETED\n");
                }
                break;

        case STORE:
                if (argn < 3) {
                        fprintf(stderr, "Missing key and/or content.\n");
                        goto db_exit;
                }
                if (dbm_store(db, key, content, st_flag) || dbm_error(db)) {
                        fprintf(stderr, "Error when storing ");
                        print_datum(key);
                        printf("\n");
                        goto db_exit;
                }
                if (verbose) {
                        print_datum(key);
                        printf(": ");
                        print_datum(content);
                        printf(" STORED\n");
                }
                break;
        }

db_exit:
        dbm_clearerr(db);
        dbm_close(db);
        if (dbm_error(db)) {
                fprintf(stderr, "Error closing database \"%s\"\n", comarg[0]);
                exit(-1);
        }
}
Exemplo n.º 29
0
/*
 *  This function initialises the cache database and possibly converts it
 *  to a newer format if such exists. Returns -1 on error. 0 on success.
 */
int
cache_init()
{
  int iret;
  char *ret, *ret2;
  struct jconfig *j;
#ifndef NOCACHE
  datum dbkey = {"#jwhois#cacheversion#1", 22};
  datum dbstore = {"1", 1};
#ifdef HAVE_GDBM_OPEN
  GDBM_FILE dbf;
#else
  DBM *dbf;
#endif

  if (!cache) return 0;

  jconfig_set();
  j = jconfig_getone("jwhois", "cachefile");
  if (!j)
    cfname = LOCALSTATEDIR "/jwhois.db";
  else
    cfname = j->value;

  if (verbose) printf("[Debug: cfname = \"%s\"]\n",cfname);

  jconfig_set();
  j = jconfig_getone("jwhois", "cacheexpire");
  if (!j)
    ret = CACHEEXPIRE;
  else
    ret = j->value;
#ifdef HAVE_STRTOL
  cfexpire = strtol(ret, &ret2, 10);
  if (*ret2 != '\0')
    {
      if (verbose)
	{
	  printf("[%s (%s) -- %s]\n", _("invalid expire time"),
		 ret, _("using defaults"));
	  cfexpire = 168;
	}
    }
#else
  cfexpire = atoi(ret2);
#endif /* HAVE_STRTOL */

  if (verbose) printf("[Debug: cfexpire = %d]\n", cfexpire);

  umask(0);
  dbf = dbm_open(cfname, DBM_COPTIONS, DBM_MODE);
  if (!dbf)
    {
      if (verbose) printf("[Debug: %s %s -- %s\n", _("unable to open"),
			  cfname, _("disabling cache"));
      cache = 0;
      return -1;
    }
  iret = dbm_store(dbf, dbkey, dbstore, DBM_IOPTIONS);
  if (iret < 0)
    {
      if (verbose) printf("[Debug: %s -- %s]\n",
			  _("unable to store data in database"),
			  _("disabling cache"));
      cache = 0;
    }
  dbm_close(dbf);
#endif
}
Exemplo n.º 30
0
	int RawStoreFile::store(datum key, datum content, int mode) {
		return dbm_store(_dbm, key, content, mode);
	}