Rizin
unix-like reverse engineering framework and cli tools
disk.c File Reference
#include <rz_types.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <rz_util/rz_file.h>
#include <rz_util/rz_sys.h>
#include <rz_util/rz_utf8.h>
#include <rz_windows.h>
#include "sdb.h"

Go to the source code of this file.

Macros

#define IFRET(x)
 

Functions

RZ_API bool sdb_disk_create (Sdb *s)
 
RZ_API bool sdb_disk_insert (Sdb *s, const char *key, const char *val)
 
RZ_API bool sdb_disk_finish (Sdb *s)
 
RZ_API bool sdb_disk_unlink (Sdb *s)
 

Macro Definition Documentation

◆ IFRET

#define IFRET (   x)
Value:
if (x) \
ret = 0
int x
Definition: mipsasm.c:20

Definition at line 76 of file disk.c.

Function Documentation

◆ sdb_disk_create()

RZ_API bool sdb_disk_create ( Sdb s)

Definition at line 17 of file disk.c.

17  {
18  int nlen;
19  char *str;
20  const char *dir;
21  if (!s || s->fdump >= 0) {
22  return false; // cannot re-create
23  }
24  if (!s->dir && s->name) {
25  s->dir = strdup(s->name);
26  }
27  dir = s->dir ? s->dir : "./";
28  RZ_FREE(s->ndump);
29  nlen = strlen(dir);
30  str = malloc(nlen + 5);
31  if (!str) {
32  return false;
33  }
34  memcpy(str, dir, nlen + 1);
35  char *dirname = rz_file_dirname(str);
36  if (!dirname) {
37  free(str);
38  return false;
39  }
40  rz_sys_mkdirp(dirname);
41  free(dirname);
42  memcpy(str + nlen, ".tmp", 5);
43  if (s->fdump != -1) {
44  close(s->fdump);
45  }
46 #if __WINDOWS__
47  wchar_t *wstr = rz_utf8_to_utf16(str);
48  if (wstr) {
49  s->fdump = _wopen(wstr, O_BINARY | O_RDWR | O_CREAT | O_TRUNC, SDB_MODE);
50  free(wstr);
51  } else {
52  s->fdump = -1;
53  }
54 #else
55  s->fdump = open(str, O_BINARY | O_RDWR | O_CREAT | O_TRUNC, SDB_MODE);
56 #endif
57  if (s->fdump == -1) {
58  eprintf("sdb: Cannot open '%s' for writing.\n", str);
59  free(str);
60  return false;
61  }
62  cdb_make_start(&s->m, s->fdump);
63  s->ndump = str;
64  return true;
65 }
int cdb_make_start(struct cdb_make *c, int fd)
Definition: cdb_make.c:37
#define O_BINARY
Definition: cpipe.c:13
static static fork const void static count close
Definition: sflib.h:33
RZ_API void Ht_() free(HtName_(Ht) *ht)
Definition: ht_inc.c:130
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
void * malloc(size_t size)
Definition: malloc.c:123
return strdup("=SP r13\n" "=LR r14\n" "=PC r15\n" "=A0 r0\n" "=A1 r1\n" "=A2 r2\n" "=A3 r3\n" "=ZF zf\n" "=SF nf\n" "=OF vf\n" "=CF cf\n" "=SN or0\n" "gpr lr .32 56 0\n" "gpr pc .32 60 0\n" "gpr cpsr .32 64 0 ____tfiae_________________qvczn\n" "gpr or0 .32 68 0\n" "gpr tf .1 64.5 0 thumb\n" "gpr ef .1 64.9 0 endian\n" "gpr jf .1 64.24 0 java\n" "gpr qf .1 64.27 0 sticky_overflow\n" "gpr vf .1 64.28 0 overflow\n" "gpr cf .1 64.29 0 carry\n" "gpr zf .1 64.30 0 zero\n" "gpr nf .1 64.31 0 negative\n" "gpr itc .4 64.10 0 if_then_count\n" "gpr gef .4 64.16 0 great_or_equal\n" "gpr r0 .32 0 0\n" "gpr r1 .32 4 0\n" "gpr r2 .32 8 0\n" "gpr r3 .32 12 0\n" "gpr r4 .32 16 0\n" "gpr r5 .32 20 0\n" "gpr r6 .32 24 0\n" "gpr r7 .32 28 0\n" "gpr r8 .32 32 0\n" "gpr r9 .32 36 0\n" "gpr r10 .32 40 0\n" "gpr r11 .32 44 0\n" "gpr r12 .32 48 0\n" "gpr r13 .32 52 0\n" "gpr r14 .32 56 0\n" "gpr r15 .32 60 0\n" "gpr r16 .32 64 0\n" "gpr r17 .32 68 0\n")
#define eprintf(x, y...)
Definition: rlcc.c:7
static RzSocket * s
Definition: rtr.c:28
RZ_API char * rz_file_dirname(const char *path)
Definition: file.c:120
RZ_API bool rz_sys_mkdirp(const char *dir)
Definition: sys.c:691
#define RZ_FREE(x)
Definition: rz_types.h:369
#define SDB_MODE
Definition: sdb.h:42
#define O_CREAT
Definition: sftypes.h:489
#define O_RDWR
Definition: sftypes.h:488
#define O_TRUNC
Definition: sftypes.h:492

