Rizin
unix-like reverse engineering framework and cli tools
io_ar.c
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: 2017 xarkes <antide.petit@gmail.com>
2 // SPDX-License-Identifier: LGPL-3.0-only
3 #include <rz_io.h>
4 #include <rz_lib.h>
5 #include <rz_util.h>
6 #include <rz_cons.h>
7 #include "ar.h"
8 
9 static bool rz_io_ar_plugin_open(RzIO *io, const char *file, bool many) {
10  return !strncmp("ar://", file, 5) || !strncmp("lib://", file, 6);
11 }
12 
13 static RzList *rz_io_ar_open_many(RzIO *io, const char *file, int perm, int mode) {
14  const char *arname = strstr(file, "://");
15  if (!arname) {
16  return NULL;
17  }
18  arname += 3;
19 
20  RzList *all = ar_open_all(arname, rz_sys_open_perms(perm));
21  if (!all) {
22  RZ_LOG_ERROR("ar: cannot open all .o files in '%s'\n", file);
23  return NULL;
24  }
25 
26  RzList *list_fds = rz_list_new();
27  if (!list_fds) {
29  return NULL;
30  }
31 
32  RzArFp *arfp;
33  RzListIter *it;
34 
35  rz_list_foreach (all, it, arfp) {
36  char *uri_name = rz_str_newf("%s//%s", file, arfp->name);
37  RzIODesc *desc = rz_io_desc_new(io, &rz_io_plugin_ar, uri_name, perm, mode, arfp);
38  free(uri_name);
39  if (!desc) {
41  rz_list_free(list_fds);
42  return NULL;
43  }
44  desc->name = strdup(arfp->name);
45  if (!rz_list_append(list_fds, desc)) {
47  rz_list_free(list_fds);
48  return NULL;
49  }
50  it->data = NULL;
51  }
53  return list_fds;
54 }
55 
56 static RzIODesc *rz_io_ar_open(RzIO *io, const char *file, int perm, int mode) {
58  RzIODesc *res = NULL;
59  char *uri = strdup(file);
60  if (!uri) {
61  return NULL;
62  }
63  const char *arname = strstr(uri, "://");
64  if (!arname) {
65  goto err;
66  }
67  arname += 3;
68 
69  char *filename = strstr(arname, "//");
70  if (!filename) {
71  goto err;
72  }
73  *filename = 0;
74  filename += 2;
75 
76  RzArFp *arf = ar_open_file(arname, rz_sys_open_perms(perm), filename);
77  if (!arf) {
78  goto err;
79  }
80  res = rz_io_desc_new(io, &rz_io_plugin_ar, filename, perm, mode, arf);
81  if (!res) {
82  goto err;
83  }
84  res->name = strdup(filename);
85 err:
86  free(uri);
87  return res;
88 }
89 
90 static ut64 rz_io_ar_lseek(RzIO *io, RzIODesc *fd, ut64 offset, int whence) {
91  rz_return_val_if_fail(io && fd && fd->data, -1);
92 
93  RzArFp *arf = (RzArFp *)fd->data;
94  ut64 size = arf->end - arf->start;
95  switch (whence) {
96  case SEEK_SET:
97  io->off = RZ_MIN(size, offset);
98  break;
99  case SEEK_CUR:
100  io->off = RZ_MIN(size, io->off + offset);
101  break;
102  case SEEK_END:
103  io->off = size;
104  break;
105  default:
106  return -1;
107  }
108 
109  return io->off;
110 }
111 
112 static int rz_io_ar_read(RzIO *io, RzIODesc *fd, ut8 *buf, int count) {
113  if (!fd || !fd->data || !buf) {
114  return -1;
115  }
116  return ar_read_at((RzArFp *)fd->data, io->off, buf, count);
117 }
118 
119 static int rz_io_ar_write(RzIO *io, RzIODesc *fd, const ut8 *buf, int count) {
120  if (!fd || !fd->data || !buf) {
121  return -1;
122  }
123  return ar_write_at((RzArFp *)fd->data, io->off, (void *)buf, count);
124 }
125 
126 static int rz_io_ar_close(RzIODesc *fd) {
127  if (!fd || !fd->data) {
128  return -1;
129  }
130  ar_close((RzArFp *)fd->data);
131  fd->data = NULL;
132  return 0;
133 }
134 
136  .name = "ar",
137  .desc = "Open ar/lib files",
138  .license = "LGPL3",
139  .author = "xarkes",
140  .uris = "ar://,lib://",
141  .open = rz_io_ar_open,
142  .open_many = rz_io_ar_open_many,
143  .write = rz_io_ar_write,
144  .read = rz_io_ar_read,
145  .close = rz_io_ar_close,
146  .lseek = rz_io_ar_lseek,
147  .check = rz_io_ar_plugin_open
148 };
149 
150 #ifndef RZ_PLUGIN_INCORE
152  .type = RZ_LIB_TYPE_IO,
153  .data = &rz_io_plugin_ar,
155 };
156 #endif
RZ_API RzList * ar_open_all(const char *arname, int perm)
Open specific file withen a ar/lib file.
Definition: ar.c:218
RZ_API int ar_write_at(RzArFp *f, ut64 off, void *buf, int count)
Definition: ar.c:360
RZ_API int ar_read_at(RzArFp *f, ut64 off, void *buf, int count)
Definition: ar.c:349
RZ_API RzArFp * ar_open_file(const char *arname, int perm, const char *filename)
Open specific file withen a ar/lib file.
Definition: ar.c:286
RZ_API void ar_close(RzArFp *f)
Definition: ar.c:338
static bool err
Definition: armass.c:435
const char * desc
Definition: bin_vsf.c:19
#define RZ_API
#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 count
Definition: sflib.h:98
RZ_API void Ht_() free(HtName_(Ht) *ht)
Definition: ht_inc.c:130
static int rz_io_ar_read(RzIO *io, RzIODesc *fd, ut8 *buf, int count)
Definition: io_ar.c:112
RZ_API RzLibStruct rizin_plugin
Definition: io_ar.c:151
static int rz_io_ar_write(RzIO *io, RzIODesc *fd, const ut8 *buf, int count)
Definition: io_ar.c:119
static bool rz_io_ar_plugin_open(RzIO *io, const char *file, bool many)
Definition: io_ar.c:9
static RzList * rz_io_ar_open_many(RzIO *io, const char *file, int perm, int mode)
Definition: io_ar.c:13
static RzIODesc * rz_io_ar_open(RzIO *io, const char *file, int perm, int mode)
Definition: io_ar.c:56
static ut64 rz_io_ar_lseek(RzIO *io, RzIODesc *fd, ut64 offset, int whence)
Definition: io_ar.c:90
static int rz_io_ar_close(RzIODesc *fd)
Definition: io_ar.c:126
RzIOPlugin rz_io_plugin_ar
Definition: io_ar.c:135
voidpf void uLong size
Definition: ioapi.h:138
const char * filename
Definition: ioapi.h:137
voidpf uLong offset
Definition: ioapi.h:144
const char int mode
Definition: ioapi.h:137
voidpf void * buf
Definition: ioapi.h:138
uint8_t ut8
Definition: lh5801.h:11
RZ_API RZ_OWN RzList * rz_list_new(void)
Returns a new initialized RzList pointer (free method is not initialized)
Definition: list.c:235
RZ_API RZ_BORROW RzListIter * rz_list_append(RZ_NONNULL RzList *list, void *data)
Appends at the end of the list a new element.
Definition: list.c:288
RZ_API void rz_list_free(RZ_NONNULL RzList *list)
Empties the list and frees the list pointer.
Definition: list.c:137
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 rz_return_val_if_fail(expr, val)
Definition: rz_assert.h:108
RZ_API RzIODesc * rz_io_desc_new(RzIO *io, RzIOPlugin *plugin, const char *uri, int flags, int mode, void *data)
Definition: io_desc.c:11
@ RZ_LIB_TYPE_IO
Definition: rz_lib.h:69
#define RZ_LOG_ERROR(fmtstr,...)
Definition: rz_log.h:58
RZ_API char * rz_str_newf(const char *fmt,...) RZ_PRINTF_CHECK(1
RZ_API int rz_sys_open_perms(int rizin_perms)
Convert rizin permissions (RZ_PERM_*) to posix permissions that can be passed to rz_sys_open .
Definition: sys.c:1718
#define RZ_MIN(x, y)
#define RZ_VERSION
Definition: rz_version.h:8
Definition: ar.h:7
ut64 start
Definition: ar.h:9
char * name
Definition: ar.h:8
ut64 end
Definition: ar.h:10
Definition: gzappend.c:170
char * name
Definition: rz_io.h:99
const char * name
Definition: rz_io.h:115
const char * version
Definition: rz_io.h:117
Definition: rz_io.h:59
ut64 off
Definition: rz_io.h:61
void * data
Definition: rz_list.h:14
ut64(WINAPI *w32_GetEnabledXStateFeatures)()
static const z80_opcode fd[]
Definition: z80_tab.h:997
#define SEEK_SET
Definition: zip.c:88
#define SEEK_CUR
Definition: zip.c:80
#define SEEK_END
Definition: zip.c:84