Skip to content

Commit f20be1a

Browse files
committed
Rename to libstone in root
1 parent b550cd3 commit f20be1a

File tree

15 files changed

+613
-84
lines changed

15 files changed

+613
-84
lines changed

Cargo.lock

+196-57
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
members = [
33
"boulder",
44
"moss",
5+
"libstone",
56
"crates/*",
67
]
78
default-members = [
@@ -58,6 +59,7 @@ zstd = { version = "0.13.2", features = ["zstdmt"] }
5859
mailparse = "0.15.0"
5960
zbus = "4.4.0"
6061
libc = "0.2.62"
62+
cbindgen = "0.26"
6163

6264
[profile.release]
6365
lto = "thin"

justfile

+10-6
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,14 @@ diesel db +ARGS:
8585
--database-url sqlite://{{root-dir}}/moss/src/db/{{db}}/test.db \
8686
{{ARGS}}
8787

88-
test-ffi:
88+
# Run libstone example
89+
libstone example="read" *ARGS="./test/bash-completion-2.11-1-1-x86_64.stone":
8990
#!/bin/bash
90-
cargo cbuild -p stone-ffi
91-
gcc -o stone-ffi-test ./crates/stone-ffi/test.c -L./target/x86_64-unknown-linux-gnu/debug/ -lstone -I./target/x86_64-unknown-linux-gnu/debug/
92-
ln -sf $(pwd)/target/x86_64-unknown-linux-gnu/debug/libstone.so ./target/x86_64-unknown-linux-gnu/debug/libstone.so.0.24
93-
LD_LIBRARY_PATH=$(pwd)/target/x86_64-unknown-linux-gnu/debug/ valgrind --track-origins=yes ./stone-ffi-test
94-
rm stone-ffi-test
91+
output=$(mktemp)
92+
cargo build -p libstone --release
93+
clang libstone/examples/{{example}}.c -o $output -I./libstone/src/ -lstone -L./target/release/ -Wl,-rpath,./target/release/
94+
if [ "$USE_VALGRIND" == "1" ];
95+
then time valgrind --track-origins=yes $output {{ARGS}};
96+
else time $output {{ARGS}};
97+
fi
98+
rm "$output"
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,31 @@
11
[package]
2-
name = "stone-ffi"
2+
name = "libstone"
33
version.workspace = true
44
edition.workspace = true
55
rust-version.workspace = true
66

7+
[lib]
8+
name = "stone"
9+
crate-type = ["cdylib", "staticlib"]
10+
711
[features]
812
capi = []
913

1014
[dependencies]
11-
stone = { path = "../stone", features = ["ffi"] }
15+
stone = { path = "../crates/stone", features = ["ffi"] }
1216

1317
libc.workspace = true
1418

19+
[build-dependencies]
20+
cbindgen.workspace = true
21+
1522
[package.metadata.capi.header]
1623
name = "stone"
24+
subdirectory = "libstone"
1725

1826
[package.metadata.capi.pkg_config]
19-
name = "stone"
27+
name = "libstone"
28+
filename = "libstone"
2029

2130
[package.metadata.capi.library]
2231
name = "stone"

libstone/build.rs

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
use std::path::Path;
2+
3+
fn main() {
4+
let root = Path::new(env!("CARGO_MANIFEST_DIR"));
5+
6+
let bindings = cbindgen::generate(env!("CARGO_MANIFEST_DIR")).unwrap();
7+
8+
bindings.write_to_file(root.join("src/stone.h"));
9+
}
File renamed without changes.

crates/stone-ffi/test.c renamed to libstone/examples/read.c

+27-14
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,14 @@ void print_payload_attribute_record(StonePayloadAttributeRecord *record) {
170170
printf("}\n");
171171
}
172172

173+
void print_inspect_output(StonePayloadMetaRecord *metas, int num_metas,
174+
StonePayloadLayoutRecord *layouts, int num_layotus) {
175+
176+
for (int i = 0; i < num_metas; i++) {
177+
StonePayloadMetaRecord *meta = &metas[i];
178+
}
179+
}
180+
173181
void process_records(StonePayload *payload, StonePayloadHeader *payload_header,
174182
void **records, int *num_records, int record_size,
175183
int (*next_record)(StonePayload *, void *),
@@ -251,21 +259,22 @@ void process_reader(StoneReader *reader, StoneHeaderVersion version) {
251259
break;
252260
}
253261
case STONE_PAYLOAD_KIND_CONTENT: {
254-
void *data = malloc(payload_header.plain_size);
255-
256-
if (data == NULL) {
257-
exit(1);
258-
}
262+
FILE *fptr;
263+
fptr = fopen("/dev/null", "w+");
259264

260-
stone_reader_unpack_content_payload(reader, payload, data);
265+
stone_reader_unpack_content_payload_to_file(reader, payload, fileno(fptr));
261266

262-
free(data);
267+
fclose(fptr);
263268
}
264269
}
265270

266271
current_payload += 1;
267272
}
268273

