diff -ruN netatalk-1.5.3/etc/afpd/file.c netatalk-1.5.3-new/etc/afpd/file.c --- netatalk-1.5.3/etc/afpd/file.c 2002-05-25 15:28:19 +0300 +++ netatalk-1.5.3-new/etc/afpd/file.c 2002-08-30 17:55:44 +0300 @@ -95,6 +95,35 @@ 0, 0, 0, 0, 0, 0, 0, 0 }; +static u_int32_t getinode(struct vol *vol, const char *path) +{ +#define MAXLEN 1024 + FILE *file; + u_int32_t ret = 0; + char *dpath = 0; + char *fpath = 0; + + if (!(dpath = calloc(1, MAXLEN))) + return ret; + + if (!(fpath = calloc(1, MAXLEN))) + goto getinode_exit; + + getcwd(dpath, MAXLEN - 1); + snprintf(fpath, MAXLEN - 1, "%s/.AppleDouble/%s", dpath, path); + + if ((file = fopen(fpath, "r"))) { + fseek(file, ADEDOFF_COMMENT, SEEK_SET); + fread(&ret, 4, 1, file); + fclose(file); + } + +getinode_exit: + if (dpath) free(dpath); + if (fpath) free(fpath); + return ret; +} + int getmetadata(struct vol *vol, u_int16_t bitmap, char *path, struct dir *dir, struct stat *st, @@ -107,7 +136,7 @@ struct extmap *em; char *data, *nameoff = NULL, *upath; int bit = 0; - u_int32_t aint; + u_int32_t aint, inode = 0; u_int16_t ashort; u_char achar, fdType[4]; @@ -206,7 +235,24 @@ break; case FILPBIT_FNUM : - aint = 0; + aint = 0; + inode = getinode(vol, mtoupath(vol, path)); + + if (inode != 0) { + aint = htonl((st->st_dev << 16) | (inode & 0x0000ffff)); + memcpy(data, &aint, sizeof( aint )); + data += sizeof( aint ); +#if 0 + { + FILE *file = fopen("/tmp/XFS_inode.hash", "a"); + fprintf(file, "seq: %d: last: %d: path: %s\n", + aint, vol->v_lastinode, mtoupath(vol, path)); + fclose(file); + } +#endif + break; + } + #if AD_VERSION > AD_VERSION1 /* look in AD v2 header */ if (adp) @@ -272,6 +318,14 @@ memcpy(data, &aint, sizeof( aint )); data += sizeof( aint ); +#if 0 + { + FILE *file = fopen("/tmp/XFS_inode.hash", "a"); + fprintf(file, "gen: %d: last: %d: path: %s\n", + aint, vol->v_lastinode, mtoupath(vol, path)); + fclose(file); + } +#endif break; case FILPBIT_DFLEN : @@ -510,6 +564,8 @@ ad_setentrylen( adp, ADEID_NAME, strlen( path )); memcpy(ad_entry( adp, ADEID_NAME ), path, ad_getentrylen( adp, ADEID_NAME )); + vol->v_lastinode > 65535 ? vol->v_lastinode = 1 : vol->v_lastinode ++; + memcpy(ad_entry(adp, ADEID_COMMENT), &vol->v_lastinode, 4); ad_flush( adp, ADFLAGS_DF|ADFLAGS_HF ); ad_close( adp, ADFLAGS_DF|ADFLAGS_HF ); diff -ruN netatalk-1.5.3/etc/afpd/volume.c netatalk-1.5.3-new/etc/afpd/volume.c --- netatalk-1.5.3/etc/afpd/volume.c 2002-08-30 17:57:58 +0300 +++ netatalk-1.5.3-new/etc/afpd/volume.c 2002-08-30 17:27:09 +0300 @@ -1155,6 +1155,8 @@ goto openvol_err; } + volume->v_lastinode = 0; + buflen = *rbuflen - sizeof( bitmap ); if (( ret = getvolparams( bitmap, volume, &st, rbuf + sizeof(bitmap), &buflen )) != AFP_OK ) { diff -ruN netatalk-1.5.3/etc/afpd/volume.h netatalk-1.5.3-new/etc/afpd/volume.h --- netatalk-1.5.3/etc/afpd/volume.h 2002-08-30 17:57:58 +0300 +++ netatalk-1.5.3-new/etc/afpd/volume.h 2002-08-30 17:28:02 +0300 @@ -60,6 +60,7 @@ char *v_forceuid; char *v_forcegid; #endif /* FORCE_UIDGID */ + u_int32_t v_lastinode; }; #ifdef NO_LARGE_VOL_SUPPORT