- switch ( bit ) {
- case DIRPBIT_ATTR :
- if ( isad ) {
- ad_getattr(&ad, &ashort);
- } else if (*upath == '.' && strcmp(upath, ".") &&
- strcmp(upath, "..")) {
- ashort = htons(ATTRBIT_INVISIBLE);
- } else
- ashort = 0;
- memcpy( data, &ashort, sizeof( ashort ));
- data += sizeof( ashort );
- break;
-
- case DIRPBIT_PDID :
- if ( dir->d_did == DIRDID_ROOT) {
- aint = DIRDID_ROOT_PARENT;
- } else if (dir->d_did == DIRDID_ROOT_PARENT) {
- aint = 0;
- } else {
- aint = dir->d_parent->d_did;
- }
- memcpy( data, &aint, sizeof( aint ));
- data += sizeof( aint );
- break;
-
- case DIRPBIT_CDATE :
- if (!isad || (ad_getdate(&ad, AD_DATE_CREATE, &aint) < 0))
- aint = AD_DATE_FROM_UNIX(st->st_mtime);
- memcpy( data, &aint, sizeof( aint ));
- data += sizeof( aint );
- break;
-
- case DIRPBIT_MDATE :
- aint = AD_DATE_FROM_UNIX(st->st_mtime);
- memcpy( data, &aint, sizeof( aint ));
- data += sizeof( aint );
- break;
-
- case DIRPBIT_BDATE :
- if (!isad || (ad_getdate(&ad, AD_DATE_BACKUP, &aint) < 0))
- aint = AD_DATE_START;
- memcpy( data, &aint, sizeof( aint ));
- data += sizeof( aint );
- break;
-
- case DIRPBIT_FINFO :
- if ( isad ) {
- memcpy( data, ad_entry( &ad, ADEID_FINDERI ), 32 );
- } else { /* no appledouble */
- memset( data, 0, 32 );
- /* set default view -- this also gets done in ad_open() */
- ashort = htons(FINDERINFO_CLOSEDVIEW);
- memcpy(data + FINDERINFO_FRVIEWOFF, &ashort, sizeof(ashort));
-
- /* dot files are by default invisible */
- if (*upath == '.' && strcmp(upath, ".") &&
- strcmp(upath, "..")) {
- ashort = htons(FINDERINFO_INVISIBLE);
- memcpy(data + FINDERINFO_FRFLAGOFF,
- &ashort, sizeof(ashort));
- }
- }
- data += 32;
- break;
-
- case DIRPBIT_LNAME :
- if (dir->d_name) /* root of parent can have a null name */
- nameoff = data;
- else
- memset(data, 0, sizeof(u_int16_t));
- data += sizeof( u_int16_t );
- break;
-
- case DIRPBIT_SNAME :
- memset(data, 0, sizeof(u_int16_t));
- data += sizeof( u_int16_t );
- break;
-
- case DIRPBIT_DID :
- memcpy( data, &dir->d_did, sizeof( aint ));
- data += sizeof( aint );
- break;
-
- case DIRPBIT_OFFCNT :
- ashort = 0;
- /* this needs to handle current directory access rights */
- if ((dp = opendir( upath ))) {
- while (( de = readdir( dp )) != NULL ) {
- if (!strcmp(de->d_name, "..") || !strcmp(de->d_name, "."))
- continue;
-
- if (!validupath(vol, de->d_name))
- continue;
-
- /* now check against too long a filename */
- if (strlen(utompath(vol, de->d_name)) > MACFILELEN)
- continue;
-
- ashort++;
- }
- closedir( dp );
- }
- ashort = htons( ashort );
- memcpy( data, &ashort, sizeof( ashort ));
- data += sizeof( ashort );
- break;
-
- case DIRPBIT_UID :
- aint = st->st_uid;
- memcpy( data, &aint, sizeof( aint ));
- data += sizeof( aint );
- break;
-
- case DIRPBIT_GID :
- aint = st->st_gid;
- memcpy( data, &aint, sizeof( aint ));
- data += sizeof( aint );
- break;
-
- case DIRPBIT_ACCESS :
- utommode( st, &ma );
-/* #ifdef HAVE_ACCESS
- accessmode( upath, &ma, dir );
-#endif HAVE_ACCESS */
-#ifdef AFS /* If only AFS defined, access() works only for AFS filesystems */
- afsmode( upath, &ma, dir );
-#endif AFS
- *data++ = ma.ma_user;
- *data++ = ma.ma_world;
- *data++ = ma.ma_group;
- *data++ = ma.ma_owner;
- break;
-
- /* Client has requested the ProDOS information block.
- Just pass back the same basic block for all
- directories. <shirsch@ibm.net> */
- case DIRPBIT_PDINFO : /* ProDOS Info Block */
- *data++ = 0x0f;
- *data++ = 0;
- ashort = htons( 0x0200 );
- memcpy( data, &ashort, sizeof( ashort ));
- data += sizeof( ashort );
- memset( data, 0, sizeof( ashort ));
- data += sizeof( ashort );
- break;
-
- default :
- if ( isad ) {
- ad_close( &ad, ADFLAGS_HF );
- }
-#ifdef FORCE_UIDGID
- restore_uidgid ( uidgid );
-#endif FORCE_UIDGID
- return( AFPERR_BITMAP );
- }
- bitmap = bitmap>>1;
- bit++;
+ case DIRPBIT_FINFO :
+ if ( isad ) {
+ memcpy( data, ad_entry( &ad, ADEID_FINDERI ), 32 );
+ } else { /* no appledouble */
+ memset( data, 0, 32 );
+ /* set default view -- this also gets done in ad_open() */
+ ashort = htons(FINDERINFO_CLOSEDVIEW);
+ memcpy(data + FINDERINFO_FRVIEWOFF, &ashort, sizeof(ashort));
+
+ /* dot files are by default invisible */
+ if (*upath == '.' && strcmp(upath, ".") &&
+ strcmp(upath, "..")) {
+ ashort = htons(FINDERINFO_INVISIBLE);
+ memcpy(data + FINDERINFO_FRFLAGOFF,
+ &ashort, sizeof(ashort));
+ }
+ }
+ data += 32;
+ break;
+
+ case DIRPBIT_LNAME :
+ if (dir->d_m_name) /* root of parent can have a null name */
+ l_nameoff = data;
+ else
+ memset(data, 0, sizeof(u_int16_t));
+ data += sizeof( u_int16_t );
+ break;
+
+ case DIRPBIT_SNAME :
+ memset(data, 0, sizeof(u_int16_t));
+ data += sizeof( u_int16_t );
+ break;
+
+ case DIRPBIT_DID :
+ memcpy( data, &dir->d_did, sizeof( aint ));
+ data += sizeof( aint );
+ break;
+
+ case DIRPBIT_OFFCNT :
+ ashort = 0;
+ /* this needs to handle current directory access rights */
+ if (st->st_ctime == dir->ctime) {
+ ashort = dir->offcnt;
+ }
+ else if ((ret = for_each_dirent(vol, upath, NULL,NULL)) >= 0) {
+ ashort = ret;
+ dir->offcnt = ashort;
+ dir->ctime = st->st_ctime;
+ }
+ ashort = htons( ashort );
+ memcpy( data, &ashort, sizeof( ashort ));
+ data += sizeof( ashort );
+ break;
+
+ case DIRPBIT_UID :
+ aint = htonl(st->st_uid);
+ memcpy( data, &aint, sizeof( aint ));
+ data += sizeof( aint );
+ break;
+
+ case DIRPBIT_GID :
+ aint = htonl(st->st_gid);
+ memcpy( data, &aint, sizeof( aint ));
+ data += sizeof( aint );
+ break;
+
+ case DIRPBIT_ACCESS :
+ accessmode( upath, &ma, dir , st);
+
+ *data++ = ma.ma_user;
+ *data++ = ma.ma_world;
+ *data++ = ma.ma_group;
+ *data++ = ma.ma_owner;
+ break;
+
+ /* Client has requested the ProDOS information block.
+ Just pass back the same basic block for all
+ directories. <shirsch@ibm.net> */
+ case DIRPBIT_PDINFO :
+ if (afp_version >= 30) { /* UTF8 name */
+ utf8 = kTextEncodingUTF8;
+ if (dir->d_m_name) /* root of parent can have a null name */
+ utf_nameoff = data;
+ else
+ memset(data, 0, sizeof(u_int16_t));
+ data += sizeof( u_int16_t );
+ aint = 0;
+ memcpy(data, &aint, sizeof( aint ));
+ data += sizeof( aint );
+ }
+ else { /* ProDOS Info Block */
+ *data++ = 0x0f;
+ *data++ = 0;
+ ashort = htons( 0x0200 );
+ memcpy( data, &ashort, sizeof( ashort ));
+ data += sizeof( ashort );
+ memset( data, 0, sizeof( ashort ));
+ data += sizeof( ashort );
+ }
+ break;
+
+ default :
+ if ( isad ) {
+ ad_close( &ad, ADFLAGS_HF );
+ }
+ return( AFPERR_BITMAP );
+ }
+ bitmap = bitmap>>1;
+ bit++;