1 1.1.1.2 skrll /* $NetBSD: get_path.c,v 1.1.1.3 2019/12/22 12:34:07 skrll Exp $ */ 2 1.1.1.2 skrll 3 1.1.1.3 skrll // SPDX-License-Identifier: LGPL-2.1-or-later 4 1.1 macallan /* 5 1.1 macallan * libfdt - Flat Device Tree manipulation 6 1.1 macallan * Testcase for fdt_get_path() 7 1.1 macallan * Copyright (C) 2006 David Gibson, IBM Corporation. 8 1.1 macallan */ 9 1.1 macallan #include <stdlib.h> 10 1.1 macallan #include <stdio.h> 11 1.1 macallan #include <string.h> 12 1.1 macallan #include <stdint.h> 13 1.1 macallan 14 1.1 macallan #include <libfdt.h> 15 1.1 macallan 16 1.1 macallan #include "tests.h" 17 1.1 macallan #include "testdata.h" 18 1.1 macallan 19 1.1 macallan #define POISON ('\xff') 20 1.1 macallan 21 1.1 macallan static void check_path_buf(void *fdt, const char *path, int pathlen, int buflen) 22 1.1 macallan { 23 1.1 macallan int offset; 24 1.1 macallan char buf[buflen+1]; 25 1.1 macallan int len; 26 1.1 macallan 27 1.1 macallan offset = fdt_path_offset(fdt, path); 28 1.1 macallan if (offset < 0) 29 1.1 macallan FAIL("Couldn't find path \"%s\": %s", path, fdt_strerror(offset)); 30 1.1 macallan 31 1.1 macallan memset(buf, POISON, sizeof(buf)); /* poison the buffer */ 32 1.1 macallan 33 1.1 macallan len = fdt_get_path(fdt, offset, buf, buflen); 34 1.1.1.3 skrll verbose_printf("get_path() %s -> %d -> %s\n", path, offset, 35 1.1.1.3 skrll len >= 0 ? buf : "<error>"); 36 1.1 macallan 37 1.1 macallan if (buflen <= pathlen) { 38 1.1 macallan if (len != -FDT_ERR_NOSPACE) 39 1.1 macallan FAIL("fdt_get_path([%d bytes]) returns %d with " 40 1.1 macallan "insufficient buffer space", buflen, len); 41 1.1 macallan } else { 42 1.1 macallan if (len < 0) 43 1.1 macallan FAIL("fdt_get_path([%d bytes]): %s", buflen, 44 1.1 macallan fdt_strerror(len)); 45 1.1 macallan if (len != 0) 46 1.1 macallan FAIL("fdt_get_path([%d bytes]) returns %d " 47 1.1 macallan "instead of 0", buflen, len); 48 1.1 macallan if (strcmp(buf, path) != 0) 49 1.1 macallan FAIL("fdt_get_path([%d bytes]) returns \"%s\" " 50 1.1 macallan "instead of \"%s\"", buflen, buf, path); 51 1.1 macallan } 52 1.1 macallan 53 1.1 macallan if (buf[buflen] != POISON) 54 1.1 macallan FAIL("fdt_get_path([%d bytes]) overran buffer", buflen); 55 1.1 macallan } 56 1.1 macallan 57 1.1 macallan static void check_path(void *fdt, const char *path) 58 1.1 macallan { 59 1.1 macallan int pathlen = strlen(path); 60 1.1 macallan 61 1.1 macallan check_path_buf(fdt, path, pathlen, 1024); 62 1.1 macallan check_path_buf(fdt, path, pathlen, pathlen+1); 63 1.1 macallan check_path_buf(fdt, path, pathlen, pathlen); 64 1.1 macallan check_path_buf(fdt, path, pathlen, 0); 65 1.1 macallan check_path_buf(fdt, path, pathlen, 2); 66 1.1 macallan } 67 1.1 macallan 68 1.1 macallan int main(int argc, char *argv[]) 69 1.1 macallan { 70 1.1 macallan void *fdt; 71 1.1 macallan 72 1.1 macallan test_init(argc, argv); 73 1.1 macallan fdt = load_blob_arg(argc, argv); 74 1.1 macallan 75 1.1 macallan check_path(fdt, "/"); 76 1.1 macallan check_path(fdt, "/subnode@1"); 77 1.1 macallan check_path(fdt, "/subnode@2"); 78 1.1 macallan check_path(fdt, "/subnode@1/subsubnode"); 79 1.1 macallan check_path(fdt, "/subnode@2/subsubnode@0"); 80 1.1 macallan 81 1.1 macallan PASS(); 82 1.1 macallan } 83