netatalk  4.4.0dev
Free and Open Source Apple Filing Protocol (AFP) Server
Loading...
Searching...
No Matches
adouble.h File Reference

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

Macros

#define AD_VERSION2   0x00020000
#define AD_VERSION_EA   0x00020002
#define AD_VERSION   AD_VERSION_EA
#define ADEID_DFORK   1
#define ADEID_RFORK   2
#define ADEID_NAME   3
#define ADEID_COMMENT   4
#define ADEID_ICONBW   5
#define ADEID_ICONCOL   6
#define ADEID_FILEI   7 /* v1, replaced by: */
#define ADEID_FILEDATESI   8 /* this */
#define ADEID_FINDERI   9
#define ADEID_MACFILEI   10 /* we don't use this */
#define ADEID_PRODOSFILEI   11 /* we store prodos info here */
#define ADEID_MSDOSFILEI   12 /* we don't use this */
#define ADEID_SHORTNAME   13
#define ADEID_AFPFILEI   14 /* where the rest of the FILEI info goes */
#define ADEID_DID   15
#define ADEID_PRIVDEV   16
#define ADEID_PRIVINO   17
#define ADEID_PRIVSYN   18 /* in synch with database */
#define ADEID_PRIVID   19
#define ADEID_MAX   (ADEID_PRIVID + 1)
#define AD_DEV   0x80444556
#define AD_INO   0x80494E4F
#define AD_SYN   0x8053594E
#define AD_ID   0x8053567E
#define AD_APPLESINGLE_MAGIC   0x00051600
#define AD_APPLEDOUBLE_MAGIC   0x00051607
#define AD_MAGIC   AD_APPLEDOUBLE_MAGIC
#define ADEDLEN_MAGIC   4
#define ADEDLEN_VERSION   4
#define ADEDLEN_FILLER   16
#define ADEDLEN_NENTRIES   2
#define AD_HEADER_LEN   (ADEDLEN_MAGIC + ADEDLEN_VERSION + ADEDLEN_FILLER + ADEDLEN_NENTRIES) /* 26 */
#define AD_ENTRY_LEN   12 /* size of a single entry header */
#define ADEDLEN_NAME   255
#define ADEDLEN_COMMENT   200
#define ADEDLEN_FILEI   16
#define ADEDLEN_FINDERI   32
#define ADEDLEN_FILEDATESI   16
#define ADEDLEN_SHORTNAME   12 /* length up to 8.3 */
#define ADEDLEN_AFPFILEI   4
#define ADEDLEN_MACFILEI   4
#define ADEDLEN_PRODOSFILEI   8
#define ADEDLEN_MSDOSFILEI   2
#define ADEDLEN_ICONBW   128
#define ADEDLEN_ICONCOL   1024
#define ADEDLEN_DID   4
#define ADEDLEN_PRIVDEV   8
#define ADEDLEN_PRIVINO   8
#define ADEDLEN_PRIVSYN   8
#define ADEDLEN_PRIVID   4
#define ADEID_NUM_V2   13
#define ADEID_NUM_EA   8
#define ADEID_NUM_OSX   2
#define AD_DATASZ2
#define AD_DATASZ_EA
#define AD_DATASZ_OSX   (AD_HEADER_LEN + (ADEID_NUM_OSX * AD_ENTRY_LEN) + ADEDLEN_FINDERI)
#define AD_DATASZ_MAX   1024
#define AD_DATASZ   AD_DATASZ_EA
#define ADEDOFF_FINDERI_OSX   (AD_HEADER_LEN + ADEID_NUM_OSX*AD_ENTRY_LEN)
#define ADEDOFF_RFORK_OSX   (ADEDOFF_FINDERI_OSX + ADEDLEN_FINDERI)
#define AD_SYMLINK   -2
#define AD_INITED   0xad494e54 /* ad"INT" */
#define AD_CLOSED   0xadc10ced
#define ADFLAGS_DF   (1<<0)
#define ADFLAGS_RF   (1<<1)
#define ADFLAGS_HF   (1<<2)
#define ADFLAGS_DIR   (1<<3)
#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_CHECK_OF   (1<<6) /* check for open forks from us and other afpd's */
#define ADFLAGS_SETSHRMD
#define ADFLAGS_RDWR   (1<<8) /* open read/write */
#define ADFLAGS_RDONLY   (1<<9) /* open read only */
#define ADFLAGS_CREATE   (1<<10) /* create file, open called with O_CREAT */
#define ADFLAGS_EXCL   (1<<11) /* exclusive open, open called with O_EXCL */
#define ADFLAGS_TRUNC   (1<<12) /* truncate, open called with O_TRUNC */
#define ADVOL_NODEV   (1 << 0)
#define ADVOL_RO   (1 << 1)
#define ADVOL_UNIXPRIV   (1 << 2) /* adouble unix priv */
#define ADVOL_INVDOTS   (1 << 3) /* dot files (.DS_Store) are invisible) */
#define ADVOL_FOLLO_SYML   (1 << 4)
#define ADVOL_FORCE_STICKY_XATTR   (1 << 5)
#define ADLOCK_CLR   (0)
#define ADLOCK_RD   (1<<0)
#define ADLOCK_WR   (1<<1)
#define ADLOCK_MASK   (ADLOCK_RD | ADLOCK_WR)
#define ADLOCK_UPGRADE   (1<<2)
#define ADLOCK_FILELOCK   (1<<3)
#define AD_FILELOCK_BASE   (UINT32_C(0x7FFFFFFF) - 9)
#define BYTELOCK_MAX   (AD_FILELOCK_BASE - 1)
#define AD_FILELOCK_OPEN_WR   (AD_FILELOCK_BASE + 0)
#define AD_FILELOCK_OPEN_RD   (AD_FILELOCK_BASE + 1)
#define AD_FILELOCK_RSRC_OPEN_WR   (AD_FILELOCK_BASE + 2)
#define AD_FILELOCK_RSRC_OPEN_RD   (AD_FILELOCK_BASE + 3)
#define AD_FILELOCK_DENY_WR   (AD_FILELOCK_BASE + 4)
#define AD_FILELOCK_DENY_RD   (AD_FILELOCK_BASE + 5)
#define AD_FILELOCK_RSRC_DENY_WR   (AD_FILELOCK_BASE + 6)
#define AD_FILELOCK_RSRC_DENY_RD   (AD_FILELOCK_BASE + 7)
#define AD_FILELOCK_OPEN_NONE   (AD_FILELOCK_BASE + 8)
#define AD_FILELOCK_RSRC_OPEN_NONE   (AD_FILELOCK_BASE + 9)
#define AD_DATE_CREATE   0
#define AD_DATE_MODIFY   4
#define AD_DATE_BACKUP   8
#define AD_DATE_ACCESS   12
#define AD_DATE_MASK
#define AD_DATE_UNIX   (1 << 10)
#define AD_DATE_START   htonl(0x80000000)
#define AD_DATE_DELTA   946684800
#define AD_DATE_FROM_UNIX(x)
#define AD_DATE_TO_UNIX(x)
#define FINDERINFO_FRTYPEOFF   0
#define FINDERINFO_FRCREATOFF   4
#define FINDERINFO_FRFLAGOFF   8
#define FINDERINFO_ISONDESK   (1) /* "d", fd */
#define FINDERINFO_COLOR   (0x0e)
#define FINDERINFO_HIDEEXT   (1<<4) /* "e", fd */
#define FINDERINFO_ISHARED   (1<<6) /* "m", f */
#define FINDERINFO_HASNOINITS   (1<<7) /* "n", f */
#define FINDERINFO_HASBEENINITED   (1<<8) /* "i", fd */
#define FINDERINFO_HASCUSTOMICON   (1<<10) /* "c", fd */
#define FINDERINFO_ISSTATIONNERY   (1<<11) /* "t", f */
#define FINDERINFO_NAMELOCKED   (1<<12) /* "s", fd */
#define FINDERINFO_HASBUNDLE   (1<<13) /* "b", fd */
#define FINDERINFO_INVISIBLE   (1<<14) /* "v", fd */
#define FINDERINFO_ISALIAS   (1<<15) /* "a", fd */
#define FINDERINFO_FRVIEWOFF   14
#define FINDERINFO_CUSTOMICON   0x4
#define FINDERINFO_CLOSEDVIEW   0x100
#define ATTRBIT_INVISIBLE   (1<<0) /* opaque from FinderInfo */
#define ATTRBIT_MULTIUSER   (1<<1) /* file: opaque, dir: see below */
#define ATTRBIT_SYSTEM   (1<<2) /* "y", fd */
#define ATTRBIT_DOPEN   (1<<3) /* data fork already open. Not stored, computed on the fly */
#define ATTRBIT_ROPEN   (1<<4) /* resource fork already open. Not stored, computed on the fly */
#define ATTRBIT_NOWRITE   (1<<5) /* "w", f, write inhibit(v2)/read-only(v1) bit */
#define ATTRBIT_BACKUP   (1<<6) /* "p", fd */
#define ATTRBIT_NORENAME   (1<<7) /* "r", fd */
#define ATTRBIT_NODELETE   (1<<8) /* "l", fd */
#define ATTRBIT_NOCOPY   (1<<10) /* "o", f */
#define ATTRBIT_SETCLR   (1<<15) /* set/clear bit (d) */
#define ATTRBIT_EXPFLDR   (1<<1) /* Folder is a sharepoint */
#define ATTRBIT_MOUNTED   (1<<3) /* Directory is mounted by a user */
#define ATTRBIT_SHARED   (1<<4) /* Shared area, called IsExpFolder in spec */
#define AD_AFPFILEI_OWNER   (1 << 0) /* any owner */
#define AD_AFPFILEI_GROUP   (1 << 1) /* ignore group */
#define AD_AFPFILEI_BLANKACCESS   (1 << 2) /* blank access permissions */
#define AD_FILLER_NETATALK   "Netatalk "
#define AD_FILLER_OSX   "Mac OS X"
#define ad_data_fileno(ad)
#define ad_reso_fileno(ad)
#define ad_meta_fileno(ad)
#define AD_DATA_OPEN(ad)
#define AD_META_OPEN(ad)
#define AD_RSRC_OPEN(ad)
#define ad_getversion(ad)
#define ad_getentrylen(ad, eid)
#define ad_setentrylen(ad, eid, len)
#define ad_setentryoff(ad, eid, off)
#define ad_get_RF_flags(ad)
#define ad_get_MD_flags(ad)
#define ad_ref(ad)
#define ad_unref(ad)
#define ad_get_syml_opt(ad)
#define ad_munmap(buf, len)

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)
uint16_t ad_openforks (struct adouble *adp, uint16_t)
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 *)
const char * ad_path (const char *, int)
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 *restrict)
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,...)
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)
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)
void * ad_mmapread (struct adouble *, uint32_t, off_t, size_t)
void * ad_mmapwrite (struct adouble *, uint32_t, off_t, int, size_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 *)
uint32_t ad_getid (struct adouble *, dev_t, ino_t, cnid_t, const void *)
uint32_t ad_forcegetid (struct adouble *adp)

