Part of Netatalk's AppleDouble implementatation. More...
#include <fcntl.h>#include <inttypes.h>#include <sys/mman.h>#include <sys/stat.h>#include <sys/time.h>#include <sys/types.h>#include <unistd.h>Go to the source code of this file.
Data Structures | |
| struct | ad_entry |
| struct | adf_lock_t |
| struct | ad_fd |
| struct | adouble_fops |
| struct | adouble |
Typedefs | |
| typedef uint32_t | cnid_t |
| typedef struct adf_lock_t | adf_lock_t |
Functions | |
| int | ad_rebuild_adouble_header_v2 (struct adouble *) |
| int | ad_rebuild_adouble_header_ea (struct adouble *) |
| int | ad_rebuild_adouble_header_osx (struct adouble *ad, char *adbuf) |
| int | ad_copy_header (struct adouble *, struct adouble *) |
| int | ad_flush (struct adouble *) |
| int | ad_close (struct adouble *, int) |
| int | fsetrsrcea (struct adouble *ad, int fd, const char *eaname, const void *value, size_t size, int flags) |
| int | ad_testlock (struct adouble *adp, int eid, off_t off) |
| Test for a share mode lock. | |
| uint16_t | ad_openforks (struct adouble *adp, uint16_t) |
| Return if a file is open by another process. | |
| int | ad_lock (struct adouble *, uint32_t eid, int type, off_t off, off_t len, int fork) |
| void | ad_unlock (struct adouble *, int fork, int unlckbrl) |
| int | ad_tmplock (struct adouble *, uint32_t eid, int type, off_t off, off_t len, int fork) |
| void * | ad_entry (const struct adouble *ad, int eid) |
| off_t | ad_getentryoff (const struct adouble *ad, int eid) |
| const char * | adflags2logstr (int adflags) |
| int | ad_setfuid (const uid_t) |
| uid_t | ad_getfuid (void) |
| char * | ad_dir (const char *) |
| Support inherited protection modes for AppleDouble files. The supplied mode is ANDed with the parent directory's mask value in lieu of "umask", and that value is returned. | |
| const char * | ad_path (const char *, int) |
| Put the .AppleDouble where it needs to be: | |
| const char * | ad_path_ea (const char *, int) |
| const char * | ad_path_osx (const char *path, int adflags) |
| int | ad_mode (const char *, mode_t) |
| int | ad_mkdir (const char *, mode_t) |
| void | ad_init (struct adouble *, const struct vol *) |
| void | ad_init_old (struct adouble *ad, int flags, int options) |
| int | ad_init_offsets (struct adouble *ad) |
| int | ad_open (struct adouble *ad, const char *path, int adflags,...) |
| Open data-, metadata(header)- or resource fork. | |
| int | ad_openat (struct adouble *, int dirfd, const char *path, int adflags,...) |
| int | ad_refresh (const char *path, struct adouble *) |
| int | ad_stat (const char *, struct stat *) |
| int | ad_metadata (const char *, int, struct adouble *) |
| open metadata, possibly as root | |
| int | ad_metadataat (int, const char *, int, struct adouble *) |
| mode_t | ad_hf_mode (mode_t mode) |
| int | ad_valid_header_osx (const char *path) |
| off_t | ad_reso_size (const char *path, int adflags, struct adouble *ad) |
| int | ad_convert (const char *path, const struct stat *sp, const struct vol *vol, const char **newpath) |
| AppleDouble and encoding conversion on the fly. | |
| int | sys_ftruncate (int fd, off_t length) |
| ssize_t | ad_read (struct adouble *, uint32_t, off_t, char *, size_t) |
| ssize_t | ad_pread (struct ad_fd *, void *, size_t, off_t) |
| ssize_t | ad_write (struct adouble *, uint32_t, off_t, int, const char *, size_t) |
| ssize_t | adf_pread (struct ad_fd *, void *, size_t, off_t) |
| ssize_t | adf_pwrite (struct ad_fd *, const void *, size_t, off_t) |
| int | ad_dtruncate (struct adouble *, off_t) |
| int | ad_rtruncate (struct adouble *, const char *, off_t) |
| int | copy_fork (int eid, struct adouble *add, struct adouble *ads, uint8_t *buf, size_t buflen) |
| off_t | ad_size (const struct adouble *, uint32_t) |
| int | ad_setdate (struct adouble *, unsigned int, uint32_t) |
| int | ad_getdate (const struct adouble *, unsigned int, uint32_t *) |
| int | ad_setattr (const struct adouble *, const uint16_t) |
| int | ad_getattr (const struct adouble *, uint16_t *) |
| int | ad_setname (struct adouble *, const char *) |
| int | ad_setid (struct adouble *, dev_t dev, ino_t ino, uint32_t, uint32_t, const void *) |
| save file/folder ID in AppleDoubleV2 netatalk private parameters | |
| uint32_t | ad_getid (struct adouble *, dev_t, ino_t, cnid_t, const void *) |
| Retrieve stored file / folder. | |
| uint32_t | ad_forcegetid (struct adouble *adp) |
| int | ad_readfile_init (const struct adouble *ad, int eid, off_t *off, int end) |
| ssize_t | ad_recvfile (struct adouble *ad, int eid, int sock, off_t off, size_t len, int) |
Part of Netatalk's AppleDouble implementatation.
| #define AD_AFPFILEI_BLANKACCESS (1 << 2) |
blank access permissions
| #define AD_AFPFILEI_GROUP (1 << 1) |
ignore group
| #define AD_AFPFILEI_OWNER (1 << 0) |
any owner
| #define AD_APPLEDOUBLE_MAGIC 0x00051607 |
| #define AD_APPLESINGLE_MAGIC 0x00051600 |
| #define AD_CLOSED 0xadc10ced |
| #define ad_data_fileno | ( | ad | ) |
| #define AD_DATA_OPEN | ( | ad | ) |
| #define AD_DATASZ AD_DATASZ2 |
| #define AD_DATASZ2 |
| #define AD_DATASZ_EA |
| #define AD_DATASZ_MAX 1024 |
| #define AD_DATASZ_OSX (AD_HEADER_LEN + (ADEID_NUM_OSX * AD_ENTRY_LEN) + ADEDLEN_FINDERI) |
| #define AD_DATE_ACCESS 12 |
| #define AD_DATE_BACKUP 8 |
| #define AD_DATE_CREATE 0 |
| #define AD_DATE_DELTA 946684800 |
| #define AD_DATE_FROM_UNIX | ( | x | ) |
| #define AD_DATE_MASK |
| #define AD_DATE_MODIFY 4 |
| #define AD_DATE_START htonl(0x80000000) |
| #define AD_DATE_TO_UNIX | ( | x | ) |
| #define AD_DATE_UNIX (1 << 10) |
| #define AD_DEV 0x80444556 |
| #define AD_ENTRY_LEN 12 |
size of a single entry header
| #define AD_FILELOCK_BASE (UINT32_C(0x7FFFFFFF) - 9) |
| #define AD_FILELOCK_DENY_RD (AD_FILELOCK_BASE + 5) |
| #define AD_FILELOCK_DENY_WR (AD_FILELOCK_BASE + 4) |
| #define AD_FILELOCK_OPEN_NONE (AD_FILELOCK_BASE + 8) |
| #define AD_FILELOCK_OPEN_RD (AD_FILELOCK_BASE + 1) |
| #define AD_FILELOCK_OPEN_WR (AD_FILELOCK_BASE + 0) |
| #define AD_FILELOCK_RSRC_DENY_RD (AD_FILELOCK_BASE + 7) |
| #define AD_FILELOCK_RSRC_DENY_WR (AD_FILELOCK_BASE + 6) |
| #define AD_FILELOCK_RSRC_OPEN_NONE (AD_FILELOCK_BASE + 9) |
| #define AD_FILELOCK_RSRC_OPEN_RD (AD_FILELOCK_BASE + 3) |
| #define AD_FILELOCK_RSRC_OPEN_WR (AD_FILELOCK_BASE + 2) |
| #define AD_FILLER_NETATALK "Netatalk " |
| #define AD_FILLER_OSX "Mac OS X" |
| #define ad_get_MD_flags | ( | ad | ) |
| #define ad_get_RF_flags | ( | ad | ) |
| #define ad_get_syml_opt | ( | ad | ) |
| #define ad_getentrylen | ( | ad, | |
| eid ) |
| #define ad_getversion | ( | ad | ) |
| #define AD_HEADER_LEN (ADEDLEN_MAGIC + ADEDLEN_VERSION + ADEDLEN_FILLER + ADEDLEN_NENTRIES) |
26
| #define AD_ID 0x8053567E |
| #define AD_INITED 0xad494e54 |
ad"INT"
| #define AD_INO 0x80494E4F |
| #define AD_MAGIC AD_APPLEDOUBLE_MAGIC |
| #define ad_meta_fileno | ( | ad | ) |
| #define AD_META_OPEN | ( | ad | ) |
| #define ad_ref | ( | ad | ) |
| #define ad_reso_fileno | ( | ad | ) |
| #define AD_RSRC_OPEN | ( | ad | ) |
| #define ad_setentrylen | ( | ad, | |
| eid, | |||
| len ) |
| #define ad_setentryoff | ( | ad, | |
| eid, | |||
| off ) |
| #define AD_SYMLINK -2 |
special fd value used to indicate an open fork file is a (not open) symlink
| #define AD_SYN 0x8053594E |
| #define ad_unref | ( | ad | ) |
| #define AD_VERSION AD_VERSION_EA |
| #define AD_VERSION2 0x00020000 |
| #define AD_VERSION_EA 0x00020002 |
| #define ADEDLEN_AFPFILEI 4 |
| #define ADEDLEN_COMMENT 200 |
| #define ADEDLEN_DID 4 |
| #define ADEDLEN_FILEDATESI 16 |
| #define ADEDLEN_FILEI 16 |
| #define ADEDLEN_FILLER 16 |
| #define ADEDLEN_FINDERI 32 |
| #define ADEDLEN_ICONBW 128 |
| #define ADEDLEN_ICONCOL 1024 |
| #define ADEDLEN_MACFILEI 4 |
| #define ADEDLEN_MAGIC 4 |
| #define ADEDLEN_MSDOSFILEI 2 |
| #define ADEDLEN_NAME 255 |
| #define ADEDLEN_NENTRIES 2 |
| #define ADEDLEN_PRIVDEV 8 |
| #define ADEDLEN_PRIVID 4 |
| #define ADEDLEN_PRIVINO 8 |
| #define ADEDLEN_PRIVSYN 8 |
| #define ADEDLEN_PRODOSFILEI 8 |
| #define ADEDLEN_SHORTNAME 12 |
length up to 8.3
| #define ADEDLEN_VERSION 4 |
| #define ADEDOFF_FINDERI_OSX (AD_HEADER_LEN + ADEID_NUM_OSX*AD_ENTRY_LEN) |
| #define ADEDOFF_RFORK_OSX (ADEDOFF_FINDERI_OSX + ADEDLEN_FINDERI) |
| #define ADEID_AFPFILEI 14 |
where the rest of the FILEI info goes
| #define ADEID_COMMENT 4 |
| #define ADEID_DFORK 1 |
| #define ADEID_DID 15 |
| #define ADEID_FILEDATESI 8 |
| #define ADEID_FILEI 7 |
v1, replaced by ADEID_FILEDATESI
| #define ADEID_FINDERI 9 |
| #define ADEID_ICONBW 5 |
| #define ADEID_ICONCOL 6 |
| #define ADEID_MACFILEI 10 |
we don't use this
| #define ADEID_MAX (ADEID_PRIVID + 1) |
| #define ADEID_MSDOSFILEI 12 |
we don't use this
| #define ADEID_NAME 3 |
| #define ADEID_NUM_EA 8 |
| #define ADEID_NUM_OSX 2 |
| #define ADEID_NUM_V2 13 |
| #define ADEID_PRIVDEV 16 |
| #define ADEID_PRIVID 19 |
| #define ADEID_PRIVINO 17 |
| #define ADEID_PRIVSYN 18 |
in synch with database
| #define ADEID_PRODOSFILEI 11 |
we store prodos info here
| #define ADEID_RFORK 2 |
| #define ADEID_SHORTNAME 13 |
| #define ADFLAGS_CHECK_OF (1<<6) |
check for open forks from us and other afpd's
| #define ADFLAGS_CREATE (1<<10) |
create file, open called with O_CREAT
| #define ADFLAGS_DF (1<<0) |
| #define ADFLAGS_DIR (1<<3) |
| #define ADFLAGS_EXCL (1<<11) |
exclusive open, open called with O_EXCL
| #define ADFLAGS_HF (1<<2) |
| #define ADFLAGS_NOHF (1<<4) |
not an error if no metadata fork
| #define ADFLAGS_NORF (1<<5) |
not an error if no resource fork
| #define ADFLAGS_RDONLY (1<<9) |
open read only
| #define ADFLAGS_RDWR (1<<8) |
open read/write
| #define ADFLAGS_RF (1<<1) |
| #define ADFLAGS_SETSHRMD (1<<7) |
setting share mode must be done with excl fcnt lock, which implies that the file must be opened rw. If it can't be opened rw (eg EPERM or EROFS) it will be opened ro and the fcntl locks will be shared, that at least prevent other users who have rw access to the file from placing excl locks.
| #define ADFLAGS_TRUNC (1<<12) |
truncate, open called with O_TRUNC
| #define ADLOCK_CLR (0) |
| #define ADLOCK_FILELOCK (1<<3) |
| #define ADLOCK_RD (1<<0) |
| #define ADLOCK_UPGRADE (1<<2) |
| #define ADLOCK_WR (1<<1) |
| #define ADVOL_FOLLO_SYML (1 << 4) |
| #define ADVOL_FORCE_STICKY_XATTR (1 << 5) |
| #define ADVOL_INVDOTS (1 << 3) |
dot files (.DS_Store) are invisible)
| #define ADVOL_NODEV (1 << 0) |
| #define ADVOL_RO (1 << 1) |
| #define ADVOL_UNIXPRIV (1 << 2) |
adouble unix priv
| #define ATTRBIT_BACKUP (1<<6) |
"p", fd
| #define ATTRBIT_DOPEN (1<<3) |
data fork already open. Not stored, computed on the fly
| #define ATTRBIT_EXPFLDR (1<<1) |
Folder is a sharepoint
| #define ATTRBIT_INVISIBLE (1<<0) |
opaque from FinderInfo
| #define ATTRBIT_MOUNTED (1<<3) |
Directory is mounted by a user
| #define ATTRBIT_MULTIUSER (1<<1) |
file: opaque, dir: see below
| #define ATTRBIT_NOCOPY (1<<10) |
"o", f
| #define ATTRBIT_NODELETE (1<<8) |
"l", fd
| #define ATTRBIT_NORENAME (1<<7) |
"r", fd
| #define ATTRBIT_NOWRITE (1<<5) |
"w", f, write inhibit(v2)/read-only(v1) bit
| #define ATTRBIT_ROPEN (1<<4) |
resource fork already open. Not stored, computed on the fly
| #define ATTRBIT_SETCLR (1<<15) |
set/clear bit (d)
| #define ATTRBIT_SHARED (1<<4) |
Shared area, called IsExpFolder in spec
| #define ATTRBIT_SYSTEM (1<<2) |
"y", fd
| #define BYTELOCK_MAX (AD_FILELOCK_BASE - 1) |
| #define FINDERINFO_CLOSEDVIEW 0x100 |
| #define FINDERINFO_COLOR (0x0e) |
| #define FINDERINFO_CUSTOMICON 0x4 |
| #define FINDERINFO_FRCREATOFF 4 |
| #define FINDERINFO_FRFLAGOFF 8 |
| #define FINDERINFO_FRTYPEOFF 0 |
| #define FINDERINFO_FRVIEWOFF 14 |
| #define FINDERINFO_HASBEENINITED (1<<8) |
"i", fd
| #define FINDERINFO_HASBUNDLE (1<<13) |
"b", fd
| #define FINDERINFO_HASCUSTOMICON (1<<10) |
"c", fd
| #define FINDERINFO_HASNOINITS (1<<7) |
"n", f
| #define FINDERINFO_HIDEEXT (1<<4) |
"e", fd
| #define FINDERINFO_INVISIBLE (1<<14) |
"v", fd
| #define FINDERINFO_ISALIAS (1<<15) |
"a", fd
| #define FINDERINFO_ISHARED (1<<6) |
"m", f
| #define FINDERINFO_ISONDESK (1) |
"d", fd
| #define FINDERINFO_ISSTATIONNERY (1<<11) |
"t", f
| #define FINDERINFO_NAMELOCKED (1<<12) |
"s", fd
| typedef struct adf_lock_t adf_lock_t |
| typedef uint32_t cnid_t |
|
extern |
Close a struct adouble freeing all resources
|
extern |
AppleDouble and encoding conversion on the fly.
| [in] | path | path to file or directory |
| [in] | sp | stat(path) |
| [in] | vol | volume handle |
| [out] | newpath | if encoding changed, new name. Can be NULL. |
|
extern |
Support inherited protection modes for AppleDouble files. The supplied mode is ANDed with the parent directory's mask value in lieu of "umask", and that value is returned.
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
Retrieve stored file / folder.
|
extern |
build a resource fork mode from the data fork mode: remove X mode and extend header to RW if R or W (W if R for locking),
|
extern |
Initialize offset pointers
|
extern |
|
extern |
|
extern |
open metadata, possibly as root
Return only metadata but try very hard i.e. at first try as user, then try as root.
| name | name of file/dir |
| flags | ADFLAGS_DIR: name is a directory ADFLAGS_CHECK_OF: test if name is open by us or another afpd process |
| adp | pointer to struct adouble |
|
extern |
openat like wrapper for ad_metadata
|
extern |
Use mkdir() with mode bits taken from ad_mode().
|
extern |
return access right of path parent directory
|
extern |
Open data-, metadata(header)- or resource fork.
You must call ad_init() before ad_open, usually you'll just call it like this:
Open a files data fork, metadata fork or resource fork.
| [in,out] | ad | pointer to struct adouble |
| [in] | path | Path to file or directory |
| [in] | adflags | Flags specifying which fork to open, can be or'd (see below) |
| [in] | ... | mode used with O_CREATE |
Regular adflags:
Access mode for the forks:
Creation flags:
Special flags:
The open mode flags (rw vs ro) have to take into account all the following requirements:
we remember open fds for files because me must avoid a single close releasing fcntl locks for other fds of the same file
|
extern |
|
extern |
Return if a file is open by another process.
Optimized for the common case:
| [in,out] | ad | handle |
| [in] | attrbits | forks opened by us |
|
extern |
Put the .AppleDouble where it needs to be:
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
Prepare adbuf buffer from struct adouble for writing on disk
|
extern |
Prepare ad->ad_data buffer from struct adouble for writing on disk
|
extern |
read from a socket and write to an adouble file
|
extern |
|
extern |
Get resofork length for adouble:ea, parameter 'ad' may be NULL
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
save file/folder ID in AppleDoubleV2 netatalk private parameters
|
extern |
set resource fork filename attribute.
|
extern |
|
extern |
stat path parent directory
|
extern |
Test for a share mode lock.
| [in,out] | ad | handle |
| [in] | eid | datafork or resource fork |
| [in] | off | sharemode lock to test |
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
copy only the fork data stream
|
extern |
|
extern |