/*
+ * $Id: ad_open.c,v 1.10.2.1 2002-03-12 16:12:03 srittau Exp $
+ *
* Copyright (c) 1999 Adrian Sun (asun@u.washington.edu)
* Copyright (c) 1990,1991 Regents of The University of Michigan.
* All Rights Reserved.
* netatalk@itd.umich.edu
*/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H */
+
#include <string.h>
+#ifdef HAVE_FCNTL_H
#include <fcntl.h>
+#endif /* HAVE_FCNTL_H */
+#ifdef HAVE_UNISTD_H
#include <unistd.h>
+#endif /* HAVE_UNISTD_H */
#include <errno.h>
#include <syslog.h>
#ifndef MAX
#define MAX(a, b) ((a) < (b) ? (b) : (a))
-#endif
+#endif /* ! MAX */
/*
* AppleDouble entry default offsets.
/* initial lengths of some of the fields */
#define ADEDLEN_INIT 0
+/* make sure we don't redefine ADEDOFF_FILEI */
+#ifdef ADEDOFF_FILEI
+#undef ADEDOFF_FILEI
+#endif /* ADEDOFF_FILEI */
+
#define ADEID_NUM_V1 5
#define ADEDOFF_NAME_V1 (AD_HEADER_LEN + ADEID_NUM_V1*AD_ENTRY_LEN)
#define ADEDOFF_COMMENT_V1 (ADEDOFF_NAME_V1 + ADEDLEN_NAME)
{ADEID_RFORK, ADEDOFF_RFORK_V1, ADEDLEN_INIT},
{0, 0, 0}
};
-#else if AD_VERSION == AD_VERSION2
+#else /* AD_VERSION == AD_VERSION2 */
static const struct entry entry_order[] = {
{ADEID_NAME, ADEDOFF_NAME_V2, ADEDLEN_INIT},
{ADEID_COMMENT, ADEDOFF_COMMENT_V2, ADEDLEN_INIT},
{ADEID_RFORK, ADEDOFF_RFORK_V2, ADEDLEN_INIT},
{0, 0, 0}
};
-#endif
+#endif /* AD_VERSION == AD_VERSION2 */
#if AD_VERSION == AD_VERSION2
/* okay, unmap our old ad header and point it to our local copy */
munmap(ad->ad_data, off);
ad->ad_data = buf;
-#endif
+#endif /* USER_MMAPPED_HEADERS */
/* move the RFORK. this assumes that the RFORK is at the end */
memmove(buf + off + SHIFTDATA, buf + off,
MAP_PRIVATE, ad->ad_hf.adf_fd, 0);
if (ad->ad_data == MAP_FAILED)
goto bail_err;
-#endif
+#endif /* USE_MMAPPED_HEADERS */
return 0;
bail_err:
return -1;
}
-#endif
+#endif /* AD_VERSION == AD_VERSION2 */
/* read in the entries */
{
#ifdef USE_MMAPPED_HEADERS
char buf[AD_ENTRY_LEN*ADEID_MAX];
-#else
+#else /* USE_MMAPPED_HEADERS */
char *buf = ad->ad_data;
-#endif
+#endif /* USE_MMAPPED_HEADERS */
u_int16_t nentries;
int len;
static int warning = 0;
if ((ad->ad_magic != AD_MAGIC) || ((ad->ad_version != AD_VERSION1)
#if AD_VERSION == AD_VERSION2
&& (ad->ad_version != AD_VERSION2)
-#endif
+#endif /* AD_VERSION == AD_VERSION2 */
)) {
errno = EIO;
syslog(LOG_DEBUG, "ad_open: can't parse AppleDouble header.");
#ifdef USE_MMAPPED_HEADERS
if (len > sizeof(buf))
len = sizeof(buf);
-#else
+#else /* USE_MMAPPED_HEADERS */
if (len + AD_HEADER_LEN > sizeof(ad->ad_data))
len = sizeof(ad->ad_data) - AD_HEADER_LEN;
buf += AD_HEADER_LEN;
-#endif
+#endif /* USE_MMAPPED_HEADERS */
if (read(ad->ad_hf.adf_fd, buf, len) != len) {
if (errno == 0)
errno = EIO;
if (!ad_getentryoff(ad, ADEID_RFORK)
#ifndef USE_MMAPPED_HEADERS
|| (ad_getentryoff(ad, ADEID_RFORK) > sizeof(ad->ad_data))
-#endif
+#endif /* ! USE_MMAPPED_HEADERS */
) {
syslog(LOG_DEBUG, "ad_header_read: problem with rfork entry offset.");
return -1;
MAP_PRIVATE, ad->ad_hf.adf_fd, 0);
if (ad->ad_data == MAP_FAILED)
return -1;
-#else
+#else /* USE_MMAPPED_HEADERS */
buf += len;
len = ad_getentryoff(ad, ADEID_RFORK) - ad->ad_hf.adf_off;
if (read(ad->ad_hf.adf_fd, buf, len) != len) {
syslog(LOG_DEBUG, "ad_header_read: can't read in entries.");
return -1;
}
-#endif
+#endif /* USE_MMAPPED_HEADERS */
/* fix up broken dates */
if (ad->ad_version == AD_VERSION1) {
struct stat st;
- int32_t aint;
+ u_int32_t aint;
if (fstat(ad->ad_hf.adf_fd, &st) < 0) {
return 1; /* fail silently */
* and that value is returned.
*/
-#define DEFMASK 7700 /* be conservative */
+#define DEFMASK 07700 /* be conservative */
int
ad_mode( path, mode )
char *path;
int mode;
{
+#ifdef DEBUG
+ syslog (LOG_INFO, "ad_mkdir: Creating directory with mode %d", mode);
+#endif /* DEBUG */
return mkdir( path, ad_mode( path, mode ) );
}
adf_lock_init(&ad->ad_hf);
#ifdef USE_MMAPPED_HEADERS
ad->ad_data = MAP_FAILED;
-#endif
+#endif /* USE_MMAPPED_HEADERS */
ad->ad_inited = AD_INITED;
+ ad->ad_refcount = 1;
}
if (adflags & ADFLAGS_DF) {
if (adflags & ADFLAGS_HF) {
if (ad_hfileno(ad) == -1) {
ad_p = ad_path( path, adflags );
- admode = ad_mode( ad_p, mode );
+ admode = ad_mode( ad_p, mode ); /* FIXME? */
hoflags = oflags & ~O_CREAT;
if (( ad->ad_hf.adf_fd = open( ad_p, hoflags, admode )) < 0 ) {
ad_close(ad, adflags);
return -1;
}
-#else
+#else /* USE_MMAPPED_HEADERS */
memset(ad->ad_data, 0, sizeof(ad->ad_data));
-#endif
+#endif /* USE_MMAPPED_HEADERS */
eid = entry_order;
while (eid->id) {
if ((ad_header_read( ad ) < 0)
#if AD_VERSION == AD_VERSION2
|| (ad_v1tov2(ad, ad_p) < 0)
-#endif
+#endif /* AD_VERSION == AD_VERSION2 */
) {
ad_close( ad, adflags );
return( -1 );
{
#ifdef USE_MMAPPED_HEADERS
off_t off;
-#endif
+#endif /* USE_MMAPPED_HEADERS */
if (ad->ad_hf.adf_fd < -1)
return -1;
}
return 0;
-#else
+#else /* USE_MMAPPED_HEADERS */
return ad_header_read(ad);
-#endif
+#endif /* USE_MMAPPED_HEADERS */
}