Detailed Description

Part of Netatalk's AppleDouble implementatation.

Macro Definition Documentation

◆ AD_AFPFILEI_BLANKACCESS

#define AD_AFPFILEI_BLANKACCESS   (1 << 2) /* blank access permissions */

◆ AD_AFPFILEI_GROUP

#define AD_AFPFILEI_GROUP   (1 << 1) /* ignore group */

◆ AD_AFPFILEI_OWNER

#define AD_AFPFILEI_OWNER   (1 << 0) /* any owner */

◆ AD_APPLEDOUBLE_MAGIC

#define AD_APPLEDOUBLE_MAGIC   0x00051607

◆ AD_APPLESINGLE_MAGIC

#define AD_APPLESINGLE_MAGIC   0x00051600

◆ AD_CLOSED

#define AD_CLOSED   0xadc10ced

◆ ad_data_fileno

#define ad_data_fileno ( ad)
Value:
((ad)->ad_data_fork.adf_fd)

◆ AD_DATA_OPEN

#define AD_DATA_OPEN ( ad)
Value:
(((ad)->ad_data_refcount) && (ad_data_fileno(ad) >= 0))
#define ad_data_fileno(ad)
Definition adouble.h:358

◆ AD_DATASZ

#define AD_DATASZ   AD_DATASZ_EA

