mirror of
https://github.com/radareorg/radare2.git
synced 2024-10-09 20:04:49 +00:00
* Merge
This commit is contained in:
commit
fd49310812
1
TODO
1
TODO
@ -41,7 +41,6 @@ OSX
|
||||
===
|
||||
* Cant set register values in OSX debugger
|
||||
- This is probably because we are using the 32bit binary on 64bit dbg
|
||||
* Add support for OSX/Lion (PIE bins)
|
||||
* Proper support for MACH-O binaries
|
||||
- rabin2 -f works? i think its used with '-a'
|
||||
- I think symbols are not correct .. (offset+disk)
|
||||
|
@ -211,7 +211,9 @@ int main(int argc, char **argv) {
|
||||
}
|
||||
|
||||
if (fh == NULL) {
|
||||
eprintf ("Cannot open file.\n");
|
||||
if (perms & R_IO_WRITE)
|
||||
eprintf ("Cannot open file for writing.\n");
|
||||
else eprintf ("Cannot open file.\n");
|
||||
return 1;
|
||||
}
|
||||
if (r.file == NULL) // no given file
|
||||
|
@ -8,8 +8,8 @@ IFX=${DESTDIR}/${INCLUDEDIR}
|
||||
PWD=`pwd`
|
||||
|
||||
# Libraries
|
||||
LIBLIST=util socket cons line lib io lang flags bin hash config syscall cmd
|
||||
LIBLIST+=reg asm diff anal print parse search egg bp sign debug fs core
|
||||
LIBLIST=util socket db cons line lib io lang flags bin hash config syscall
|
||||
LIBLIST+=cmd reg asm diff anal print parse search egg bp sign debug fs core
|
||||
#DEPRECATED APIS : LIBLIST+=th crypto
|
||||
# sysproxy ... common wat du?
|
||||
|
||||
|
@ -68,10 +68,11 @@ static int checkbpcallback(RCore *core) {
|
||||
}
|
||||
|
||||
static int bypassbp(RCore *core) {
|
||||
RBreakpointItem *bpi;
|
||||
ut64 addr;
|
||||
r_debug_reg_sync (core->dbg, R_REG_TYPE_GPR, R_FALSE);
|
||||
addr = r_debug_reg_get (core->dbg, "pc");
|
||||
RBreakpointItem *bpi = r_bp_get (core->dbg->bp, addr);
|
||||
bpi = r_bp_get (core->dbg->bp, addr);
|
||||
if (!bpi) return R_FALSE;
|
||||
/* XXX 2 if libr/debug/debug.c:226 is enabled */
|
||||
r_debug_step (core->dbg, 1);
|
||||
@ -156,9 +157,8 @@ static int cmd_zign(void *data, const char *input) {
|
||||
name = flag->name;
|
||||
r_cons_printf ("zb %s ", name);
|
||||
len = (fcni->size>sizeof (buf))?sizeof (buf):fcni->size;
|
||||
for (i=0; i<len; i++) {
|
||||
for (i=0; i<len; i++)
|
||||
r_cons_printf ("%02x", buf[i]);
|
||||
}
|
||||
r_cons_newline ();
|
||||
} else eprintf ("Unnamed function at 0x%08"PFMT64x"\n", fcni->addr);
|
||||
} else eprintf ("Cannot read at 0x%08"PFMT64x"\n", fcni->addr);
|
||||
@ -253,7 +253,7 @@ static int cmd_zign(void *data, const char *input) {
|
||||
break;
|
||||
case '\0':
|
||||
case '*':
|
||||
r_sign_list (core->sign, (input[0]=='*'));
|
||||
r_sign_list (core->sign, (*input=='*'));
|
||||
break;
|
||||
default:
|
||||
case '?':
|
||||
@ -1688,13 +1688,12 @@ l = len;
|
||||
}
|
||||
break;
|
||||
case '=':
|
||||
eprintf ("TODO: use zoom.byte to display entropy. like rahash2 -a entropy -b 32 /bin/ls\n");
|
||||
for (i=0; i<core->blocksize; i++) {
|
||||
int pc = (core->block[i]*100)/255;
|
||||
r_print_addr (core->print, core->offset+i);
|
||||
r_cons_printf ("%02x", core->block[i]);
|
||||
r_print_progressbar (core->print, pc, 70);
|
||||
r_cons_newline ();
|
||||
/* TODO: Reimplement using API */ {
|
||||
char *out = r_sys_cmd_strf ("rahash2 -a entropy -b 512 '%s'", core->file->filename);
|
||||
if (out) {
|
||||
r_cons_strcat (out);
|
||||
free (out);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'b':
|
||||
@ -1916,8 +1915,14 @@ l = len;
|
||||
} else {
|
||||
char *oldzoom = NULL;
|
||||
ut64 maxsize = r_config_get_i (core->config, "zoom.maxsz");
|
||||
ut64 from = r_config_get_i (core->config, "zoom.from");
|
||||
ut64 to = r_config_get_i (core->config, "zoom.to");
|
||||
ut64 from, to;
|
||||
int oldva = core->io->va;
|
||||
|
||||
from = 0;
|
||||
core->io->va = 0;
|
||||
to = r_io_size (core->io);
|
||||
from = r_config_get_i (core->config, "zoom.from");
|
||||
to = r_config_get_i (core->config, "zoom.to");
|
||||
if (input[1] != '\0' && input[1] != ' ') {
|
||||
oldzoom = strdup (r_config_get (core->config, "zoom.byte"));
|
||||
if (!r_config_set (core->config, "zoom.byte", input+1)) {
|
||||
@ -1932,12 +1937,14 @@ l = len;
|
||||
r_config_set (core->config, "zoom.byte", oldzoom);
|
||||
free (oldzoom);
|
||||
}
|
||||
if (oldva)
|
||||
core->io->va = oldva;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
r_cons_printf (
|
||||
"Usage: p[fmt] [len]\n"
|
||||
" p= [len] print byte percentage bars\n"
|
||||
" p= show entropy bars of full file\n"
|
||||
" p6[de] [len] base64 decode/encode\n"
|
||||
" p8 [len] 8bit hexpair list of bytes\n"
|
||||
" pb [len] bitstream of N bytes\n"
|
||||
|
@ -50,7 +50,7 @@ static ut64 num_callback(RNum *userptr, const char *str, int *ok) {
|
||||
case 'o': return core->io->off;
|
||||
}
|
||||
}
|
||||
if (str[0]>'A') {
|
||||
if (*str>'A') {
|
||||
if ((flag = r_flag_get (core->flags, str))) {
|
||||
ret = flag->offset;
|
||||
*ok = R_TRUE;
|
||||
@ -76,7 +76,7 @@ static const char *radare_argv[] = {
|
||||
"#sha1", "#crc32", "#pcprint", "#sha256", "#sha512", "#md4", "#md5",
|
||||
"#!python", "#!perl", "#!vala",
|
||||
"V",
|
||||
"aa", "ab", "af", "ar", "ag", "at", "av", "a?",
|
||||
"aa", "ab", "af", "ar", "ag", "at", "a?",
|
||||
"aga", "agc", "agd", "agl", "agfl",
|
||||
"e", "e-", "e*", "e!",
|
||||
"i", "ii", "iI", "is", "iS", "iz",
|
||||
@ -128,7 +128,7 @@ static int autocomplete(RLine *line) {
|
||||
int n, i = 0;
|
||||
int sdelta = 2; //(line->buffer.data[1]==' ')?2:3;
|
||||
if (!line->buffer.data[sdelta]) {
|
||||
path = r_sys_getcwd ();
|
||||
path = r_sys_getdir ();
|
||||
} else {
|
||||
path = strdup (line->buffer.data+sdelta);
|
||||
}
|
||||
@ -380,6 +380,7 @@ R_API RCore *r_core_free(RCore *c) {
|
||||
free (c);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
R_API void r_core_prompt_loop(RCore *r) {
|
||||
int ret;
|
||||
do {
|
||||
|
@ -147,11 +147,16 @@ R_API int r_core_print_disasm(RPrint *p, RCore *core, ut64 addr, ut8 *buf, int l
|
||||
//eprintf ("** invalid opcode at 0x%08"PFMT64x" **\n",
|
||||
// core->assembler->pc + ret);
|
||||
lastfail = 1;
|
||||
continue;
|
||||
strcpy (asmop.buf_asm, "invalid");
|
||||
sprintf (asmop.buf_hex, "%02x", buf[idx]);
|
||||
//continue;
|
||||
} else lastfail = 0;
|
||||
if (core->inc == 0)
|
||||
core->inc = ret;
|
||||
r_anal_op (core->anal, &analop, at, buf+idx, (int)(len-idx));
|
||||
|
||||
if (lastfail)
|
||||
memset (&analop, 0, sizeof (analop));
|
||||
else r_anal_op (core->anal, &analop, at, buf+idx, (int)(len-idx));
|
||||
{
|
||||
RAnalValue *src;
|
||||
switch (analop.type) {
|
||||
|
@ -169,6 +169,7 @@ R_API int r_core_visual_cmd(RCore *core, int ch) {
|
||||
r_cons_flush ();
|
||||
r_cons_set_raw (0);
|
||||
strcpy (buf, "wx ");
|
||||
r_line_set_prompt ("hex: ");
|
||||
if (r_cons_fgets (buf+3, 1000, 0, NULL) <0) buf[0]='\0';
|
||||
if (*buf) {
|
||||
if (curset) r_core_seek (core, core->offset + cursor, 0);
|
||||
@ -200,13 +201,25 @@ R_API int r_core_visual_cmd(RCore *core, int ch) {
|
||||
r_io_sundo_push (core->io);
|
||||
break;
|
||||
case 'G':
|
||||
{
|
||||
int ret = 0;
|
||||
if (core->io->va) {
|
||||
ut64 offset = r_io_section_get_vaddr (core->io, core->file->size-core->blocksize);
|
||||
r_core_seek (core, offset, 1);
|
||||
} else
|
||||
r_core_seek (core, core->file->size-core->blocksize, 1);
|
||||
ut64 offset = r_io_section_get_vaddr (core->io, 0);
|
||||
//ut64 offset = r_io_section_get_vaddr (core->io,
|
||||
// core->file->size-core->blocksize);
|
||||
if (offset == UT64_MAX) {
|
||||
ret = r_core_seek (core, offset, 1);
|
||||
memset (core->block, 0xff, core->blocksize);
|
||||
} else {
|
||||
offset += core->file->size - core->blocksize;
|
||||
ret = r_core_seek (core, offset, 1);
|
||||
memset (core->block, 0xff, core->blocksize);
|
||||
}
|
||||
} else {
|
||||
ret = r_core_seek (core, core->file->size-core->blocksize, 1);
|
||||
}
|
||||
r_io_sundo_push (core->io);
|
||||
//r_core_cmd(core, "s 0", 0);
|
||||
}
|
||||
break;
|
||||
case 'h':
|
||||
if (curset) {
|
||||
@ -369,10 +382,10 @@ R_API int r_core_visual_cmd(RCore *core, int ch) {
|
||||
core->printidx = (core->printidx-1)%NPF;
|
||||
break;
|
||||
case 'm':
|
||||
r_core_visual_mark (core, r_cons_readchar());
|
||||
r_core_visual_mark (core, r_cons_readchar ());
|
||||
break;
|
||||
case '\'':
|
||||
r_core_visual_mark_seek (core, r_cons_readchar());
|
||||
r_core_visual_mark_seek (core, r_cons_readchar ());
|
||||
break;
|
||||
case 'y':
|
||||
if (ocursor==-1) r_core_yank (core, core->offset+cursor, 1);
|
||||
|
@ -12,9 +12,9 @@ p.set ("foo", "bar")
|
||||
var out = p.get ("foo")
|
||||
*/
|
||||
|
||||
|
||||
R_API RPair *r_pair_new () {
|
||||
RPair *p = R_NEW0 (RPair);
|
||||
p->ht = r_hashtable_new ();
|
||||
p->dbs = r_list_new ();
|
||||
p->dbs->free = (RListFree)sdb_free;
|
||||
return p;
|
||||
@ -44,22 +44,45 @@ R_API void r_pair_delete (RPair *p, const char *name) {
|
||||
sdb_delete (sdb, key);
|
||||
}
|
||||
|
||||
static Sdb *pair_sdb_new(RPair *p, const char *dom, ut32 hdom) {
|
||||
Sdb *sdb;
|
||||
char *old = NULL;
|
||||
if (p->dir) {
|
||||
old = r_sys_getdir ();
|
||||
r_sys_rmkdir (p->dir);
|
||||
r_sys_chdir (p->dir);
|
||||
}
|
||||
|
||||
sdb = sdb_new (dom, 0);
|
||||
if (old) {
|
||||
r_sys_chdir (old);
|
||||
free (old);
|
||||
}
|
||||
r_list_append (p->dbs, sdb);
|
||||
r_hashtable_insert (p->ht, hdom, sdb);
|
||||
return sdb;
|
||||
}
|
||||
|
||||
R_API char *r_pair_get (RPair *p, const char *name) {
|
||||
Sdb *sdb;
|
||||
ut32 hdom;
|
||||
char *dom, *key = strdup (name);
|
||||
char *dom, *key, *okey = strdup (name);
|
||||
|
||||
dom = r_str_lchr (key, '.');
|
||||
key = okey;
|
||||
dom = r_str_lchr (okey, '.');
|
||||
if (dom) {
|
||||
key = dom+1;
|
||||
char *tmp = okey;
|
||||
*dom = 0;
|
||||
dom = 0;
|
||||
key = dom+1;
|
||||
dom = tmp;
|
||||
} else dom = "";
|
||||
hdom = r_str_hash (dom);
|
||||
sdb = r_hashtable_lookup (p->ht, hdom);
|
||||
if (sdb)
|
||||
return sdb_get (sdb, key);
|
||||
return strdup ("");
|
||||
if (!sdb)
|
||||
sdb = pair_sdb_new (p, dom, hdom);
|
||||
dom = sdb_get (sdb, key);
|
||||
free (okey);
|
||||
return dom;
|
||||
}
|
||||
|
||||
R_API void r_pair_set (RPair *p, const char *name, const char *value) {
|
||||
@ -69,38 +92,76 @@ R_API void r_pair_set (RPair *p, const char *name, const char *value) {
|
||||
|
||||
dom = r_str_lchr (key, '.');
|
||||
if (dom) {
|
||||
key = dom+1;
|
||||
char *okey = key;
|
||||
*dom = 0;
|
||||
dom = 0;
|
||||
key = dom+1;
|
||||
dom = okey;
|
||||
} else dom = "";
|
||||
hdom = r_str_hash (dom);
|
||||
sdb = r_hashtable_lookup (p->ht, hdom);
|
||||
if (!sdb) {
|
||||
sdb = sdb_new (dom, 0);
|
||||
r_hashtable_insert (p->ht, hdom, sdb);
|
||||
}
|
||||
if (!sdb)
|
||||
sdb = pair_sdb_new (p, dom, hdom);
|
||||
sdb_set (sdb, key, value);
|
||||
}
|
||||
|
||||
R_API RList *r_pair_list (RPair *p, const char *domain) {
|
||||
ut32 hdom = r_str_hash (domain);
|
||||
Sdb *s = r_hashtable_lookup (p->ht, hdom);
|
||||
if (s) {
|
||||
RList *list = r_list_new ();
|
||||
char key[SDB_KEYSIZE];
|
||||
char val[SDB_VALUESIZE];
|
||||
list->free = (RListFree)r_pair_item_free;
|
||||
sdb_dump_begin (s);
|
||||
while (sdb_dump_next (s, key, val))
|
||||
r_list_append (list, r_pair_item_new (key, val));
|
||||
return list;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
RPairItem *r_pair_item_new (const char *k, const char *v) {
|
||||
RPairItem *i = R_NEW (RPairItem);
|
||||
i->k = strdup (k);
|
||||
i->v = strdup (v);
|
||||
return i;
|
||||
}
|
||||
|
||||
R_API void r_pair_item_free (RPairItem *i) {
|
||||
free (i->k);
|
||||
free (i->v);
|
||||
free (i);
|
||||
}
|
||||
|
||||
R_API void r_pair_set_sync_dir (RPair *p, const char *dir) {
|
||||
free (p->dir);
|
||||
p->dir = strdup (dir);
|
||||
}
|
||||
|
||||
// use sync dir
|
||||
R_API void r_pair_load (RPair *p) {
|
||||
// TODO
|
||||
//R_API void r_pair_load (RPair *p) { /* TODO */ }
|
||||
|
||||
R_API void r_pair_reset (RPair *p) {
|
||||
Sdb *s;
|
||||
RListIter *iter;
|
||||
r_list_foreach (p->dbs, iter, s)
|
||||
sdb_reset (s);
|
||||
}
|
||||
|
||||
R_API void r_pair_sync (RPair *p) {
|
||||
Sdb *s;
|
||||
char *old = NULL;
|
||||
RListIter *iter;
|
||||
// chdir
|
||||
if (p->dir) {
|
||||
old = r_sys_getdir ();
|
||||
r_sys_rmkdir (p->dir);
|
||||
r_sys_chdir (p->dir);
|
||||
}
|
||||
r_list_foreach (p->dbs, iter, s) {
|
||||
sdb_sync (s);
|
||||
}
|
||||
if (old) {
|
||||
r_sys_chdir (old);
|
||||
free (old);
|
||||
}
|
||||
}
|
||||
|
@ -6,7 +6,10 @@
|
||||
static char buf[128];
|
||||
|
||||
const char *sdb_lockfile(const char *f) {
|
||||
int len = strlen (f);
|
||||
int len;
|
||||
if (!f || !*f)
|
||||
return NULL;
|
||||
len = strlen (f);
|
||||
if (len+10>sizeof buf)
|
||||
return NULL;
|
||||
memcpy (buf, f, len);
|
||||
|
@ -15,7 +15,7 @@ Sdb* sdb_new (const char *dir, int lock) {
|
||||
if (lock && !sdb_lock (sdb_lockfile (dir)))
|
||||
return NULL;
|
||||
s = malloc (sizeof (Sdb));
|
||||
if (dir) {
|
||||
if (dir && *dir) {
|
||||
s->dir = strdup (dir);
|
||||
s->fd = open (dir, O_RDONLY);
|
||||
} else {
|
||||
@ -31,6 +31,17 @@ Sdb* sdb_new (const char *dir, int lock) {
|
||||
return s;
|
||||
}
|
||||
|
||||
void sdb_file (Sdb* s, const char *dir) {
|
||||
if (s->lock)
|
||||
sdb_unlock (sdb_lockfile (s->dir));
|
||||
free (s->dir);
|
||||
if (dir && *dir)
|
||||
s->dir = strdup (dir);
|
||||
else s->dir = NULL;
|
||||
if (s->lock)
|
||||
sdb_lock (sdb_lockfile (s->dir));
|
||||
}
|
||||
|
||||
void sdb_free (Sdb* s) {
|
||||
if (!s) return;
|
||||
cdb_free (&s->db);
|
||||
@ -97,6 +108,11 @@ int sdb_exists (Sdb* s, const char *key) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void sdb_reset (Sdb *s) {
|
||||
ht_free (s->ht);
|
||||
s->ht = ht_new ();
|
||||
}
|
||||
|
||||
struct sdb_kv* sdb_kv_new (const char *k, const char *v) {
|
||||
struct sdb_kv *kv = R_NEW (struct sdb_kv);
|
||||
strncpy (kv->key, k, sizeof (kv->key)-1);
|
||||
|
@ -28,6 +28,8 @@ typedef struct sdb_kv {
|
||||
|
||||
Sdb* sdb_new (const char *dir, int lock);
|
||||
void sdb_free (Sdb* s);
|
||||
void sdb_file (Sdb* s, const char *dir);
|
||||
void sdb_reset (Sdb *s);
|
||||
|
||||
int sdb_exists (Sdb*, const char *key);
|
||||
int sdb_nexists (Sdb*, const char *key);
|
||||
|
@ -4,7 +4,10 @@ include ../../config.mk
|
||||
|
||||
all: test${EXT_EXE}
|
||||
|
||||
test${EXT_EXE}:
|
||||
test.o: test.c
|
||||
@echo nothing
|
||||
|
||||
test${EXT_EXE}: test.o
|
||||
${CC} -g -I ../../include test.c -L.. -lr_db -lr_util -L../../util -o test${EXT_EXE}
|
||||
|
||||
clean:
|
||||
|
@ -1,6 +1,9 @@
|
||||
/* radare - LGPL - Copyright 2009-2010 pancake<nopcode.org> */
|
||||
|
||||
|
||||
#include "r_db.h"
|
||||
void test_pair ();
|
||||
void test_db();
|
||||
|
||||
struct item_t {
|
||||
char city[10];
|
||||
@ -12,7 +15,39 @@ struct item_t {
|
||||
#define K_CITY R_DB_INDEXOF(struct item_t, city)
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
struct r_db_t *db = r_db_new();
|
||||
test_pair ();
|
||||
test_db ();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void test_pair () {
|
||||
char *s;
|
||||
RPair *p = r_pair_new ();
|
||||
r_pair_set_sync_dir (p, "sdb-db-test");
|
||||
|
||||
r_pair_set (p, "root", "clown");
|
||||
r_pair_set (p, ".branch", "clown");
|
||||
r_pair_set (p, "user.name", "pancake");
|
||||
r_pair_set (p, "user.pass", "password");
|
||||
|
||||
s = r_pair_get (p, "user.name");
|
||||
printf ("user.name=%s\n", s);
|
||||
|
||||
{
|
||||
RPairItem *o;
|
||||
RListIter *iter;
|
||||
RList *list = r_pair_list (p, "user");
|
||||
printf ("DUMP:\n");
|
||||
r_list_foreach (list, iter, o) {
|
||||
printf (" %s = %s\n", o->k, o->v);
|
||||
}
|
||||
r_list_destroy (list);
|
||||
}
|
||||
r_pair_sync (p);
|
||||
}
|
||||
|
||||
void test_db() {
|
||||
RDatabase *db = r_db_new ();
|
||||
void **siter;
|
||||
struct item_t *it, tmp;
|
||||
|
||||
@ -71,6 +106,4 @@ int main(int argc, char **argv) {
|
||||
|
||||
printf("--> free db\n");
|
||||
r_db_free(db);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -56,8 +56,25 @@ while (r_db_iter_next(it)) {
|
||||
}
|
||||
#endif
|
||||
|
||||
typedef struct r_pair_item_t {
|
||||
char *k, *v;
|
||||
} RPairItem;
|
||||
|
||||
|
||||
#ifdef R_API
|
||||
R_API RPairItem *r_pair_item_new ();
|
||||
R_API void r_pair_item_free (RPairItem*);
|
||||
|
||||
R_API RPair *r_pair_new ();
|
||||
R_API void r_pair_free (RPair *p);
|
||||
R_API void r_pair_delete (RPair *p, const char *name);
|
||||
R_API char *r_pair_get (RPair *p, const char *name);
|
||||
R_API void r_pair_set (RPair *p, const char *name, const char *value);
|
||||
R_API RList *r_pair_list (RPair *p, const char *domain);
|
||||
R_API void r_pair_set_sync_dir (RPair *p, const char *dir);
|
||||
R_API void r_pair_load (RPair *p);
|
||||
R_API void r_pair_sync (RPair *p);
|
||||
/* */
|
||||
R_API struct r_db_t *r_db_new();
|
||||
R_API struct r_db_block_t *r_db_block_new();
|
||||
R_API int r_db_add_id(struct r_db_t *db, int off, int size);
|
||||
|
@ -356,7 +356,8 @@ R_API int r_sys_sleep(int secs);
|
||||
R_API int r_sys_usleep(int usecs);
|
||||
R_API char *r_sys_getenv(const char *key);
|
||||
R_API int r_sys_setenv(const char *key, const char *value);
|
||||
R_API char *r_sys_getcwd();
|
||||
R_API char *r_sys_getdir();
|
||||
R_API int r_sys_chdir(const char *s);
|
||||
R_API char *r_sys_cmd_str_full(const char *cmd, const char *input, int *len, char **sterr);
|
||||
#if __WINDOWS__
|
||||
R_API char *r_sys_cmd_str_w32(const char *cmd);
|
||||
|
@ -178,7 +178,7 @@ R_API int r_print_string(RPrint *p, ut64 seek, const ut8 *buf, int len, int wide
|
||||
// TODO: some ascii can be bypassed here
|
||||
p->printf ("%%%02x", buf[i]);
|
||||
} else {
|
||||
if (IS_PRINTABLE (buf[i]))
|
||||
if (buf[i]=='\n' || IS_PRINTABLE (buf[i]))
|
||||
p->printf ("%c", buf[i]);
|
||||
else p->printf ("\\x%02x", buf[i]);
|
||||
}
|
||||
|
@ -27,14 +27,17 @@ R_API boolt r_file_exist(const char *str) {
|
||||
}
|
||||
|
||||
R_API char *r_file_abspath(const char *file) {
|
||||
char *ret = NULL;
|
||||
char *cwd = r_sys_getdir ();
|
||||
#if __UNIX__
|
||||
if (file[0] != '/')
|
||||
return r_str_dup_printf ("%s/%s", r_sys_getcwd (), file);
|
||||
if (cwd && *file != '/')
|
||||
ret = r_str_dup_printf ("%s/%s", cwd, file);
|
||||
#elif __WINDOWS__
|
||||
if (!strchr (file, ':'))
|
||||
return r_str_dup_printf ("%s/%s", r_sys_getcwd (), file);
|
||||
if (cwd && !strchr (file, ':'))
|
||||
ret = r_str_dup_printf ("%s/%s", cwd, file);
|
||||
#endif
|
||||
return strdup (file);
|
||||
free (cwd);
|
||||
return ret? ret: strdup (file);
|
||||
}
|
||||
|
||||
R_API char *r_file_path(const char *bin) {
|
||||
|
@ -203,6 +203,7 @@ R_API ut64 r_str_hash64(const char *str) {
|
||||
|
||||
R_API ut32 r_str_hash(const char *str) {
|
||||
ut32 ret = 0;
|
||||
if (str)
|
||||
for (; *str; str++)
|
||||
ret ^= (ret<<7 | *str);
|
||||
return ret;
|
||||
|
@ -181,30 +181,30 @@ R_API int r_sys_crash_handler(const char *cmd) {
|
||||
#endif
|
||||
}
|
||||
|
||||
#if __WINDOWS__
|
||||
R_API char *r_sys_getenv(const char *key) {
|
||||
#if __WINDOWS__
|
||||
static char envbuf[1024];
|
||||
envbuf[0] = 0;
|
||||
GetEnvironmentVariable (key, (LPSTR)&envbuf, sizeof (envbuf));
|
||||
// TODO: handle return value of GEV
|
||||
return strdup (envbuf);
|
||||
}
|
||||
return *envbuf? strdup (envbuf): NULL;
|
||||
#else
|
||||
R_API char *r_sys_getenv(const char *key) {
|
||||
char *b = getenv (key);
|
||||
if (b) return strdup (b);
|
||||
return NULL;
|
||||
return b? strdup (b): NULL;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
R_API char *r_sys_getcwd(void) {
|
||||
#if __UNIX__
|
||||
return getcwd (NULL, 0);
|
||||
#elif __WINDOWS__
|
||||
return _getcwd (NULL, 0);
|
||||
R_API char *r_sys_getdir(void) {
|
||||
#if __WINDOWS__
|
||||
char *cwd = _getcwd (NULL, 0);
|
||||
#else
|
||||
#warning TODO: r_sys_getcwd
|
||||
char *cwd = getcwd (NULL, 0);
|
||||
#endif
|
||||
return cwd? strdup (cwd): NULL;
|
||||
}
|
||||
|
||||
R_API int r_sys_chdir(const char *s) {
|
||||
return chdir (s)==0;
|
||||
}
|
||||
|
||||
#if __UNIX__
|
||||
@ -288,9 +288,9 @@ R_API char *r_sys_cmd_str_full(const char *cmd, const char *input, int *len, cha
|
||||
close (sh_out[0]);
|
||||
close (sh_err[0]);
|
||||
close (sh_in[1]);
|
||||
waitpid(pid, &status, 0);
|
||||
waitpid (pid, &status, 0);
|
||||
if (status != 0) {
|
||||
eprintf("%s: command returned !0\n", __func__);
|
||||
eprintf ("%s: command returned !0\n", __func__);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user