1 /* $NetBSD: move_and_save.c,v 1.4 2019/12/22 12:38:24 skrll Exp $ */
2
3 // SPDX-License-Identifier: LGPL-2.1-or-later
4 /*
5 * libfdt - Flat Device Tree manipulation
6 * Basic testcase for read-only access
7 * Copyright (C) 2006 David Gibson, IBM Corporation.
8 */
9
10 #include <stdlib.h>
11 #include <stdio.h>
12 #include <string.h>
13 #include <limits.h>
14 #include <stdint.h>
15
16 #include <libfdt.h>
17
18 #include "tests.h"
19 #include "testdata.h"
20
main(int argc,char * argv[])21 int main(int argc, char *argv[])
22 {
23 void *fdt, *fdt1, *fdt2, *fdt3;
24 char *buf;
25 int shuntsize;
26 int bufsize;
27 int err;
28 const char *inname;
29 char outname[PATH_MAX];
30
31 test_init(argc, argv);
32 fdt = load_blob_arg(argc, argv);
33 inname = argv[1];
34
35 shuntsize = FDTALIGN2(fdt_totalsize(fdt) / 2, sizeof(uint64_t));
36 bufsize = fdt_totalsize(fdt) + shuntsize;
37 buf = xmalloc(bufsize);
38
39 fdt1 = buf;
40 err = fdt_move(fdt, fdt1, bufsize);
41 if (err)
42 FAIL("Failed to move tree into new buffer: %s",
43 fdt_strerror(err));
44 sprintf(outname, "moved.%s", inname);
45 save_blob(outname, fdt1);
46
47 fdt2 = buf + shuntsize;
48 err = fdt_move(fdt1, fdt2, bufsize-shuntsize);
49 if (err)
50 FAIL("Failed to shunt tree %d bytes: %s",
51 shuntsize, fdt_strerror(err));
52 sprintf(outname, "shunted.%s", inname);
53 save_blob(outname, fdt2);
54
55 fdt3 = buf;
56 err = fdt_move(fdt2, fdt3, bufsize);
57 if (err)
58 FAIL("Failed to deshunt tree %d bytes: %s",
59 shuntsize, fdt_strerror(err));
60 sprintf(outname, "deshunted.%s", inname);
61 save_blob(outname, fdt3);
62
63 PASS();
64 }
65