◆ AD_DATASZ2

#define AD_DATASZ2
Value:
#define ADEDLEN_SHORTNAME
Definition adouble.h:102
#define ADEDLEN_PRIVDEV
Definition adouble.h:110
#define AD_ENTRY_LEN
Definition adouble.h:94
#define ADEDLEN_AFPFILEI
Definition adouble.h:103
#define ADEDLEN_COMMENT
Definition adouble.h:98
#define ADEDLEN_PRIVSYN
Definition adouble.h:112
#define ADEDLEN_PRIVID
Definition adouble.h:113
#define ADEID_NUM_V2
Definition adouble.h:115
#define AD_HEADER_LEN
Definition adouble.h:93
#define ADEDLEN_DID
Definition adouble.h:109
#define ADEDLEN_PRIVINO
Definition adouble.h:111
#define ADEDLEN_NAME
Definition adouble.h:97
#define ADEDLEN_PRODOSFILEI
Definition adouble.h:105
#define ADEDLEN_FILEI
Definition adouble.h:99
#define ADEDLEN_FINDERI
Definition adouble.h:100

◆ AD_DATASZ_EA

#define AD_DATASZ_EA
Value:
#define ADEDLEN_FILEDATESI
Definition adouble.h:101
#define ADEID_NUM_EA
Definition adouble.h:116

◆ AD_DATASZ_MAX

#define AD_DATASZ_MAX   1024

◆ AD_DATASZ_OSX

#define AD_DATASZ_OSX   (AD_HEADER_LEN + (ADEID_NUM_OSX * AD_ENTRY_LEN) + ADEDLEN_FINDERI)

◆ AD_DATE_ACCESS

#define AD_DATE_ACCESS   12

◆ AD_DATE_BACKUP

#define AD_DATE_BACKUP   8

◆ AD_DATE_CREATE

#define AD_DATE_CREATE   0

◆ AD_DATE_DELTA

#define AD_DATE_DELTA   946684800

◆ AD_DATE_FROM_UNIX

#define AD_DATE_FROM_UNIX ( x)
Value:
htonl((x) - AD_DATE_DELTA)
#define AD_DATE_DELTA
Definition adouble.h:295

◆ AD_DATE_MASK

#define AD_DATE_MASK
Value:
#define AD_DATE_CREATE
Definition adouble.h:287
#define AD_DATE_BACKUP
Definition adouble.h:289
#define AD_DATE_MODIFY
Definition adouble.h:288
#define AD_DATE_ACCESS
Definition adouble.h:290

◆ AD_DATE_MODIFY

#define AD_DATE_MODIFY   4

◆ AD_DATE_START

#define AD_DATE_START   htonl(0x80000000)

◆ AD_DATE_TO_UNIX

#define AD_DATE_TO_UNIX ( x)
Value:
(ntohl(x) + AD_DATE_DELTA)

◆ AD_DATE_UNIX

#define AD_DATE_UNIX   (1 << 10)

◆ AD_DEV

#define AD_DEV   0x80444556

◆ AD_ENTRY_LEN

#define AD_ENTRY_LEN   12 /* size of a single entry header */

◆ AD_FILELOCK_BASE

#define AD_FILELOCK_BASE   (UINT32_C(0x7FFFFFFF) - 9)

