예제 #1
0
파일: main.c 프로젝트: djpohly/radare2
static void terminate(int sig UNUSED) {
	if (!s) return;
	if (save && !sdb_sync (s))
		exit (1);
	sdb_free (s);
	exit (0);
}
예제 #2
0
파일: main.c 프로젝트: 0xroot/radare2
static void syncronize(int sig) {
	// TODO: must be in sdb_sync() or wat?
	Sdb *n;
	sdb_sync (s);
	n = sdb_new (s->dir, s->lock);
	sdb_free (s);
	s = n;
}
예제 #3
0
파일: main.c 프로젝트: djpohly/radare2
static void syncronize(int sig UNUSED) {
	// TODO: must be in sdb_sync() or wat?
	Sdb *n;
	sdb_sync (s);
	n = sdb_new (s->path, s->name, s->lock);
	sdb_free (s);
	s = n;
}
예제 #4
0
파일: main.c 프로젝트: lionaneesh/radare2
static void synchronize(int sig UNUSED) {
	// TODO: must be in sdb_sync() or wat?
	Sdb *n;
	sdb_sync (s);
	n = sdb_new (s->path, s->name, s->lock);
	if (n) {
		sdb_config (n, options);
		sdb_free (s);
		s = n;
	}
}
예제 #5
0
파일: main.c 프로젝트: codepongo/radare2
static void syncronize(int sig UNUSED) {
	// TODO: must be in sdb_sync() or wat?
	Sdb *n;
	sdb_sync (s);
	n = sdb_new (s->path, s->name, s->lock);
	if (n) {
		sdb_config (n, SDB_OPTION_FS | SDB_OPTION_NOSTAMP);
		sdb_free (s);
		s = n;
	}
}
예제 #6
0
파일: main.c 프로젝트: lionaneesh/radare2
static void terminate(int sig UNUSED) {
	if (!s) {
		return;
	}
	if (save && !sdb_sync (s)) {
		sdb_free (s);
		s = NULL;
		exit (1);
	}
	sdb_free (s);
	exit (0);
}
예제 #7
0
파일: sdb.c 프로젝트: bjfbm/SDB
int sdb_insert(sdb* db,slice* key,slice* value){
	if(db->init==0) {
		if(init(db)==-1) return -1;
	}
	int rec_pos;
	int ret=sdb_idx_find(db,key,&rec_pos);
	if(ret==0) return -1;

	ret=sdb_dat_insert(db,key,value);
	if(ret==-1) return -1;
	ret=sdb_idx_insert(db,key,ret);
	if(ret==-1) return -1;
	if(db->auto_commit==1)
        if(-1==sdb_sync(db)) return -1;
	return 0;
}
예제 #8
0
파일: syncget.c 프로젝트: condret/sdb
int main() {
#define DBFILE "___syncget.db"
	const char *v;
	Sdb *s = sdb_new0();
	unlink (DBFILE);
	sdb_set (s, "foo", "bar", 0);
	eprintf ("-> %s\n", sdb_get (s, "foo", NULL));
	sdb_file (s, DBFILE);
	sdb_sync (s);
	v = sdb_const_get (s, "foo", NULL);
	if (v && !strcmp ("bar",  v)) {
		eprintf ("OK syncget\n");
		return 0;
	}
	eprintf ("ERROR syncget: Keys not accessible after sync\n");
	return 1;
}
예제 #9
0
파일: sdb.c 프로젝트: bjfbm/SDB
int sdb_delete(sdb* db,slice* key){
	if(db->init==0) {
		return -1;
	}
	int ret,rec_pos;
	ret=sdb_idx_find(db,key,&rec_pos);
	//fprintf(stderr,"rec_pos:%d\n",rec_pos);
	if(ret==-1) return -1;

	char c=DELETED;
	if(sdb_cache_setdat(db->dat_cache,rec_pos,&c,1)==-1) return -1;
	ret=sdb_idx_delete(db,key);
	if(ret==-1) return -1;
	if(db->auto_commit==1)
        if(-1==sdb_sync(db)) return -1;
	return 0;
}
예제 #10
0
파일: sdb.c 프로젝트: bjfbm/SDB
int sdb_replace(sdb* db,slice* key,slice* value){
	if(db->init==0) {
		if(init(db)==-1) return -1;
	}
	int ret,rec_pos;
	ret=sdb_idx_find(db,key,&rec_pos);
	if(ret==-1) return -1;

	char c=DELETED;
	if(sdb_cache_setdat(db->dat_cache,rec_pos,&c,1)==-1) return -1;
	ret=sdb_dat_insert(db,key,value);
	if(ret==-1) return -1;

	ret=sdb_cache_setdat(db->idx_cache,db->cur_ptr+8+key->len,(char*)&ret,sizeof(int));
	if(ret==-1) return -1;

	if(db->auto_commit==1)
        if(-1==sdb_sync(db)) return -1;
	return 0;
}
예제 #11
0
파일: sdb.c 프로젝트: bjfbm/SDB
static int init(sdb* db){
	int idx_len=HEADER_LEN+DEF_IDX_HASHES*BUCKET_LEN;
	char buf[idx_len];
	int tmp=-1;
	int len=strlen(db->path);
	strcpy(db->path+len-4,".dat");
	int dat_fd,idx_fd;
	dat_fd=open(db->path,O_RDWR | O_CREAT |O_EXCL,MODE);
	if(dat_fd<0) return -1;
	strcpy(db->path+len-4,".idx");
	idx_fd=open(db->path,O_RDWR | O_CREAT |O_EXCL,MODE);
	if(idx_fd<0) {
		close(dat_fd);
		return -1;
	}
	strcpy(db->path+len-4,".log");
	db->dat_cache=sdb_cache_new(dat_fd,3,5,db->path,WAL_DAT);
	if(NULL==db->dat_cache) goto err;
	db->idx_cache=sdb_cache_new(idx_fd,3,5,db->path,WAL_IDX);
	if(NULL==db->idx_cache) {
		sdb_cache_free(db->dat_cache);
		goto err;
	}
	memset(buf,0,idx_len);
	if(-1==sdb_cache_append(db->idx_cache,buf,idx_len)) goto err2;
	if(-1==sdb_cache_append(db->dat_cache,(char*)&tmp,4)) goto err2;
	if(-1==sdb_sync(db)) goto err2;
	db->init=1;
	return 0;
	err2:
        sdb_cache_free(db->dat_cache);
        sdb_cache_free(db->idx_cache);
	err:
        close(dat_fd);
        close(idx_fd);
        return -1;
}
예제 #12
0
파일: xrefs.c 프로젝트: eddyb/radare2
R_API void r_anal_xrefs_save(RAnal *anal, const char *prjfile) {
	sdb_sync (anal->sdb_xrefs);
}
예제 #13
0
파일: main.c 프로젝트: 0xroot/radare2
static void terminate(int sig) {
	if (!s) return;
	if (save) sdb_sync (s);
	sdb_free (s);
	exit (0);
}
예제 #14
0
R_API int r_core_project_save(RCore *core, const char *file) {
	int fd, fdold, tmp, ret = R_TRUE;
	char *prj;

	if (file == NULL || *file == '\0')
		return R_FALSE;

	prj = r_core_project_file (core, file);
	if (r_file_is_directory (prj)) {
		eprintf ("Error: Target is a directory\n");
		free (prj);
		return R_FALSE;
	}
	r_core_project_init (core);
	r_anal_project_save (core->anal, prj);
	fd = r_sandbox_open (prj, O_BINARY|O_RDWR|O_CREAT, 0644);
	if (fd != -1) {
		fdold = r_cons_singleton ()->fdout;
		r_cons_singleton ()->fdout = fd;
		r_cons_singleton ()->is_interactive = R_FALSE;
		r_str_write (fd, "# r2 rdb project file\n");
		r_str_write (fd, "# flags\n");
		tmp = core->flags->space_idx;
		core->flags->space_idx = -1;
		r_flag_list (core->flags, R_TRUE);
		core->flags->space_idx = tmp;
		r_cons_flush ();
		r_str_write (fd, "# eval\n");
		// TODO: r_str_writef (fd, "e asm.arch=%s", r_config_get ("asm.arch"));
		r_config_list (core->config, NULL, R_TRUE);
		r_cons_flush ();
		r_str_write (fd, "# sections\n");
		r_io_section_list (core->io, core->offset, 1);
		r_cons_flush ();
		r_str_write (fd, "# meta\n");
		r_meta_list (core->anal, R_META_TYPE_ANY, 1);
		r_cons_flush ();
		 {
			char buf[1024];
			snprintf (buf, sizeof (buf), "%s.d/xrefs", prj);
			sdb_file (core->anal->sdb_xrefs, buf);
			sdb_sync (core->anal->sdb_xrefs);
		 }
		r_core_cmd (core, "ax*", 0);
		r_cons_flush ();
		r_core_cmd (core, "af*", 0);
		r_cons_flush ();
		r_core_cmd (core, "ah*", 0);
		r_cons_flush ();
		r_str_write (fd, "# seek\n");
		r_str_writef (fd, "s 0x%08"PFMT64x, core->offset);
		r_cons_flush ();
		close (fd);
		r_cons_singleton ()->fdout = fdold;
		r_cons_singleton ()->is_interactive = R_TRUE;
	} else {
		eprintf ("Cannot open '%s' for writing\n", prj);
		ret = R_FALSE;
	}
	free (prj);
	return ret;
}
예제 #15
0
파일: xrefs.c 프로젝트: XVilka/radare2
R_API bool r_anal_xrefs_save(RAnal *anal, const char *prjDir) {
	char *xrefs_path = r_str_newf ("%s" R_SYS_DIR "xrefs.sdb", prjDir);
	sdb_file (anal->sdb_xrefs, xrefs_path);
	free (xrefs_path);
	return sdb_sync (anal->sdb_xrefs);
}
예제 #16
0
파일: sdb.c 프로젝트: bjfbm/SDB
int sdb_commit(sdb* db){
    if(-1==sdb_sync(db)) return -1;
    db->auto_commit=1;
    return 0;
}