--- netatalk/include/atalk/afp.h 2008-05-14 15:30:52.000000000 +0200
+++ netatalk.syncdir/include/atalk/afp.h 2008-05-14 15:45:40.000000000 +0200
@@ -201,4 +201,7 @@
#define AFP_ENUMERATE_EXT2 68
#define AFP_ZZZ 122
+/* version 3.2 */
+#define AFP_FPSYNCDIR 78
+
#endif
--- netatalk/etc/afpd/switch.c 2008-05-14 15:30:52.000000000 +0200
+++ netatalk.syncdir/etc/afpd/switch.c 2008-05-14 15:36:00.000000000 +0200
@@ -152,7 +152,7 @@
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, /* 64 - 71 */
NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, /* 72 - 79 */
+ NULL, NULL, afp_syncdir, NULL, /* 72 - 79 */
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, /* 80 - 87 */
NULL, NULL, NULL, NULL,
--- netatalk/etc/afpd/auth.c 2008-05-14 15:30:52.000000000 +0200
+++ netatalk.syncdir/etc/afpd/auth.c 2008-05-14 15:39:10.000000000 +0200
@@ -76,7 +76,8 @@
{ "AFP2.2", 22 },
#ifdef AFP3x
{ "AFPX03", 30 },
- { "AFP3.1", 31 }
+ { "AFP3.1", 31 },
+ { "AFP3.2", 32 }
#endif
};
@@ -186,6 +187,7 @@
else {
afp_switch = postauth_switch;
switch (afp_version) {
+ case 32:
case 31:
uam_afpserver_action(AFP_ENUMERATE_EXT2, UAM_AFPSERVER_POSTAUTH, afp_enumerate_ext2, NULL);
case 30:
--- netatalk/etc/afpd/directory.h 2008-05-14 15:30:52.000000000 +0200
+++ netatalk.syncdir/etc/afpd/directory.h 2008-05-14 15:36:39.000000000 +0200
@@ -219,6 +219,7 @@
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 *));
/* from enumerate.c */
extern int afp_enumerate __P((AFPObj *, char *, unsigned int, char *, unsigned int *));
--- netatalk/etc/afpd/directory.c 2008-05-14 15:30:52.000000000 +0200
+++ netatalk.syncdir/etc/afpd/directory.c 2008-05-14 15:36:36.000000000 +0200
@@ -1962,6 +1962,53 @@
return err;
}
+
+int afp_syncdir(obj, ibuf, ibuflen, rbuf, rbuflen )
+AFPObj *obj;
+char *ibuf, *rbuf;
+int ibuflen, *rbuflen;
+{
+ DIR *dp;
+ int dfd;
+ struct vol *vol;
+ struct dir *dir;
+ u_int32_t did;
+ u_int16_t vid;
+
+ *rbuflen = 0;
+ ibuf += 2;
+
+ memcpy( &vid, ibuf, sizeof( vid ));
+ ibuf += sizeof( vid );
+ if (NULL == (vol = getvolbyvid( vid )) ) {
+ return( AFPERR_PARAM );
+ }
+
+ memcpy( &did, ibuf, sizeof( did ));
+ ibuf += sizeof( did );
+ if (NULL == ( dir = dirlookup( vol, did )) ) {
+ return afp_errno; /* was AFPERR_NOOBJ */
+ }
+
+ if (NULL == ( dp = opendir( "." )) ) {
+ switch( errno ) {
+ case ENOENT :
+ return( AFPERR_NOOBJ );
+ case EACCES :
+ return( AFPERR_ACCESS );
+ default :
+ return( AFPERR_PARAM );
+ }
+ }
+
+ dfd = dirfd( dp );
+ if ( fsync ( dfd ) < 0 ) {
+ LOG(log_error, logtype_afpd, "syncdir(%s): ddir(%d) %s", dir->d_u_name, dfd, strerror(errno) );
+ }
+
+ return ( AFP_OK );
+}
+
int afp_createdir(obj, ibuf, ibuflen, rbuf, rbuflen )
AFPObj *obj;
char *ibuf, *rbuf;