◆ AD_FILELOCK_DENY_RD

#define AD_FILELOCK_DENY_RD   (AD_FILELOCK_BASE + 5)

◆ AD_FILELOCK_DENY_WR

#define AD_FILELOCK_DENY_WR   (AD_FILELOCK_BASE + 4)

◆ AD_FILELOCK_OPEN_NONE

#define AD_FILELOCK_OPEN_NONE   (AD_FILELOCK_BASE + 8)

◆ AD_FILELOCK_OPEN_RD

#define AD_FILELOCK_OPEN_RD   (AD_FILELOCK_BASE + 1)

◆ AD_FILELOCK_OPEN_WR

#define AD_FILELOCK_OPEN_WR   (AD_FILELOCK_BASE + 0)

◆ AD_FILELOCK_RSRC_DENY_RD

#define AD_FILELOCK_RSRC_DENY_RD   (AD_FILELOCK_BASE + 7)

◆ AD_FILELOCK_RSRC_DENY_WR

#define AD_FILELOCK_RSRC_DENY_WR   (AD_FILELOCK_BASE + 6)

◆ AD_FILELOCK_RSRC_OPEN_NONE

#define AD_FILELOCK_RSRC_OPEN_NONE   (AD_FILELOCK_BASE + 9)

◆ AD_FILELOCK_RSRC_OPEN_RD

#define AD_FILELOCK_RSRC_OPEN_RD   (AD_FILELOCK_BASE + 3)

◆ AD_FILELOCK_RSRC_OPEN_WR

#define AD_FILELOCK_RSRC_OPEN_WR   (AD_FILELOCK_BASE + 2)

◆ AD_FILLER_NETATALK

#define AD_FILLER_NETATALK   "Netatalk "

◆ AD_FILLER_OSX

#define AD_FILLER_OSX   "Mac OS X"

◆ ad_get_MD_flags

#define ad_get_MD_flags ( ad)
Value:
((ad)->ad_mdp->adf_flags)

◆ ad_get_RF_flags

#define ad_get_RF_flags ( ad)
Value:
((ad)->ad_rfp->adf_flags)

◆ ad_get_syml_opt

#define ad_get_syml_opt ( ad)
Value:
(((ad)->ad_options & ADVOL_FOLLO_SYML) ? 0 : O_NOFOLLOW)
#define ADVOL_FOLLO_SYML
Definition adouble.h:251

◆ ad_getentrylen

#define ad_getentrylen ( ad,
eid )
Value:
((ad)->ad_eid[(eid)].ade_len)

◆ ad_getversion

#define ad_getversion ( ad)
Value:
((ad)->ad_version)

◆ AD_HEADER_LEN

#define AD_HEADER_LEN   (ADEDLEN_MAGIC + ADEDLEN_VERSION + ADEDLEN_FILLER + ADEDLEN_NENTRIES) /* 26 */

◆ AD_ID

#define AD_ID   0x8053567E

◆ AD_INITED

#define AD_INITED   0xad494e54 /* ad"INT" */

◆ AD_INO

#define AD_INO   0x80494E4F

◆ AD_MAGIC

#define AD_MAGIC   AD_APPLEDOUBLE_MAGIC

◆ ad_meta_fileno

#define ad_meta_fileno ( ad)
Value:
((ad)->ad_mdp->adf_fd)

◆ AD_META_OPEN

#define AD_META_OPEN ( ad)
Value:
(((ad)->ad_meta_refcount) && (ad_meta_fileno(ad) >= 0))
#define ad_meta_fileno(ad)
Definition adouble.h:360

◆ ad_munmap

#define ad_munmap ( buf,
len )
Value:
(munmap((buf), (len)))
static char buf[MAXPATHLEN+1]
Definition afppasswd.c:66

◆ ad_ref

#define ad_ref ( ad)
Value:
(ad)->ad_refcount++

◆ ad_reso_fileno

#define ad_reso_fileno ( ad)
Value:
((ad)->ad_rfp->adf_fd)

◆ AD_RSRC_OPEN

#define AD_RSRC_OPEN ( ad)
Value:
(((ad)->ad_reso_refcount) && (ad_reso_fileno(ad) >= 0))
#define ad_reso_fileno(ad)
Definition adouble.h:359

◆ ad_setentrylen

#define ad_setentrylen ( ad,
eid,
len )
Value:
((ad)->ad_eid[(eid)].ade_len = (len))

◆ ad_setentryoff

#define ad_setentryoff ( ad,
eid,
off )
Value:
((ad)->ad_eid[(eid)].ade_off = (off))

◆ AD_SYMLINK

#define AD_SYMLINK   -2

◆ AD_SYN

#define AD_SYN   0x8053594E

◆ ad_unref

#define ad_unref ( ad)
Value:
--((ad)->ad_refcount)

◆ AD_VERSION

#define AD_VERSION   AD_VERSION_EA

◆ AD_VERSION2

#define AD_VERSION2   0x00020000

◆ AD_VERSION_EA

#define AD_VERSION_EA   0x00020002

◆ ADEDLEN_AFPFILEI

#define ADEDLEN_AFPFILEI   4

◆ ADEDLEN_COMMENT

#define ADEDLEN_COMMENT   200

◆ ADEDLEN_DID

#define ADEDLEN_DID   4

