ZIP_FILE_GET_EXTERNAL_ATTRIBUTES(3)

πŸ“¦
version 1.11.4 Β· 3 versions
, in arch rolling, debian trixie, fedora 43, fedora 44, nixpkgs unstable, ubuntu questing, ubuntu resolute, ubuntu stonking

πŸ’– zip_file_get_external_attributes β€” get external attributes for file in zip πŸ’–

okay bestie, welcome to the Library Functions Manual corner of the internet πŸŽ€ this one lives in the libzip section, and it's about snooping on the external attributes of a file inside a zip. yes, that's the little blob where the operating system keeps its file permissions and stuff. let's get into it πŸ’…


✨ LIBRARY ✨

libzip (-lzip)


🌸 SYNOPSIS 🌸

#include <zip.h>

int
zip_file_get_external_attributes(zip_t *archive, zip_uint64_t index,
    zip_flags_t flags, zip_uint8_t *opsys, zip_uint32_t *attributes);

πŸ¦‹ DESCRIPTION πŸ¦‹

so, zip_file_get_external_attributes() hands you back the operating system and the external attributes for the file sitting at position index inside the zip archive. and like, those external attributes? usually they're holding the operating system-specific file permissions, no cap. πŸ”₯

if you set flags to ZIP_FL_UNCHANGED, you get the original unchanged values β€” the ones before anything got messed with. and if opsys or attributes is NULL? no worries, they just don't get filled in. πŸ™ˆ

the following operating systems are defined by the zip specification:

  • ZIP_OPSYS_ACORN_RISC
  • ZIP_OPSYS_ALTERNATE_MVS
  • ZIP_OPSYS_AMIGA
  • ZIP_OPSYS_ATARI_ST
  • ZIP_OPSYS_BEOS
  • ZIP_OPSYS_CPM
  • ZIP_OPSYS_DOS
  • ZIP_OPSYS_MACINTOSH
  • ZIP_OPSYS_MVS
  • ZIP_OPSYS_OPENVMS
  • ZIP_OPSYS_OS_2
  • ZIP_OPSYS_OS_400
  • ZIP_OPSYS_OS_X
  • ZIP_OPSYS_TANDEM
  • ZIP_OPSYS_UNIX
  • ZIP_OPSYS_VFAT
  • ZIP_OPSYS_VM_CMS
  • ZIP_OPSYS_VSE
  • ZIP_OPSYS_WINDOWS_NTFS (uncommon, use ZIP_OPSYS_DOS instead)
  • ZIP_OPSYS_Z_SYSTEM

all those defines above are following the PKWARE Inc. Appnote, just so you know. ⭐ but heads up β€” the InfoZIP Appnote has a slightly different mapping. so don't @ me if they disagree, they're just built different 😭


πŸ‘‘ RETURN VALUES πŸ‘‘

  • if everything goes right, 0 comes back. slay. ✨
  • if something goes wrong, -1 comes back, and the error code in archive is set to tell you what the actual problem was. πŸ’€

πŸ’œ EXAMPLES πŸ’œ

here's the code you can use to expand attributes when the operating system is ZIP_OPSYS_DOS. it's giving very much "translate DOS land into POSIX mode bits":

#include <sys/stat.h>

#define FA_RDONLY       0x01            // FILE_ATTRIBUTE_READONLY
#define FA_DIREC        0x10            // FILE_ATTRIBUTE_DIRECTORY

static mode_t
_zip_dos_attr2mode(zip_uint32_t attr)
{
   mode_t m = S_IRUSR | S_IRGRP | S_IROTH;
   if (0 == (attr & FA_RDONLY))
      m |= S_IWUSR | S_IWGRP | S_IWOTH;

   if (attr & FA_DIREC)
      m = (S_IFDIR | (m & ~S_IFMT)) | S_IXUSR | S_IXGRP | S_IXOTH;

   return m;
}

😭 ERRORS 😭

zip_file_get_external_attributes() fails if:

  • [ZIP_ER_INVAL] β€” index is not a valid file index in archive.

🌈 SEE ALSO 🌈

libzip(3), zip_file_set_external_attributes(3)


🧚 HISTORY 🧚

zip_file_get_external_attributes() was added in libzip 0.11.2. vintage but still iconic ✨


🫢 AUTHORS 🫢

Dieter Baron <dillo@nih.at> and Thomas Klausner <wiz@gatalith.at> β€” the actual legends behind this πŸ‘‘


and that's the whole page bestie!! this one shipped with Debian, dated December 18, and the manual name is ZIP_FILE_GET_EXTERNAL_ATTRIBUTES(3). go forth and read those attributes πŸ’–πŸŽ€πŸ’