References cdb_make_start(), close, eprintf, free(), malloc(), memcpy(), O_BINARY, O_CREAT, O_RDWR, O_TRUNC, rz_file_dirname(), RZ_FREE, rz_sys_mkdirp(), s, SDB_MODE, cmd_descs_generate::str, and strdup().

Referenced by sdb_sync().

◆ sdb_disk_finish()

RZ_API bool sdb_disk_finish ( Sdb s)

Definition at line 79 of file disk.c.

79  {
80  bool reopen = false, ret = true;
81  IFRET(!cdb_make_finish(&s->m));
82 #if HAVE_HEADER_SYS_MMAN_H
83  IFRET(fsync(s->fdump));
84 #endif
85  IFRET(close(s->fdump));
86  s->fdump = -1;
87  // close current fd to avoid sharing violations
88  if (s->fd != -1) {
89  close(s->fd);
90  s->fd = -1;
91  reopen = true;
92  }
93 #if __WINDOWS__
94  wchar_t *ndump_ = rz_utf8_to_utf16(s->ndump);
95  wchar_t *dir_ = rz_utf8_to_utf16(s->dir);
96 
97  if (!MoveFileExW(ndump_, dir_, MOVEFILE_REPLACE_EXISTING)) {
98  rz_sys_perror("MoveFileExW SDB file to finale location");
99  }
100  free(ndump_);
101  free(dir_);
102 #else
103  if (s->ndump && s->dir) {
104  IFRET(rename(s->ndump, s->dir));
105  }
106 #endif
107  free(s->ndump);
108  s->ndump = NULL;
109  // reopen if was open before
110  reopen = true; // always reopen if possible
111  if (reopen) {
112  int rr = sdb_open(s, s->dir);
113  if (ret && rr < 0) {
114  ret = false;
115  }
116  cdb_init(&s->db, s->fd);
117  }
118  return ret;
119 }
bool cdb_init(struct cdb *c, int fd)
Definition: cdb.c:51
int cdb_make_finish(struct cdb_make *c)
Definition: cdb_make.c:124
#define NULL
Definition: cris-opc.c:27
static static sync static getppid static getegid const char static filename char static len const char char static bufsiz static mask static vfork const void static prot static getpgrp const char static swapflags static arg fsync
Definition: sflib.h:79
#define IFRET(x)
Definition: disk.c:76
static static fork const void static count static fd const char static mode const char static pathname const char static path const char static dev const char static group static getpid static getuid void void static data static pause const char static mode static sync rename
Definition: sflib.h:69
#define rz_sys_perror(x)
Definition: rz_types.h:336
RZ_API int sdb_open(Sdb *s, const char *file)
Definition: sdb.c:383

References cdb_init(), cdb_make_finish(), close, rz_socket_t::fd, free(), fsync, IFRET, NULL, rename, rz_sys_perror, s, and sdb_open().

Referenced by sdb_sync().

◆ sdb_disk_insert()

RZ_API bool sdb_disk_insert ( Sdb s,
const char *  key,
const char *  val 
)

Definition at line 67 of file disk.c.

67  {
68  struct cdb_make *c = &s->m;
69  if (!key || !val) {
70  return false;
71  }
72  // if (!*val) return 0; //undefine variable if no value
73  return cdb_make_add(c, key, strlen(key), val, strlen(val));
74 }
ut16 val
Definition: armass64_const.h:6
int cdb_make_add(struct cdb_make *c, const char *key, ut32 keylen, const char *data, ut32 datalen)
Definition: cdb_make.c:108
static static sync static getppid static getegid const char static filename char static len const char char static bufsiz static mask static vfork const void static prot static getpgrp const char static swapflags static arg static fd static protocol static who struct sockaddr static addrlen static backlog struct timeval struct timezone static tz const struct iovec static count static mode const void const struct sockaddr static tolen const char static pathname void static offset struct stat static buf void long static basep static whence static length const void static len key
Definition: sflib.h:118
#define c(i)
Definition: sha256.c:43

References c, cdb_make_add(), key, s, and val.

Referenced by _insert_into_disk(), insertkeys(), and sdb_sync().

◆ sdb_disk_unlink()

RZ_API bool sdb_disk_unlink ( Sdb s)

Definition at line 121 of file disk.c.

121  {
122  return (s->dir && *(s->dir) && unlink(s->dir) != -1);
123 }
static static fork const void static count static fd const char static mode unlink
Definition: sflib.h:41

References s, and unlink.

Referenced by sdb_unlink().