◆ ADEDLEN_FILEDATESI

#define ADEDLEN_FILEDATESI   16

◆ ADEDLEN_FILEI

#define ADEDLEN_FILEI   16

◆ ADEDLEN_FILLER

#define ADEDLEN_FILLER   16

◆ ADEDLEN_FINDERI

#define ADEDLEN_FINDERI   32

◆ ADEDLEN_ICONBW

#define ADEDLEN_ICONBW   128

◆ ADEDLEN_ICONCOL

#define ADEDLEN_ICONCOL   1024

◆ ADEDLEN_MACFILEI

#define ADEDLEN_MACFILEI   4

◆ ADEDLEN_MAGIC

#define ADEDLEN_MAGIC   4

◆ ADEDLEN_MSDOSFILEI

#define ADEDLEN_MSDOSFILEI   2

◆ ADEDLEN_NAME

#define ADEDLEN_NAME   255

◆ ADEDLEN_NENTRIES

#define ADEDLEN_NENTRIES   2

◆ ADEDLEN_PRIVDEV

#define ADEDLEN_PRIVDEV   8

◆ ADEDLEN_PRIVID

#define ADEDLEN_PRIVID   4

◆ ADEDLEN_PRIVINO

#define ADEDLEN_PRIVINO   8

◆ ADEDLEN_PRIVSYN

#define ADEDLEN_PRIVSYN   8

◆ ADEDLEN_PRODOSFILEI

#define ADEDLEN_PRODOSFILEI   8

◆ ADEDLEN_SHORTNAME

#define ADEDLEN_SHORTNAME   12 /* length up to 8.3 */

◆ ADEDLEN_VERSION

#define ADEDLEN_VERSION   4

◆ ADEDOFF_FINDERI_OSX

#define ADEDOFF_FINDERI_OSX   (AD_HEADER_LEN + ADEID_NUM_OSX*AD_ENTRY_LEN)

◆ ADEDOFF_RFORK_OSX

#define ADEDOFF_RFORK_OSX   (ADEDOFF_FINDERI_OSX + ADEDLEN_FINDERI)

◆ ADEID_AFPFILEI

#define ADEID_AFPFILEI   14 /* where the rest of the FILEI info goes */

◆ ADEID_COMMENT

#define ADEID_COMMENT   4

◆ ADEID_DFORK

#define ADEID_DFORK   1

◆ ADEID_DID

#define ADEID_DID   15

◆ ADEID_FILEDATESI

#define ADEID_FILEDATESI   8 /* this */

◆ ADEID_FILEI

#define ADEID_FILEI   7 /* v1, replaced by: */

◆ ADEID_FINDERI

#define ADEID_FINDERI   9

◆ ADEID_ICONBW

#define ADEID_ICONBW   5

◆ ADEID_ICONCOL

#define ADEID_ICONCOL   6

◆ ADEID_MACFILEI

#define ADEID_MACFILEI   10 /* we don't use this */

◆ ADEID_MAX

#define ADEID_MAX   (ADEID_PRIVID + 1)

◆ ADEID_MSDOSFILEI

#define ADEID_MSDOSFILEI   12 /* we don't use this */

◆ ADEID_NAME

#define ADEID_NAME   3

◆ ADEID_NUM_EA

#define ADEID_NUM_EA   8

◆ ADEID_NUM_OSX

#define ADEID_NUM_OSX   2

◆ ADEID_NUM_V2

#define ADEID_NUM_V2   13

◆ ADEID_PRIVDEV

#define ADEID_PRIVDEV   16

◆ ADEID_PRIVID

#define ADEID_PRIVID   19

◆ ADEID_PRIVINO

#define ADEID_PRIVINO   17

◆ ADEID_PRIVSYN

#define ADEID_PRIVSYN   18 /* in synch with database */

◆ ADEID_PRODOSFILEI

#define ADEID_PRODOSFILEI   11 /* we store prodos info here */

◆ ADEID_RFORK

#define ADEID_RFORK   2

◆ ADEID_SHORTNAME

#define ADEID_SHORTNAME   13

◆ ADFLAGS_CHECK_OF

#define ADFLAGS_CHECK_OF   (1<<6) /* check for open forks from us and other afpd's */

◆ ADFLAGS_CREATE

#define ADFLAGS_CREATE   (1<<10) /* create file, open called with O_CREAT */

◆ ADFLAGS_DF

#define ADFLAGS_DF   (1<<0)

◆ ADFLAGS_DIR

#define ADFLAGS_DIR   (1<<3)

◆ ADFLAGS_EXCL

#define ADFLAGS_EXCL   (1<<11) /* exclusive open, open called with O_EXCL */

◆ ADFLAGS_HF

#define ADFLAGS_HF   (1<<2)

◆ ADFLAGS_NOHF

#define ADFLAGS_NOHF   (1<<4) /* not an error if no metadata fork */

◆ ADFLAGS_NORF

#define ADFLAGS_NORF   (1<<5) /* not an error if no resource fork */

◆ ADFLAGS_RDONLY

#define ADFLAGS_RDONLY   (1<<9) /* open read only */

◆ ADFLAGS_RDWR

#define ADFLAGS_RDWR   (1<<8) /* open read/write */

◆ ADFLAGS_RF

