summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Fietkau2025-07-22 08:44:15 +0000
committerFelix Fietkau2025-07-22 08:44:15 +0000
commitc00eb9b685a837c38bbcc979286bd44f4ffb8ec9 (patch)
tree093cee3125a24ec1ec733699d8d186d1244b4bf0
parenta95364b41d52bb6ae087c55788dda0e9efa3ba6d (diff)
downloadudebug-c00eb9b685a837c38bbcc979286bd44f4ffb8ec9.tar.gz
ucode: use FILE handle for pcap output
Signed-off-by: Felix Fietkau <nbd@nbd.name>
-rw-r--r--lib-ucode.c47
1 files changed, 11 insertions, 36 deletions
diff --git a/lib-ucode.c b/lib-ucode.c
index f905645..92a7dbb 100644
--- a/lib-ucode.c
+++ b/lib-ucode.c
@@ -13,7 +13,6 @@ static uc_vm_t *_vm;
struct uc_pcap {
struct pcap_context pcap;
- int fd;
FILE *f;
};
@@ -274,47 +273,23 @@ uc_udebug_pcap_init(struct uc_pcap *p, uc_value_t *args)
pcap_init(&p->pcap, &meta);
}
-static void
-write_retry(int fd, const void *data, size_t len)
-{
- do {
- ssize_t cur;
-
- cur = write(fd, data, len);
- if (cur < 0) {
- if (errno == EINTR)
- continue;
-
- return;
- }
-
- data += cur;
- len -= cur;
- } while (len > 0);
-}
-
-static void
-uc_udebug_pcap_write_block(struct uc_pcap *p)
-{
- size_t len;
- void *data;
-
- data = pcap_block_get(&len);
- write_retry(p->fd, data, len);
-}
-
static uc_value_t *
uc_debug_pcap_init(int fd, uc_value_t *args)
{
struct uc_pcap *p;
+ FILE *f;
if (fd < 0)
return NULL;
+ f = fdopen(fd, "w");
+ if (!f)
+ return NULL;
+
p = calloc(1, sizeof(*p));
- p->fd = fd;
+ p->f = f;
uc_udebug_pcap_init(p, args);
- uc_udebug_pcap_write_block(p);
+ pcap_block_write_file(p->f);
return uc_resource_new(pcap_type, p);
}
@@ -399,13 +374,13 @@ uc_udebug_pcap_write(uc_vm_t *vm, size_t nargs)
if (pcap_interface_rbuf_init(&p->pcap, rb))
continue;
- uc_udebug_pcap_write_block(p);
+ pcap_block_write_file(p->f);
}
if (pcap_snapshot_packet_init(&u, &it))
continue;
- uc_udebug_pcap_write_block(p);
+ pcap_block_write_file(p->f);
}
return NULL;
@@ -419,8 +394,8 @@ uc_udebug_pcap_free(void *ptr)
if (!p)
return;
- if (p->fd >= 0)
- close(p->fd);
+ if (p->f)
+ fclose(p->f);
free(p);
}