Rizin
unix-like reverse engineering framework and cli tools
disk.c
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: 2013-2018 pancake <pancake@nopcode.org>
2 // SPDX-License-Identifier: MIT
3 
4 #include <rz_types.h>
5 #include <stdio.h>
6 #include <fcntl.h>
7 #include <errno.h>
8 #include <string.h>
9 #include <stdlib.h>
10 #include <sys/stat.h>
11 #include <rz_util/rz_file.h>
12 #include <rz_util/rz_sys.h>
13 #include <rz_util/rz_utf8.h>
14 #include <rz_windows.h>
15 #include "sdb.h"
16 
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 }
66 
67 RZ_API bool sdb_disk_insert(Sdb *s, const char *key, const char *val) {
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 }
75 
76 #define IFRET(x) \
77  if (x) \
78  ret = 0
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 }
120 
122  return (s->dir && *(s->dir) && unlink(s->dir) != -1);
123 }
ut16 val
Definition: armass64_const.h:6
bool cdb_init(struct cdb *c, int fd)
Definition: cdb.c:51
int cdb_make_start(struct cdb_make *c, int fd)
Definition: cdb_make.c:37
int cdb_make_finish(struct cdb_make *c)
Definition: cdb_make.c:124
int cdb_make_add(struct cdb_make *c, const char *key, ut32 keylen, const char *data, ut32 datalen)
Definition: cdb_make.c:108
#define O_BINARY
Definition: cpipe.c:13
#define RZ_API
#define NULL
Definition: cris-opc.c:27
static static fork const void static count close
Definition: sflib.h:33
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
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
RZ_API bool sdb_disk_insert(Sdb *s, const char *key, const char *val)
Definition: disk.c:67
RZ_API bool sdb_disk_unlink(Sdb *s)
Definition: disk.c:121
#define IFRET(x)
Definition: disk.c:76
RZ_API bool sdb_disk_finish(Sdb *s)
Definition: disk.c:79
RZ_API bool sdb_disk_create(Sdb *s)
Definition: disk.c:17
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")
static static fork const void static count static fd const char static mode unlink
Definition: sflib.h:41
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 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_sys_perror(x)
Definition: rz_types.h:336
#define RZ_FREE(x)
Definition: rz_types.h:369
RZ_API int sdb_open(Sdb *s, const char *file)
Definition: sdb.c:383
#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
#define c(i)
Definition: sha256.c:43
Definition: sdb.h:63