#define ADFLAGS_RF   (1<<1)

◆ ADFLAGS_SETSHRMD

#define ADFLAGS_SETSHRMD
Value:
(1<<7) /* setting share mode must be done with excl fcnt lock,
which implies that the file must be openend 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. */

◆ ADFLAGS_TRUNC

#define ADFLAGS_TRUNC   (1<<12) /* truncate, open called with O_TRUNC */

◆ ADLOCK_CLR

#define ADLOCK_CLR   (0)

◆ ADLOCK_FILELOCK

#define ADLOCK_FILELOCK   (1<<3)

◆ ADLOCK_MASK

#define ADLOCK_MASK   (ADLOCK_RD | ADLOCK_WR)

◆ ADLOCK_RD

#define ADLOCK_RD   (1<<0)

◆ ADLOCK_UPGRADE

#define ADLOCK_UPGRADE   (1<<2)

◆ ADLOCK_WR

#define ADLOCK_WR   (1<<1)

◆ ADVOL_FOLLO_SYML

#define ADVOL_FOLLO_SYML   (1 << 4)

◆ ADVOL_FORCE_STICKY_XATTR

#define ADVOL_FORCE_STICKY_XATTR   (1 << 5)

◆ ADVOL_INVDOTS

#define ADVOL_INVDOTS   (1 << 3) /* dot files (.DS_Store) are invisible) */

◆ ADVOL_NODEV

#define ADVOL_NODEV   (1 << 0)

◆ ADVOL_RO

#define ADVOL_RO   (1 << 1)

◆ ADVOL_UNIXPRIV

#define ADVOL_UNIXPRIV   (1 << 2) /* adouble unix priv */

◆ ATTRBIT_BACKUP

#define ATTRBIT_BACKUP   (1<<6) /* "p", fd */

◆ ATTRBIT_DOPEN

#define ATTRBIT_DOPEN   (1<<3) /* data fork already open. Not stored, computed on the fly */

◆ ATTRBIT_EXPFLDR

#define ATTRBIT_EXPFLDR   (1<<1) /* Folder is a sharepoint */

◆ ATTRBIT_INVISIBLE

#define ATTRBIT_INVISIBLE   (1<<0) /* opaque from FinderInfo */

◆ ATTRBIT_MOUNTED

#define ATTRBIT_MOUNTED   (1<<3) /* Directory is mounted by a user */

◆ ATTRBIT_MULTIUSER

#define ATTRBIT_MULTIUSER   (1<<1) /* file: opaque, dir: see below */

◆ ATTRBIT_NOCOPY

#define ATTRBIT_NOCOPY   (1<<10) /* "o", f */

◆ ATTRBIT_NODELETE

#define ATTRBIT_NODELETE   (1<<8) /* "l", fd */

◆ ATTRBIT_NORENAME

#define ATTRBIT_NORENAME   (1<<7) /* "r", fd */

◆ ATTRBIT_NOWRITE

#define ATTRBIT_NOWRITE   (1<<5) /* "w", f, write inhibit(v2)/read-only(v1) bit */

◆ ATTRBIT_ROPEN

#define ATTRBIT_ROPEN   (1<<4) /* resource fork already open. Not stored, computed on the fly */

◆ ATTRBIT_SETCLR

#define ATTRBIT_SETCLR   (1<<15) /* set/clear bit (d) */

◆ ATTRBIT_SHARED

#define ATTRBIT_SHARED   (1<<4) /* Shared area, called IsExpFolder in spec */

◆ ATTRBIT_SYSTEM

#define ATTRBIT_SYSTEM   (1<<2) /* "y", fd */

◆ BYTELOCK_MAX

#define BYTELOCK_MAX   (AD_FILELOCK_BASE - 1)

◆ FINDERINFO_CLOSEDVIEW

#define FINDERINFO_CLOSEDVIEW   0x100

◆ FINDERINFO_COLOR

#define FINDERINFO_COLOR   (0x0e)

◆ FINDERINFO_CUSTOMICON

#define FINDERINFO_CUSTOMICON   0x4

◆ FINDERINFO_FRCREATOFF

#define FINDERINFO_FRCREATOFF   4

◆ FINDERINFO_FRFLAGOFF

#define FINDERINFO_FRFLAGOFF   8

◆ FINDERINFO_FRTYPEOFF

#define FINDERINFO_FRTYPEOFF   0

◆ FINDERINFO_FRVIEWOFF

#define FINDERINFO_FRVIEWOFF   14

◆ FINDERINFO_HASBEENINITED

#define FINDERINFO_HASBEENINITED   (1<<8) /* "i", fd */

◆ FINDERINFO_HASBUNDLE

#define FINDERINFO_HASBUNDLE   (1<<13) /* "b", fd */

◆ FINDERINFO_HASCUSTOMICON

#define FINDERINFO_HASCUSTOMICON   (1<<10) /* "c", fd */

◆ FINDERINFO_HASNOINITS

#define FINDERINFO_HASNOINITS   (1<<7) /* "n", f */

◆ FINDERINFO_HIDEEXT

#define FINDERINFO_HIDEEXT   (1<<4) /* "e", fd */

◆ FINDERINFO_INVISIBLE

#define FINDERINFO_INVISIBLE   (1<<14) /* "v", fd */

◆ FINDERINFO_ISALIAS

