diff --git a/manual_tests/darwin_c.c b/manual_tests/darwin_c.c index bcc04ef270b41bc07a222f0e62b9d91c9fe968d8..70aca67cd3bd91dc5b2e93ca5e0528ed73e5b0cf 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 0000000000000000000000000000000000000000..63816c2eddfcbe35da510e70521fff78933f7e25 --- /dev/null +++ b/test/test_fgetattrlist.c @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2024 raf <raf@raf.org> + * + * 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 <assert.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/attr.h> +#include <sys/errno.h> +#include <sys/vnode.h> + +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 0000000000000000000000000000000000000000..741f6c905c594445cf33c486bfc041ba660fa89f --- /dev/null +++ b/test/test_fsetattrlist.c @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2024 raf <raf@raf.org> + * + * 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 <assert.h> +#include <stdlib.h> +#include <stdio.h> +#include <stddef.h> +#include <string.h> +#include <fcntl.h> +#include <sys/attr.h> +#include <sys/errno.h> +#include <unistd.h> +#include <sys/vnode.h> + +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: */