Rizin
unix-like reverse engineering framework and cli tools
io_ar.c File Reference
#include <rz_io.h>
#include <rz_lib.h>
#include <rz_util.h>
#include <rz_cons.h>
#include "ar.h"

Go to the source code of this file.

Functions

static bool rz_io_ar_plugin_open (RzIO *io, const char *file, bool many)
 
static RzListrz_io_ar_open_many (RzIO *io, const char *file, int perm, int mode)
 
static RzIODescrz_io_ar_open (RzIO *io, const char *file, int perm, int mode)
 
static ut64 rz_io_ar_lseek (RzIO *io, RzIODesc *fd, ut64 offset, int whence)
 
static int rz_io_ar_read (RzIO *io, RzIODesc *fd, ut8 *buf, int count)
 
static int rz_io_ar_write (RzIO *io, RzIODesc *fd, const ut8 *buf, int count)
 
static int rz_io_ar_close (RzIODesc *fd)
 

Variables

RzIOPlugin rz_io_plugin_ar
 
RZ_API RzLibStruct rizin_plugin
 

Function Documentation

◆ rz_io_ar_close()

static int rz_io_ar_close ( RzIODesc fd)
static

Definition at line 126 of file io_ar.c.

126  {
127  if (!fd || !fd->data) {
128  return -1;
129  }
130  ar_close((RzArFp *)fd->data);
131  fd->data = NULL;
132  return 0;
133 }
RZ_API void ar_close(RzArFp *f)
Definition: ar.c:338
#define NULL
Definition: cris-opc.c:27
Definition: ar.h:7
static const z80_opcode fd[]
Definition: z80_tab.h:997

References ar_close(), fd, and NULL.

◆ rz_io_ar_lseek()

static ut64 rz_io_ar_lseek ( RzIO io,
RzIODesc fd,
ut64  offset,
int  whence 
)
static

Definition at line 90 of file io_ar.c.

90  {
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 }
voidpf void uLong size
Definition: ioapi.h:138
voidpf uLong offset
Definition: ioapi.h:144
#define rz_return_val_if_fail(expr, val)
Definition: rz_assert.h:108
#define RZ_MIN(x, y)
ut64 start
Definition: ar.h:9
ut64 end
Definition: ar.h:10
ut64 off
Definition: rz_io.h:61
ut64(WINAPI *w32_GetEnabledXStateFeatures)()
#define SEEK_SET
Definition: zip.c:88
#define SEEK_CUR
Definition: zip.c:80
#define SEEK_END
Definition: zip.c:84

References RZARFP::end, fd, rz_io_t::off, RZ_MIN, rz_return_val_if_fail, SEEK_CUR, SEEK_END, SEEK_SET, RZARFP::start, and ut64().

◆ rz_io_ar_open()

static RzIODesc* rz_io_ar_open ( RzIO io,
const char *  file,
int  perm,
int  mode 
)
static

Definition at line 56 of file io_ar.c.

56  {
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 }
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
static bool err
Definition: armass.c:435
RZ_API void Ht_() free(HtName_(Ht) *ht)
Definition: ht_inc.c:130
RzIOPlugin rz_io_plugin_ar
Definition: io_ar.c:135
const char * filename
Definition: ioapi.h:137
const char int mode
Definition: ioapi.h: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")
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_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
Definition: gzappend.c:170
char * name
Definition: rz_io.h:99

References ar_open_file(), err, free(), rz_io_desc_t::name, NULL, rz_io_desc_new(), rz_io_plugin_ar, rz_return_val_if_fail, rz_sys_open_perms(), and strdup().

◆ rz_io_ar_open_many()

static RzList* rz_io_ar_open_many ( RzIO io,
const char *  file,
int  perm,
int  mode 
)
static

Definition at line 13 of file io_ar.c.

13  {
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 }
RZ_API RzList * ar_open_all(const char *arname, int perm)
Open specific file withen a ar/lib file.
Definition: ar.c:218
const char * desc
Definition: bin_vsf.c:19
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
#define RZ_LOG_ERROR(fmtstr,...)
Definition: rz_log.h:58
RZ_API char * rz_str_newf(const char *fmt,...) RZ_PRINTF_CHECK(1
char * name
Definition: ar.h:8
void * data
Definition: rz_list.h:14

References test_group_name::all, ar_open_all(), rz_list_iter_t::data, desc, free(), RZARFP::name, NULL, rz_io_desc_new(), rz_io_plugin_ar, rz_list_append(), rz_list_free(), rz_list_new(), RZ_LOG_ERROR, rz_str_newf(), rz_sys_open_perms(), and strdup().

◆ rz_io_ar_plugin_open()

static bool rz_io_ar_plugin_open ( RzIO io,
const char *  file,
bool  many 
)
static

Definition at line 9 of file io_ar.c.

9  {
10  return !strncmp("ar://", file, 5) || !strncmp("lib://", file, 6);
11 }

◆ rz_io_ar_read()

static int rz_io_ar_read ( RzIO io,
RzIODesc fd,
ut8 buf,
int  count 
)
static

Definition at line 112 of file io_ar.c.

112  {
113  if (!fd || !fd->data || !buf) {
114  return -1;
115  }
116  return ar_read_at((RzArFp *)fd->data, io->off, buf, count);
117 }
RZ_API int ar_read_at(RzArFp *f, ut64 off, void *buf, int count)
Definition: ar.c:349
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
voidpf void * buf
Definition: ioapi.h:138

References ar_read_at(), count, fd, and rz_io_t::off.

◆ rz_io_ar_write()

static int rz_io_ar_write ( RzIO io,
RzIODesc fd,
const ut8 buf,
int  count 
)
static

Definition at line 119 of file io_ar.c.

119  {
120  if (!fd || !fd->data || !buf) {
121  return -1;
122  }
123  return ar_write_at((RzArFp *)fd->data, io->off, (void *)buf, count);
124 }
RZ_API int ar_write_at(RzArFp *f, ut64 off, void *buf, int count)
Definition: ar.c:360

References ar_write_at(), count, fd, and rz_io_t::off.

Variable Documentation

◆ rizin_plugin

RZ_API RzLibStruct rizin_plugin
Initial value:
= {
.type = RZ_LIB_TYPE_IO,
.data = &rz_io_plugin_ar,
}
@ RZ_LIB_TYPE_IO
Definition: rz_lib.h:69
#define RZ_VERSION
Definition: rz_version.h:8
const char * version
Definition: rz_io.h:117

Definition at line 151 of file io_ar.c.

◆ rz_io_plugin_ar

RzIOPlugin rz_io_plugin_ar
Initial value:
= {
.name = "ar",
.desc = "Open ar/lib files",
.license = "LGPL3",
.author = "xarkes",
.uris = "ar://,lib://",
.open = rz_io_ar_open,
.open_many = rz_io_ar_open_many,
.write = rz_io_ar_write,
.read = rz_io_ar_read,
.close = rz_io_ar_close,
.lseek = rz_io_ar_lseek,
}
static int rz_io_ar_read(RzIO *io, RzIODesc *fd, ut8 *buf, int count)
Definition: io_ar.c:112
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

Definition at line 135 of file io_ar.c.

Referenced by rz_io_ar_open(), and rz_io_ar_open_many().