From b9309fc8069d1a4ecb0c35397026036d44c38e61 Mon Sep 17 00:00:00 2001 From: raf Date: Wed, 17 Jul 2024 12:47:04 +1000 Subject: [PATCH] Add tests for fgetattrlist() and fsetattrlist() --- manual_tests/darwin_c.c | 1 + test/test_fgetattrlist.c | 68 ++++++++++++++++++++++++++++ test/test_fsetattrlist.c | 95 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 164 insertions(+) create mode 100644 test/test_fgetattrlist.c create mode 100644 test/test_fsetattrlist.c diff --git a/manual_tests/darwin_c.c b/manual_tests/darwin_c.c index bcc04ef..70aca67 100644 --- a/manual_tests/darwin_c.c +++ b/manual_tests/darwin_c.c @@ -212,6 +212,7 @@ int timespec_get = 0; #ifdef _SC_PHYS_PAGES #error _SC_PHYS_PAGES is unexpectedly defined #endif +int fgetattrlist = 0; int fsetattrlist = 0; #endif /* __DARWIN_C_LEVEL < __DARWIN_C_FULL */ diff --git a/test/test_fgetattrlist.c b/test/test_fgetattrlist.c new file mode 100644 index 0000000..63816c2 --- /dev/null +++ b/test/test_fgetattrlist.c @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2024 raf + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* Based on the first example in the getattrlist(2) manual entry */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef struct attrlist attrlist_t; + +struct FInfoAttrBuf { + u_int32_t length; + fsobj_type_t objType; + char finderInfo[32]; +} __attribute__((aligned(4), packed)); +typedef struct FInfoAttrBuf FInfoAttrBuf; + +static int FInfoDemo(int fd) +{ + int err; + attrlist_t attrList; + FInfoAttrBuf attrBuf; + + memset(&attrList, 0, sizeof(attrList)); + attrList.bitmapcount = ATTR_BIT_MAP_COUNT; + attrList.commonattr = ATTR_CMN_OBJTYPE | ATTR_CMN_FNDRINFO; + + err = fgetattrlist(fd, &attrList, &attrBuf, sizeof(attrBuf), 0); + if (err != 0) + err = errno; + + if (err == 0) + assert(attrBuf.length == sizeof(attrBuf)); + + return err; +} + +/* Note: Not an exhaustive test. Just call fgetattrlist(). */ + +int main(int ac, char **av) +{ + int rc = (FInfoDemo(open(".", O_RDONLY)) == 0) ? EXIT_SUCCESS : EXIT_FAILURE; + if (rc != EXIT_SUCCESS) + printf("fgetattrlist() failed, possibly correctly due to an unexpected filesystem type\n"); + return rc; +} + +/* vi:set et ts=4 sw=4: */ diff --git a/test/test_fsetattrlist.c b/test/test_fsetattrlist.c new file mode 100644 index 0000000..741f6c9 --- /dev/null +++ b/test/test_fsetattrlist.c @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2024 raf + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* Based on the first example in the getattrlist(2) manual entry */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef struct attrlist attrlist_t; + +struct FInfoAttrBuf +{ + u_int32_t length; + fsobj_type_t objType; + char finderInfo[32]; +}; +typedef struct FInfoAttrBuf FInfoAttrBuf; + +static int FInfoDemo(int fd, const char *type, const char *creator) +{ + int err; + attrlist_t attrList; + FInfoAttrBuf attrBuf; + + assert(strlen(type) == 4); + assert(strlen(creator) == 4); + + memset(&attrList, 0, sizeof(attrList)); + attrList.bitmapcount = ATTR_BIT_MAP_COUNT; + attrList.commonattr = ATTR_CMN_OBJTYPE | ATTR_CMN_FNDRINFO; + + err = fgetattrlist(fd, &attrList, &attrBuf, sizeof(attrBuf), 0); + if (err != 0) + { + err = errno; + } + + if ((err == 0) && (attrBuf.objType != VREG)) + { + fprintf(stderr, "Not a standard file."); + err = EINVAL; + } + else + { + memcpy(&attrBuf.finderInfo[0], type, 4); + memcpy(&attrBuf.finderInfo[4], creator, 4); + + attrList.commonattr = ATTR_CMN_FNDRINFO; + err = fsetattrlist( + fd, + &attrList, + attrBuf.finderInfo, + sizeof(attrBuf.finderInfo), + 0 + ); + } + + return err; +} + +/* Note: Not an exhaustive test. Just call fsetattrlist(). */ + +int main(int ac, char **av) +{ + const char *fname = "./.jnk.tmp"; + int fd = open(fname, O_CREAT | O_RDWR, S_IRWXU); + int rc = (FInfoDemo(fd, "TYPE", "CRTR") == 0) ? EXIT_SUCCESS : EXIT_FAILURE; + unlink(fname); + if (rc != EXIT_SUCCESS) + printf("fgetattrlist() failed, possibly correctly due to an unexpected filesystem type\n"); + return rc; +} + +/* vi:set et ts=4 sw=4: */