#define FINDERINFO_ISALIAS   (1<<15) /* "a", fd */

◆ FINDERINFO_ISHARED

#define FINDERINFO_ISHARED   (1<<6) /* "m", f */

◆ FINDERINFO_ISONDESK

#define FINDERINFO_ISONDESK   (1) /* "d", fd */

◆ FINDERINFO_ISSTATIONNERY

#define FINDERINFO_ISSTATIONNERY   (1<<11) /* "t", f */

◆ FINDERINFO_NAMELOCKED

#define FINDERINFO_NAMELOCKED   (1<<12) /* "s", fd */

Typedef Documentation

◆ adf_lock_t

typedef struct adf_lock_t adf_lock_t

◆ cnid_t

typedef uint32_t cnid_t

Function Documentation

◆ ad_close()

int ad_close ( struct adouble * ad,
int adflags )
extern

Close a struct adouble freeing all resources

◆ ad_convert()

int ad_convert ( const char * path,
const struct stat * sp,
const struct vol * vol,
const char ** newpath )
extern

AppleDouble and encoding conversion on the fly

Parameters
path(r) path to file or directory
sp(r) stat(path)
vol(r) volume handle
newpath(w) if encoding changed, new name. Can be NULL.
Returns
-1 on internal error, otherwise 0. newpath is NULL if no character conversion was done, otherwise newpath points to a static string with the converted name

◆ ad_copy_header()

int ad_copy_header ( struct adouble * add,
struct adouble * ads )
extern

◆ ad_dir()

char * ad_dir ( const char * path)
extern

◆ ad_dtruncate()

int ad_dtruncate ( struct adouble * ad,
off_t size )
extern

◆ ad_entry()

void * ad_entry ( const struct adouble * ad,
int eid )
extern

◆ ad_flush()

int ad_flush ( struct adouble * ad)
extern

◆ ad_forcegetid()

uint32_t ad_forcegetid ( struct adouble * adp)
extern

◆ ad_getattr()

int ad_getattr ( const struct adouble * ad,
uint16_t * attr )
extern

◆ ad_getdate()

int ad_getdate ( const struct adouble * ad,
unsigned int dateoff,
uint32_t * date )
extern

◆ ad_getentryoff()

off_t ad_getentryoff ( const struct adouble * ad,
int eid )
extern

◆ ad_getfuid()

uid_t ad_getfuid ( void )
extern

◆ ad_getid()

uint32_t ad_getid ( struct adouble * ,
dev_t ,
ino_t ,
cnid_t ,
const void *  )
extern

◆ ad_hf_mode()

mode_t ad_hf_mode ( mode_t mode)
extern

◆ ad_init()

void ad_init ( struct adouble * ,
const struct vol * restrict )
extern

◆ ad_init_offsets()

int ad_init_offsets ( struct adouble * ad)
extern

Initialize offset pointers

◆ ad_init_old()

void ad_init_old ( struct adouble * ad,
int flags,
int options )
extern

◆ ad_lock()

int ad_lock ( struct adouble * ad,
uint32_t eid,
int type,
off_t off,
off_t len,
int fork )
extern

◆ ad_metadata()

int ad_metadata ( const char * name,
int flags,
struct adouble * adp )
extern

open metadata, possibly as root

Return only metadata but try very hard i.e. at first try as user, then try as root.

Parameters
namename of file/dir
flagsADFLAGS_DIR: name is a directory
ADFLAGS_CHECK_OF: test if name is open by us or another afpd process
adppointer to struct adouble

◆ ad_metadataat()

int ad_metadataat ( int dirfd,
const char * name,
int flags,
struct adouble * adp )
extern

◆ ad_mkdir()

int ad_mkdir ( const char * path,
mode_t mode )
extern

◆ ad_mmapread()

void * ad_mmapread ( struct adouble * ,
uint32_t ,
off_t ,
size_t  )
extern

◆ ad_mmapwrite()

void * ad_mmapwrite ( struct adouble * ,
uint32_t ,
off_t ,
int ,
size_t  )
extern

◆ ad_mode()

int ad_mode ( const char * path,
mode_t mode )
extern

◆ ad_open()

int ad_open ( struct adouble * ad,
const char * path,
int adflags,
... )
extern

Open data-, metadata(header)- or resource fork

ad_open(struct adouble *ad, const char *path, int adflags, int flags) ad_open(struct adouble *ad, const char *path, int adflags, int flags, mode_t mode)

You must call ad_init() before ad_open, usually you'll just call it like this:

struct adoube ad;
void ad_init(struct adouble *, const struct vol *restrict)
Definition include/atalk/volume.h:32
int v_ad_options
Definition include/atalk/volume.h:53
int v_adouble
Definition include/atalk/volume.h:51

Open a files data fork, metadata fork or resource fork.

Parameters
ad(rw) pointer to struct adouble
path(r) Path to file or directory
adflags(r) Flags specifying which fork to open, can be or'd: ADFLAGS_DF: open data fork ADFLAGS_RF: open resource fork ADFLAGS_HF: open header (metadata) file ADFLAGS_NOHF: it's not an error if header file couldn't be opened ADFLAGS_NORF: it's not an error if reso fork couldn't be opened ADFLAGS_DIR: if path is a directory you MUST or ADFLAGS_DIR to adflags

