diff --git a/src/connect.c b/src/connect.c index 574e98c..5179390 100644 --- a/src/connect.c +++ b/src/connect.c @@ -1278,16 +1278,26 @@ static time_t nw_2_un_time_parts(uint16 xdate, uint16 xtime) return(mktime(&s_tm)); } +#define DM_ATTRIBUTES 0x0002UL +#define DM_CREATE_DATE 0x0004UL +#define DM_CREATE_TIME 0x0008UL +#define DM_CREATOR_ID 0x0010UL #define DM_ARCHIVE_DATE 0x0020UL #define DM_ARCHIVE_TIME 0x0040UL #define DM_ARCHIVER_ID 0x0080UL #define DM_MODIFY_DATE 0x0100UL #define DM_MODIFY_TIME 0x0200UL +#define DM_MODIFIER_ID 0x0400UL #define DM_LAST_ACCESS_DATE 0x0800UL +#define DM_INHERITED_RIGHTS_MASK 0x1000UL +#define DM_MAXIMUM_SPACE 0x2000UL #define DM_NCP22_25_TIME_BITS \ (DM_MODIFY_DATE | DM_MODIFY_TIME | DM_LAST_ACCESS_DATE) #define DM_NCP22_25_ARCHIVE_BITS \ (DM_ARCHIVE_DATE | DM_ARCHIVE_TIME | DM_ARCHIVER_ID) +#define DM_NCP22_25_SUPPORTED_BITS \ + (DM_ATTRIBUTES | DM_NCP22_25_ARCHIVE_BITS | DM_NCP22_25_TIME_BITS | \ + DM_INHERITED_RIGHTS_MASK) static int set_ncp22_25_times(int volume, char *unixname, struct stat *stb, NW_SET_DIR_INFO *f, uint32 change_mask, @@ -1382,6 +1392,29 @@ static int set_ncp22_25_archive_info(char *unixname, !!(change_mask & DM_ARCHIVER_ID), aid)); } +static void log_ncp22_25_change_bits(uint32 change_mask) +{ + uint32 unsupported = change_mask & ~DM_NCP22_25_SUPPORTED_BITS; + + XDPRINTF((5,0, + "NCP22/25 change bits: change=0x%08lx supported=0x%08lx unsupported=0x%08lx", + (unsigned long)change_mask, + (unsigned long)(change_mask & DM_NCP22_25_SUPPORTED_BITS), + (unsigned long)unsupported)); + + if (unsupported) { + XDPRINTF((5,0, + "NCP22/25 unsupported change bits ignored: create=%d creator=%d modifier=%d maxspace=%d other=0x%08lx", + !!(change_mask & (DM_CREATE_DATE | DM_CREATE_TIME)), + !!(change_mask & DM_CREATOR_ID), + !!(change_mask & DM_MODIFIER_ID), + !!(change_mask & DM_MAXIMUM_SPACE), + (unsigned long)(unsupported & ~(DM_CREATE_DATE | DM_CREATE_TIME | + DM_CREATOR_ID | DM_MODIFIER_ID | + DM_MAXIMUM_SPACE)))); + } +} + static int get_file_attrib(NW_FILE_INFO *f, char *unixname, struct stat *stb, NW_PATH *nwpath) { @@ -3042,7 +3075,8 @@ int nw_set_a_directory_entry(int dirhandle, char unixname[300]; uint32 change_mask=GET_32(f->change_bits); xstrcpy(unixname,build_unix_name(&nwpath, 0)); - if (change_mask & 0x2) { + log_ncp22_25_change_bits(change_mask); + if (change_mask & DM_ATTRIBUTES) { completition=set_nw_attrib_dword(nwpath.volume, unixname, &stbuff, GET_32(f->u.f.attributes)); if (!completition) @@ -3061,14 +3095,14 @@ int nw_set_a_directory_entry(int dirhandle, S_ISDIR(stbuff.st_mode)); } if (S_ISDIR(stbuff.st_mode)) { - if (change_mask & 0x1000) { + if (change_mask & DM_INHERITED_RIGHTS_MASK) { int result=tru_set_inherited_mask(nwpath.volume, unixname, &stbuff, GET_16(f->u.d.inherited_rights_mask)); if (result) completition=result; } } else { - if (change_mask & 0x1000) { + if (change_mask & DM_INHERITED_RIGHTS_MASK) { int result=tru_set_inherited_mask(nwpath.volume, unixname, &stbuff, GET_16(f->u.f.inherited_rights_mask)); if (result)