Rizin
unix-like reverse engineering framework and cli tools
rz_api.c
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: 2013-2020 pancake
2 // SPDX-License-Identifier: LGPL-3.0-only
3 
4 #if __UNIX__
5 #include <unistd.h>
6 #elif __WINDOWS__
7 #include <rz_windows.h>
8 #endif
9 #include "spp.h"
10 #include "rz_api.h"
11 
12 SStrBuf *rz_strbuf_new(const char *str) {
13  SStrBuf *s = RZ_NEW0 (SStrBuf);
14  if (str) rz_strbuf_set (s, str);
15  return s;
16 }
17 
19  memset (sb, 0, sizeof (SStrBuf));
20 }
21 
22 bool rz_strbuf_set(SStrBuf *sb, const char *s) {
23  int l;
24  if (!sb) return false;
25  if (!s) {
27  return true;
28  }
29  l = strlen (s);
30  if (l >= sizeof (sb->buf)) {
31  char *ptr = sb->ptr;
32  if (!ptr || l+1 > sb->ptrlen) {
33  ptr = malloc (l + 1);
34  if (!ptr) return false;
35  sb->ptrlen = l + 1;
36  sb->ptr = ptr;
37  }
38  memcpy (ptr, s, l+1);
39  } else {
40  sb->ptr = NULL;
41  memcpy (sb->buf, s, l+1);
42  }
43  sb->len = l;
44  return true;
45 }
46 
47 bool rz_strbuf_append(SStrBuf *sb, const char *s) {
48  int l = strlen (s);
49  if (l < 1) {
50  return false;
51  }
52  if ((sb->len + l + 1) < sizeof (sb->buf)) {
53  memcpy (sb->buf + sb->len, s, l + 1);
54  RZ_FREE (sb->ptr);
55  } else {
56  int newlen = sb->len + l + 128;
57  char *p = sb->ptr;
58  bool allocated = true;
59  if (!sb->ptr) {
60  p = malloc (newlen);
61  if (p && sb->len > 0) {
62  memcpy (p, sb->buf, sb->len);
63  }
64  } else if (sb->len + l + 1 > sb->ptrlen) {
65  p = realloc (sb->ptr, newlen);
66  } else {
67  allocated = false;
68  }
69  if (allocated) {
70  if (!p) return false;
71  sb->ptr = p;
72  sb->ptrlen = newlen;
73  }
74  memcpy (p + sb->len, s, l + 1);
75  }
76  sb->len += l;
77  return true;
78 }
79 
81  return sb? (sb->ptr? sb->ptr: sb->buf) : NULL;
82 }
83 
85  char *res = sb->ptr? sb->ptr: strdup (sb->buf);
86  sb->ptr = NULL;
88  free (sb);
89  return res;
90 }
91 
94  free (sb);
95 }
96 
98  if (sb && sb->ptr)
99  RZ_FREE (sb->ptr);
100 }
101 
102 /* --------- */
103 int rz_sys_setenv(const char *key, const char *value) {
104  if (!key) {
105  return 0;
106  }
107 #if __UNIX__
108  if (!value) {
109  unsetenv (key);
110  return 0;
111  }
112  return setenv (key, value, 1);
113 #elif __WINDOWS__
114  int ret = SetEnvironmentVariableA (key, value);
115  return ret ? 0 : -1;
116 #else
117 #warning rz_sys_setenv : unimplemented for this platform
118  return 0;
119 #endif
120 }
121 
122 char *rz_sys_getenv(const char *key) {
123 #if __WINDOWS__
124  DWORD dwRet;
125  char *envbuf = NULL, *tmp_ptr;
126  char *val = NULL;
127  const int TMP_BUFSIZE = 4096;
128  if (!key) {
129  return NULL;
130  }
131  envbuf = malloc (sizeof (envbuf) * TMP_BUFSIZE);
132  if (!envbuf) {
133  goto err_r_sys_get_env;
134  }
135  dwRet = GetEnvironmentVariableA (key, envbuf, TMP_BUFSIZE);
136  if (dwRet == 0) {
137  if (GetLastError () == ERROR_ENVVAR_NOT_FOUND) {
138  goto err_r_sys_get_env;
139  }
140  } else if (TMP_BUFSIZE < dwRet) {
141  tmp_ptr = realloc (envbuf, dwRet);
142  if (!tmp_ptr) {
143  goto err_r_sys_get_env;
144  }
145  envbuf = tmp_ptr;
146  dwRet = GetEnvironmentVariableA (key, envbuf, dwRet);
147  if (!dwRet) {
148  goto err_r_sys_get_env;
149  }
150  }
151  val = strdup (envbuf);
152 err_r_sys_get_env:
153  free (envbuf);
154  return val;
155 #else
156  char *b;
157  if (!key) {
158  return NULL;
159  }
160  b = getenv (key);
161  return b? strdup (b): NULL;
162 #endif
163 }
164 
166 #if __UNIX__
167  return getpid();
168 #elif __WINDOWS__
169  return GetCurrentProcessId();
170 #else
171 #warning rz_sys_getpid not implemented for this platform
172  return -1;
173 #endif
174 }
ut16 val
Definition: armass64_const.h:6
static SblHeader sb
Definition: bin_mbn.c:26
static int value
Definition: cmd_api.c:93
#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 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
RZ_API void Ht_() free(HtName_(Ht) *ht)
Definition: ht_inc.c:130
return memset(p, 0, total)
void * p
Definition: libc.cpp:67
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
void * realloc(void *ptr, size_t size)
Definition: malloc.c:144
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 RzSocket * s
Definition: rtr.c:28
void rz_strbuf_fini(SStrBuf *sb)
Definition: rz_api.c:97
int rz_sys_getpid()
Definition: rz_api.c:165
void rz_strbuf_free(SStrBuf *sb)
Definition: rz_api.c:92
void rz_strbuf_init(SStrBuf *sb)
Definition: rz_api.c:18
bool rz_strbuf_set(SStrBuf *sb, const char *s)
Definition: rz_api.c:22
SStrBuf * rz_strbuf_new(const char *str)
Definition: rz_api.c:12
int rz_sys_setenv(const char *key, const char *value)
Set an environment variable in the calling process.
Definition: rz_api.c:103
bool rz_strbuf_append(SStrBuf *sb, const char *s)
Definition: rz_api.c:47
char * rz_sys_getenv(const char *key)
Get the value of an environment variable named key or NULL if none exists.
Definition: rz_api.c:122
char * rz_strbuf_drain(SStrBuf *sb)
Definition: rz_api.c:84
char * rz_strbuf_get(SStrBuf *sb)
Definition: rz_api.c:80
#define RZ_NEW0(x)
Definition: rz_types.h:284
#define RZ_FREE(x)
Definition: rz_types.h:369
#define b(i)
Definition: sha256.c:42
Definition: spp.h:84
char * getenv()
DWORD