274+
if (num_metas + num_layouts > 0) {
275+
print_inspect_output(metas, num_metas, layouts, num_layouts);
276+
}
277+
269278
if (layouts != NULL) {
270279
free(layouts);
271280
}
@@ -290,20 +299,24 @@ int main(int argc, char *argv[]) {
290299
FILE *fptr;
291300
StoneReader *reader;
292301
StoneHeaderVersion version;
293-
char *file = "./test/bash-completion-2.11-1-1-x86_64.stone";
294302

295-
printf("Reading stone from '%s'\n\n", file);
296-
fptr = fopen(file, "r");
297-
stone_reader_read_file(fileno(fptr), &reader, &version);
303+
if (argc != 2) {
304+
printf("usage: %s <stone>\n", argv[0]);
305+
exit(1);
306+
}
307+
308+
printf("Reading stone header from buffer\n\n");
309+
stone_reader_read_buf(HEADER_BUF, sizeof(HEADER_BUF), &reader, &version);
298310
process_reader(reader, version);
299311
stone_reader_destroy(reader);
300-
fclose(fptr);
301312

302313
printf("\n");
303-
printf("Reading stone header from buffer\n\n");
304-
stone_reader_read_buf(HEADER_BUF, sizeof(HEADER_BUF), &reader, &version);
314+
printf("Reading stone from '%s'\n\n", argv[1]);
315+
fptr = fopen(argv[1], "r");
316+
stone_reader_read_file(fileno(fptr), &reader, &version);
305317
process_reader(reader, version);
306318
stone_reader_destroy(reader);
319+
fclose(fptr);
307320

308321
return 0;
309322
}

crates/stone-ffi/src/lib.rs renamed to libstone/src/lib.rs

+22-1
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,28 @@ pub unsafe extern "C" fn stone_reader_next_payload(
160160
}
161161

162162
#[no_mangle]
163-
pub unsafe extern "C" fn stone_reader_unpack_content_payload(
163+
pub unsafe extern "C" fn stone_reader_unpack_content_payload_to_file(
164+
reader: *mut StoneReader,
165+
payload: *const StonePayload,
166+
file: c_int,
167+
) -> c_int {
168+
fallible(|| {
169+
let mut reader = NonNull::new(reader).ok_or("")?;
170+
let payload = NonNull::new(payload as *mut StonePayload).ok_or("")?;
171+
let mut file = File::from_raw_fd(file);
172+
173+
if let StoneDecodedPayload::Content(content) = &payload.as_ref().decoded {
174+
reader.as_mut().unpack_content(content, &mut file)?;
175+
} else {
176+
Err("incorrect payload kind")?;
177+
}
178+
179+
Ok(())
180+
})
181+
}
182+
183+
#[no_mangle]
184+
pub unsafe extern "C" fn stone_reader_unpack_content_payload_to_buf(
164185
reader: *mut StoneReader,
165186
payload: *const StonePayload,
166187
data: *mut u8,
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)