# requested perm
#
# miscellaneous options [syntax: options:option1,option2]:
+# tm -> enable TimeMachine support
# prodos -> make compatible with appleII clients.
# crlf -> enable crlf translation for TEXT files.
# noadouble -> don't create .AppleDouble unless a resource
/*
- * $Id: directory.c,v 1.102 2009-09-01 13:55:55 franklahm Exp $
+ * $Id: directory.c,v 1.103 2009-09-11 09:14:16 franklahm Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
return err;
}
-
int afp_syncdir(obj, ibuf, ibuflen, rbuf, rbuflen )
AFPObj *obj _U_;
char *ibuf, *rbuf _U_;
memcpy( &did, ibuf, sizeof( did ));
ibuf += sizeof( did );
- if (NULL == ( dir = dirlookup( vol, did )) ) {
- return afp_errno; /* was AFPERR_NOOBJ */
- }
- if (movecwd( vol, dir ) < 0 )
- return ( AFPERR_NOOBJ );
+ /*
+ * Here's the deal:
+ * if it's CNID 2 our only choice to meet the specs is call sync.
+ * For any other CNID just sync that dir. To my knowledge the
+ * intended use of FPSyncDir is to sync the volume so all we're
+ * ever going to see here is probably CNID 2. Anyway, we' prepared.
+ */
-/*
- Assuming only OSens that have dirfd also may require fsyncing directories
- in order to flush metadata e.g. Linux.
-*/
+ if ( ntohl(did) == 2 ) {
+ sync();
+ } else {
+ if (NULL == ( dir = dirlookup( vol, did )) ) {
+ return afp_errno; /* was AFPERR_NOOBJ */
+ }
+
+ if (movecwd( vol, dir ) < 0 )
+ return ( AFPERR_NOOBJ );
+
+ /*
+ * Assuming only OSens that have dirfd also may require fsyncing directories
+ * in order to flush metadata e.g. Linux.
+ */
#ifdef HAVE_DIRFD
- if (NULL == ( dp = opendir( "." )) ) {
- switch( errno ) {
- case ENOENT :
- return( AFPERR_NOOBJ );
- case EACCES :
+ if (NULL == ( dp = opendir( "." )) ) {
+ switch( errno ) {
+ case ENOENT :
+ return( AFPERR_NOOBJ );
+ case EACCES :
return( AFPERR_ACCESS );
- default :
- return( AFPERR_PARAM );
+ default :
+ return( AFPERR_PARAM );
+ }
}
- }
-
- LOG(log_debug, logtype_afpd, "afp_syncdir: dir: '%s'", dir->d_u_name);
-
- dfd = dirfd( dp );
- if ( fsync ( dfd ) < 0 )
- LOG(log_error, logtype_afpd, "afp_syncdir(%s): %s",
- dir->d_u_name, strerror(errno) );
- closedir(dp); /* closes dfd too */
+
+ LOG(log_debug, logtype_afpd, "afp_syncdir: dir: '%s'", dir->d_u_name);
+
+ dfd = dirfd( dp );
+ if ( fsync ( dfd ) < 0 )
+ LOG(log_error, logtype_afpd, "afp_syncdir(%s): %s",
+ dir->d_u_name, strerror(errno) );
+ closedir(dp); /* closes dfd too */
#endif
-
- if ( -1 == (dfd = open(vol->vfs->ad_path(".", ADFLAGS_DIR), O_RDWR))) {
- switch( errno ) {
- case ENOENT:
- return( AFPERR_NOOBJ );
+
+ if ( -1 == (dfd = open(vol->ad_path(".", ADFLAGS_DIR), O_RDWR))) {
+ switch( errno ) {
+ case ENOENT:
+ return( AFPERR_NOOBJ );
case EACCES:
return( AFPERR_ACCESS );
- default:
- return( AFPERR_PARAM );
- }
+ default:
+ return( AFPERR_PARAM );
+ }
+ }
+
+ LOG(log_debug, logtype_afpd, "afp_syncdir: ad-file: '%s'",
+ vol->ad_path(".", ADFLAGS_DIR) );
+
+ if ( fsync(dfd) < 0 )
+ LOG(log_error, logtype_afpd, "afp_syncdir(%s): %s",
+ vol->ad_path(dir->d_u_name, ADFLAGS_DIR), strerror(errno) );
+ close(dfd);
}
- LOG(log_debug, logtype_afpd, "afp_syncdir: ad-file: '%s'",
- vol->vfs->ad_path(".", ADFLAGS_DIR) );
-
- if ( fsync(dfd) < 0 )
- LOG(log_error, logtype_afpd, "afp_syncdir(%s): %s",
- vol->vfs->ad_path(dir->d_u_name, ADFLAGS_DIR), strerror(errno) );
- close(dfd);
-
return ( AFP_OK );
}
/*
- * $Id: directory.h,v 1.25 2009-06-19 13:38:33 franklahm Exp $
+ * $Id: directory.h,v 1.26 2009-09-11 09:14:16 franklahm Exp $
*
* Copyright (c) 1990,1991 Regents of The University of Michigan.
* All Rights Reserved.
extern int afp_closedir __P((AFPObj *, char *, int, char *, int *));
extern int afp_mapid __P((AFPObj *, char *, int, char *, int *));
extern int afp_mapname __P((AFPObj *, char *, int, char *, int *));
-extern int afp_syncdir __P((AFPObj *, char *, int, char *, int *));
+extern int afp_syncdir __P((AFPObj *, char *, int, char *, int *));
/* from enumerate.c */
extern int afp_enumerate __P((AFPObj *, char *, unsigned int, char *, unsigned int *));
/*
- * $Id: fork.c,v 1.61 2009-07-21 13:41:16 didg Exp $
+ * $Id: fork.c,v 1.62 2009-09-11 09:14:16 franklahm Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
return( AFP_OK );
}
-
/* this is very similar to closefork */
int flushfork( ofork )
struct ofork *ofork;
/*
- * $Id: fork.h,v 1.12 2009-02-25 16:14:08 franklahm Exp $
+ * $Id: fork.h,v 1.13 2009-09-11 09:14:16 franklahm Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
extern int afp_bytelock_ext __P((AFPObj *, char *, int, char *, int *));
extern int afp_read_ext __P((AFPObj *, char *, int, char *, int *));
extern int afp_write_ext __P((AFPObj *, char *, int, char *, int *));
-extern int afp_syncfork __P((AFPObj *, char *, int, char *, int *));
+extern int afp_syncfork __P((AFPObj *, char *, int, char *, int *));
#endif
/*
- * $Id: switch.c,v 1.16 2009-02-25 16:14:08 franklahm Exp $
+ * $Id: switch.c,v 1.17 2009-09-11 09:14:16 franklahm Exp $
*
* Copyright (c) 1990,1991 Regents of The University of Michigan.
* All Rights Reserved.
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, /* 64 - 71 */
NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, /* 72 - 79 */
+ NULL, NULL, afp_syncdir, afp_syncfork, /* 72 - 79 */
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, /* 80 - 87 */
NULL, NULL, NULL, NULL,
/*
- * $Id: volume.c,v 1.89 2009-09-04 07:59:50 franklahm Exp $
+ * $Id: volume.c,v 1.90 2009-09-11 09:14:16 franklahm Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
{AFPVOL_CACHE, "CACHEID"}, /* Use adouble v2 CNID caching. Default: yes */
{AFPVOL_EXT_ATTRS, "EXT_ATTRS"}, /* Vol supports Extened Attributes */
{AFPVOL_ACLS, "ACLS"}, /* Vol supports ACLs */
+ {AFPVOL_TM, "TM"}, /* Set "kSupportsTMLockSteal" is volume attributes */
{0, NULL}
};
options[VOLOPT_FLAGS].i_value |= AFPVOL_EILSEQ;
else if (strcasecmp(p, "nocnidcache") == 0)
options[VOLOPT_FLAGS].i_value &= ~AFPVOL_CACHE;
+ else if (strcasecmp(p, "tm") == 0)
+ options[VOLOPT_FLAGS].i_value |= AFPVOL_TM;
p = strtok(NULL, ",");
}
ashort |= VOLPBIT_ATTR_CATSEARCH;
if (afp_version >= 30) {
ashort |= VOLPBIT_ATTR_UTF8;
- if (vol->v_flags & AFPVOL_UNIX_PRIV)
- ashort |= VOLPBIT_ATTR_UNIXPRIV;
+ if (vol->v_flags & AFPVOL_UNIX_PRIV)
+ ashort |= VOLPBIT_ATTR_UNIXPRIV;
+ if (vol->v_flags & AFPVOL_TM)
+ ashort |= VOLPBIT_ATTR_TM;
}
if (afp_version >= 32) {
if (vol->v_flags & AFPVOL_EXT_ATTRS)
/*
- * $Id: volume.h,v 1.32 2009-09-11 07:46:30 franklahm Exp $
+ * $Id: volume.h,v 1.33 2009-09-11 09:14:16 franklahm Exp $
*
* Copyright (c) 1990,1994 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
#define AFPVOL_CACHE (1 << 21) /* Use adouble v2 CNID caching. Default: yes */
#define AFPVOL_INV_DOTS (1 << 22) /* dots files are invisible */
#define AFPVOL_EXT_ATTRS (1 << 23) /* Volume supports Extended Attributes */
+#define AFPVOL_TM (1 << 24) /* Supports TimeMachine */
#define AFPVOL_ACLS (1 << 25) /* Volume supports ACLS */
/* FPGetSrvrParms options */
#define VOLPBIT_ATTR_NONETUID (1 << 7)
#define VOLPBIT_ATTR_EXT_ATTRS (1 << 10)
#define VOLPBIT_ATTR_ACLS (1 << 11)
+#define VOLPBIT_ATTR_TM (1 << 13)
+
#define VOLPBIT_ATTR 0
#define VOLPBIT_SIG 1
#define VOLPBIT_CDATE 2
/* version 3.1 */
#define AFP_ENUMERATE_EXT2 68
+#define AFP_SYNCDIR 78
+#define AFP_SYNCFORK 79
#define AFP_ZZZ 122
/* version 3.2 */
#define AFP_SETACL 74
#define AFP_ACCESS 75
#define AFP_SPOTLIGHT_PRIVATE 76
-#define AFP_SYNCDIR 78
-#define AFP_SYNCFORK 79
#endif
/*
- * $Id: volinfo.h,v 1.6 2009-09-01 14:28:07 franklahm Exp $
+ * $Id: volinfo.h,v 1.7 2009-09-11 09:14:16 franklahm Exp $
*/
#ifndef _ATALK_VOLINFO_H
#define AFPVOL_CACHE (1 << 21) /* Use adouble v2 CNID caching, default don't use it */
#define AFPVOL_INV_DOTS (1 << 22) /* dots files are invisible */
#define AFPVOL_EXT_ATTRS (1 << 23) /* Volume supports Extended Attributes */
+#define AFPVOL_TM (1 << 24) /* Supports TimeMachine */
#define AFPVOL_ACLS (1 << 25) /* Volume supports ACLS */
/* handle casefolding */
{AFPVOL_INV_DOTS, "INVISIBLEDOTS"},
{AFPVOL_EXT_ATTRS, "EXT_ATTRS"}, /* Vol supports Extened Attributes */
{AFPVOL_ACLS, "ACLS"}, /* Vol supports ACLs */
+ {AFPVOL_TM, "TM"}, /* Set "kSupportsTMLockSteal" is volume attributes */
{0, NULL}
};