/*
- * $Id: adouble.h,v 1.42 2009-09-14 14:11:45 franklahm Exp $
+ * $Id: adouble.h,v 1.55 2010-03-30 12:55:26 franklahm Exp $
* Copyright (c) 1990,1991 Regents of The University of Michigan.
* All Rights Reserved.
*
* netatalk@itd.umich.edu
*/
+/*!
+ * @file
+ * @brief Part of Netatalk's AppleDouble implementatation
+ */
+
#ifndef _ATALK_ADOUBLE_H
#define _ATALK_ADOUBLE_H
need _XOPEN_SOURCE defined for pread.
*/
#if defined(HAVE_PREAD) && !defined(SOLARIS) && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__FreeBSD__) && !defined(TRU64)
-#ifdef _XOPEN_SOURCE
-#undef _XOPEN_SOURCE
-#endif
+#ifndef _XOPEN_SOURCE
#define _XOPEN_SOURCE 500
#endif
+#endif
#include <sys/types.h>
#include <sys/stat.h>
#define AD_APPLESINGLE_MAGIC 0x00051600
#define AD_APPLEDOUBLE_MAGIC 0x00051607
#define AD_MAGIC AD_APPLEDOUBLE_MAGIC
-
#define SFM_MAGIC 0x00504641
/* sizes of relevant entry bits */
} adf_lock_t;
struct ad_fd {
- int adf_fd;
+ int adf_fd; /* -1: invalid, -2: symlink */
#ifndef HAVE_PREAD
off_t adf_off;
#endif
+ char *adf_syml;
int adf_flags;
int adf_excl;
adf_lock_t *adf_lock;
#define ADFLAGS_DF (1<<0)
#define ADFLAGS_HF (1<<1)
#define ADFLAGS_DIR (1<<2)
+/*
#define ADFLAGS_NOADOUBLE (1<<3)
+*/
#define ADFLAGS_V1COMPAT (1<<4)
#define ADFLAGS_NOHF (1<<5) /* not an error if no ressource fork */
#define ADFLAGS_RDONLY (1<<6) /* don't try readwrite */
/* adouble v2 cnid cache */
#define ADVOL_NODEV (1 << 0)
#define ADVOL_CACHE (1 << 1)
-/* adouble unix priv */
-#define ADVOL_UNIXPRIV (1 << 2)
-/* dot files (.DS_Store) are invisible) */
-#define ADVOL_INVDOTS (1 << 3)
+#define ADVOL_UNIXPRIV (1 << 2) /* adouble unix priv */
+#define ADVOL_INVDOTS (1 << 3) /* dot files (.DS_Store) are invisible) */
+#define ADVOL_NOADOUBLE (1 << 4)
/* lock flags */
#define ADLOCK_CLR (0)
#define ad_get_MD_flags(ad) ((ad)->ad_md->adf_flags)
/* ad_flush.c */
-extern int ad_rebuild_adouble_header __P((struct adouble *));
-extern int ad_rebuild_sfm_header __P((struct adouble *));
-extern int ad_copy_header __P((struct adouble *, struct adouble *));
-extern int ad_flush __P((struct adouble *));
-extern int ad_close __P((struct adouble *, int));
+extern int ad_rebuild_adouble_header (struct adouble *);
+extern int ad_rebuild_sfm_header (struct adouble *);
+extern int ad_copy_header (struct adouble *, struct adouble *);
+extern int ad_flush (struct adouble *);
+extern int ad_close (struct adouble *, int);
/* ad_lock.c */
-extern int ad_fcntl_lock __P((struct adouble *, const u_int32_t /*eid*/,
+extern int ad_fcntl_lock (struct adouble *, const u_int32_t /*eid*/,
const int /*type*/, const off_t /*offset*/,
- const off_t /*len*/, const int /*user*/));
-extern void ad_fcntl_unlock __P((struct adouble *, const int /*user*/));
-extern int ad_fcntl_tmplock __P((struct adouble *, const u_int32_t /*eid*/,
+ const off_t /*len*/, const int /*user*/);
+extern void ad_fcntl_unlock (struct adouble *, const int /*user*/);
+extern int ad_fcntl_tmplock (struct adouble *, const u_int32_t /*eid*/,
const int /*type*/, const off_t /*offset*/,
- const off_t /*len*/, const int /*user*/));
-extern int ad_testlock __P((struct adouble * /*adp*/, int /*eid*/, off_t /*off*/));
-extern int ad_excl_lock __P((struct adouble * /*adp*/, const u_int32_t /*eid*/));
+ const off_t /*len*/, const int /*user*/);
+extern int ad_testlock (struct adouble * /*adp*/, int /*eid*/, off_t /*off*/);
+
+extern u_int16_t ad_openforks (struct adouble * /*adp*/, u_int16_t);
+extern int ad_excl_lock (struct adouble * /*adp*/, const u_int32_t /*eid*/);
#define ad_lock ad_fcntl_lock
#define ad_tmplock ad_fcntl_tmplock
#define ad_unlock ad_fcntl_unlock
/* ad_open.c */
-extern int ad_setfuid __P((const uid_t ));
-extern uid_t ad_getfuid __P((void ));
-extern char *ad_dir __P((const char *));
-extern char *ad_path __P((const char *, int));
-extern char *ad_path_osx __P((const char *, int));
-extern char *ad_path_ads __P((const char *, int));
-extern char *ad_path_sfm __P((const char *, int));
-extern int ad_mode __P((const char *, int));
-extern int ad_mkdir __P((const char *, int));
-extern void ad_init __P((struct adouble *, int, int ));
-extern int ad_open __P((const char *, int, int, int, struct adouble *));
-extern int ad_refresh __P((struct adouble *));
-extern int ad_stat __P((const char *, struct stat *));
-extern int ad_metadata __P((const char *, int, struct adouble *));
+extern int ad_setfuid (const uid_t );
+extern uid_t ad_getfuid (void );
+extern char *ad_dir (const char *);
+extern char *ad_path (const char *, int);
+extern char *ad_path_osx (const char *, int);
+extern char *ad_path_ads (const char *, int);
+extern char *ad_path_sfm (const char *, int);
+extern int ad_mode (const char *, int);
+extern int ad_mkdir (const char *, int);
+extern void ad_init (struct adouble *, int, int );
+extern int ad_open (const char *, int, int, int, struct adouble *);
+extern int ad_openat (int dirfd, const char *, int, int, int, struct adouble *);
+extern int ad_refresh (struct adouble *);
+extern int ad_stat (const char *, struct stat *);
+extern int ad_metadata (const char *, int, struct adouble *);
+extern int ad_metadataat (int, const char *, int, struct adouble *);
#define ad_open_metadata(name, flags, mode, adp)\
ad_open(name, ADFLAGS_MD|(flags), O_RDWR |(mode), 0666, (adp))
return mode;
}
+/* ad_ea.c */
+ssize_t sys_getxattr (const char *path, const char *name, void *value, size_t size);
+ssize_t sys_lgetxattr (const char *path, const char *name, void *value, size_t size);
+ssize_t sys_fgetxattr (int filedes, const char *name, void *value, size_t size);
+ssize_t sys_listxattr (const char *path, char *list, size_t size);
+ssize_t sys_llistxattr (const char *path, char *list, size_t size);
+ssize_t sys_flistxattr (int filedes, char *list, size_t size);
+int sys_removexattr (const char *path, const char *name);
+int sys_lremovexattr (const char *path, const char *name);
+int sys_fremovexattr (int filedes, const char *name);
+int sys_setxattr (const char *path, const char *name, const void *value, size_t size, int flags);
+int sys_lsetxattr (const char *path, const char *name, const void *value, size_t size, int flags);
+int sys_fsetxattr (int filedes, const char *name, const void *value, size_t size, int flags);
+int sys_copyxattr (const char *src, const char *dst);
+
/* ad_read.c/ad_write.c */
-extern ssize_t ad_read __P((struct adouble *, const u_int32_t,
- const off_t, char *, const size_t));
-extern ssize_t ad_pread __P((struct ad_fd *, void *, size_t, off_t));
-extern ssize_t ad_write __P((struct adouble *, const u_int32_t, off_t,
- const int, const char *, const size_t));
-extern ssize_t adf_pread __P((struct ad_fd *, void *, size_t, off_t));
-extern ssize_t adf_pwrite __P((struct ad_fd *, const void *, size_t, off_t));
-extern int ad_dtruncate __P((struct adouble *, const off_t));
-extern int ad_rtruncate __P((struct adouble *, const off_t));
+extern int sys_ftruncate(int fd, off_t length);
+
+extern ssize_t ad_read (struct adouble *, const u_int32_t,
+ const off_t, char *, const size_t);
+extern ssize_t ad_pread (struct ad_fd *, void *, size_t, off_t);
+extern ssize_t ad_write (struct adouble *, const u_int32_t, off_t,
+ const int, const char *, const size_t);
+extern ssize_t adf_pread (struct ad_fd *, void *, size_t, off_t);
+extern ssize_t adf_pwrite (struct ad_fd *, const void *, size_t, off_t);
+extern int ad_dtruncate (struct adouble *, const off_t);
+extern int ad_rtruncate (struct adouble *, const off_t);
/* ad_size.c */
-extern off_t ad_size __P((const struct adouble *, const u_int32_t ));
+extern off_t ad_size (const struct adouble *, const u_int32_t );
/* ad_mmap.c */
-extern void *ad_mmapread __P((struct adouble *, const u_int32_t,
- const off_t, const size_t));
-extern void *ad_mmapwrite __P((struct adouble *, const u_int32_t,
- const off_t, const int, const size_t));
+extern void *ad_mmapread (struct adouble *, const u_int32_t,
+ const off_t, const size_t);
+extern void *ad_mmapwrite (struct adouble *, const u_int32_t,
+ const off_t, const int, const size_t);
#define ad_munmap(buf, len) (munmap((buf), (len)))
/* ad_date.c */
-extern int ad_setdate __P((const struct adouble *, unsigned int, u_int32_t));
-extern int ad_getdate __P((const struct adouble *, unsigned int, u_int32_t *));
+extern int ad_setdate (struct adouble *, unsigned int, u_int32_t);
+extern int ad_getdate (const struct adouble *, unsigned int, u_int32_t *);
/* ad_attr.c */
-extern int ad_setattr __P((const struct adouble *, const u_int16_t));
-extern int ad_getattr __P((const struct adouble *, u_int16_t *));
+extern int ad_setattr (const struct adouble *, const u_int16_t);
+extern int ad_getattr (const struct adouble *, u_int16_t *);
/* Note: starting with Netatalk 2.1 we do NOT alway set the name */
-extern int ad_setname __P((struct adouble *, const char *));
+extern int ad_setname (struct adouble *, const char *);
#if AD_VERSION == AD_VERSION2
-extern int ad_setid __P((struct adouble *, const dev_t dev,const ino_t ino, const u_int32_t, const u_int32_t, const void *));
-extern u_int32_t ad_getid __P((struct adouble *, const dev_t, const ino_t, const cnid_t, const void *));
-extern u_int32_t ad_forcegetid __P((struct adouble *adp));
+extern int ad_setid (struct adouble *, const dev_t dev,const ino_t ino, const u_int32_t, const u_int32_t, const void *);
+extern u_int32_t ad_getid (struct adouble *, const dev_t, const ino_t, const cnid_t, const void *);
+extern u_int32_t ad_forcegetid (struct adouble *adp);
#else
#define ad_setid(a, b, c)
#endif
#ifdef WITH_SENDFILE
-extern ssize_t ad_readfile __P((const struct adouble *, const int,
- const int, off_t, const size_t));
+extern int ad_readfile_init(const struct adouble *ad,
+ const int eid, off_t *off,
+ const int end);
#endif
#if 0
#ifdef HAVE_SENDFILE_WRITE
-extern ssize_t ad_writefile __P((struct adouble *, const int,
- const int, off_t, const int, const size_t));
+extern ssize_t ad_writefile (struct adouble *, const int,
+ const int, off_t, const int, const size_t);
#endif /* HAVE_SENDFILE_WRITE */
#endif /* 0 */