Access mode for the forks: ADFLAGS_RDONLY: open read only ADFLAGS_RDWR: open read write

Creation flags: ADFLAGS_CREATE: create if not existing ADFLAGS_TRUNC: truncate

Special flags: ADFLAGS_CHECK_OF: check for open forks from us and other afpd's ADFLAGS_SETSHRMD: this adouble struct will be used to set sharemode locks. This basically results in the files being opened RW instead of RDONLY.

Parameters
...(r) mode used with O_CREATE

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

BUGS:

  • on Solaris (HAVE_EAFD) ADFLAGS_RF doesn't work without ADFLAGS_HF, because it checks whether ad_meta_fileno() is already openend. As a workaround pass ADFLAGS_SETSHRMD.
Returns
0 on success, any other value indicates an error

◆ ad_openat()

int ad_openat ( struct adouble * ad,
int dirfd,
const char * path,
int adflags,
... )
extern

◆ ad_openforks()

uint16_t ad_openforks ( struct adouble * ad,
uint16_t attrbits )
extern

Return if a file is open by another process.

Optimized for the common case:

  • there's no locks held by another process (clients)
  • or we already know the answer and don't need to test (attrbits)
Parameters
ad(rw) handle
attrbits(r) forks opened by us
Returns
bitflags ATTRBIT_DOPEN | ATTRBIT_ROPEN if other process has fork of file opened

◆ ad_path()

const char * ad_path ( const char * path,
int adflags )
extern

◆ ad_path_ea()

const char * ad_path_ea ( const char * ,
int  )
extern

◆ ad_path_osx()

const char * ad_path_osx ( const char * path,
int adflags )
extern

◆ ad_pread()

ssize_t ad_pread ( struct ad_fd * ,
void * ,
size_t ,
off_t  )
extern

◆ ad_read()

ssize_t ad_read ( struct adouble * ad,
uint32_t eid,
off_t off,
char * buf,
size_t buflen )
extern

◆ ad_rebuild_adouble_header_ea()

int ad_rebuild_adouble_header_ea ( struct adouble * ad)
extern

◆ ad_rebuild_adouble_header_osx()

int ad_rebuild_adouble_header_osx ( struct adouble * ad,
char * adbuf )
extern

Prepare adbuf buffer from struct adouble for writing on disk

◆ ad_rebuild_adouble_header_v2()

int ad_rebuild_adouble_header_v2 ( struct adouble * ad)
extern

◆ ad_refresh()

int ad_refresh ( const char * path,
struct adouble * ad )
extern

◆ ad_reso_size()

off_t ad_reso_size ( const char * path,
int adflags,
struct adouble * ad )
extern

◆ ad_rtruncate()

int ad_rtruncate ( struct adouble * ad,
const char * uname,
off_t size )
extern

◆ ad_setattr()

int ad_setattr ( const struct adouble * ad,
const uint16_t attribute )
extern

◆ ad_setdate()

int ad_setdate ( struct adouble * ad,
unsigned int dateoff,
uint32_t date )
extern

◆ ad_setfuid()

int ad_setfuid ( const uid_t id)
extern

◆ ad_setid()

int ad_setid ( struct adouble * adp,
dev_t dev,
ino_t ino,
uint32_t id,
uint32_t did,
const void * stamp )
extern

◆ ad_setname()

int ad_setname ( struct adouble * ad,
const char * path )
extern

◆ ad_size()

off_t ad_size ( const struct adouble * ad,
uint32_t eid )
extern

◆ ad_stat()

int ad_stat ( const char * path,
struct stat * stbuf )
extern

◆ ad_testlock()

int ad_testlock ( struct adouble * ad,
int eid,
const off_t off )
extern

Test for a share mode lock

Parameters
ad(rw) handle
eid(r) datafork or resource fork
off(r) sharemode lock to test
Returns
1 if there's an existing lock, 0 if there's no lock, -1 in case any error occured

◆ ad_tmplock()

int ad_tmplock ( struct adouble * ad,
uint32_t eid,
int type,
off_t off,
off_t len,
int fork )
extern

◆ ad_unlock()

void ad_unlock ( struct adouble * ad,
int fork,
int unlckbrl )
extern

◆ ad_valid_header_osx()

int ad_valid_header_osx ( const char * path)
extern

◆ ad_write()

ssize_t ad_write ( struct adouble * ad,
uint32_t eid,
off_t off,
int end,
const char * buf,
size_t buflen )
extern

◆ adf_pread()

ssize_t adf_pread ( struct ad_fd * ad_fd,
void * buf,
size_t count,
off_t offset )
extern

◆ adf_pwrite()

ssize_t adf_pwrite ( struct ad_fd * ad_fd,
const void * buf,
size_t count,
off_t offset )
extern

◆ adflags2logstr()

const char * adflags2logstr ( int adflags)
extern

◆ copy_fork()

int copy_fork ( int eid,
struct adouble * add,
struct adouble * ads,
uint8_t * buf,
size_t buflen )
extern

◆ fsetrsrcea()

int fsetrsrcea ( struct adouble * ad,
int fd,
const char * eaname,
const void * value,
size_t size,
int flags )
extern

◆ sys_ftruncate()

int sys_ftruncate ( int fd,
off_t length )
extern