--- etc/afpd/enumerate.c.orig Sun Aug 17 09:20:06 1997 +++ etc/afpd/enumerate.c Wed Nov 24 17:15:31 1999 @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -13,12 +14,13 @@ #include #include #include -#include +#include #include #include "desktop.h" -#include "directory.h" #include "volume.h" +#include "directory.h" +#include "file.h" #include "globals.h" struct dir * @@ -44,7 +46,7 @@ syslog( LOG_ERR, "adddir: malloc: %m" ); exit( 1 ); } - strcpy( cdir->d_name, name ); + (void)strlcpy( cdir->d_name, name, (namlen + 1) ); if ( dirinsert( vol, cdir ) < 0 ) { return( NULL ); } @@ -60,7 +62,7 @@ * O(n^2) searches on a directory. */ struct savedir { - u_short sd_vid; + u_int16_t sd_vid; int sd_did; int sd_buflen; char *sd_buf; @@ -69,21 +71,22 @@ }; #define SDBUFBRK 1024 +int afp_enumerate( ibuf, ibuflen, rbuf, rbuflen ) char *ibuf, *rbuf; int ibuflen, *rbuflen; { struct stat st; - struct adouble ad; static struct savedir sd = { 0, 0, 0, 0, 0, 0 }; struct vol *vol; struct dir *dir; struct dirent *de; DIR *dp; - int did, adret, ret, esz, len; - char *path, *data, *end, *start, dbuf[ MAXPATHLEN ]; - u_short vid, fbitmap, dbitmap, reqcnt, actcnt = 0; - u_short sindex, maxsz, sz = 0; + int did, ret, esz, len; + char *path, *data, *end, *start; + u_int16_t vid, fbitmap, dbitmap, reqcnt, actcnt = 0; + u_int16_t sindex, maxsz, sz = 0; + int ucflag; if ( sd.sd_buflen == 0 ) { if (( sd.sd_buf = (char *)malloc( SDBUFBRK )) == NULL ) { @@ -96,53 +99,58 @@ ibuf += 2; ibuflen -= 2; - bcopy( ibuf, &vid, sizeof( u_short )); - ibuf += sizeof( u_short ); - ibuflen -= sizeof( u_short ); + memcpy( &vid, ibuf, sizeof( vid )); + ibuf += sizeof( vid ); + ibuflen -= sizeof( vid ); if (( vol = getvolbyvid( vid )) == NULL ) { *rbuflen = 0; return( AFPERR_PARAM ); } - bcopy( ibuf, &did, sizeof( int )); - ibuf += sizeof( int ); - ibuflen -= sizeof( int ); + /* If this volume is to be used by a ProDOS-8 client, the + designated bit in the volume flags will be + set. */ + ucflag = vol->v_flags & AFPVOL_TOUPPER; + + memcpy( &did, ibuf, sizeof( did )); + ibuf += sizeof( did ); + ibuflen -= sizeof( did ); if (( dir = dirsearch( vol, did )) == NULL ) { *rbuflen = 0; return( AFPERR_NODIR ); } - bcopy( ibuf, &fbitmap, sizeof( u_short )); + memcpy( &fbitmap, ibuf, sizeof( fbitmap )); fbitmap = ntohs( fbitmap ); - ibuf += sizeof( u_short ); - ibuflen -= sizeof( u_short ); + ibuf += sizeof( fbitmap ); + ibuflen -= sizeof( fbitmap ); - bcopy( ibuf, &dbitmap, sizeof( u_short )); + memcpy( &dbitmap, ibuf, sizeof( dbitmap )); dbitmap = ntohs( dbitmap ); - ibuf += sizeof( u_short ); - ibuflen -= sizeof( u_short ); + ibuf += sizeof( dbitmap ); + ibuflen -= sizeof( dbitmap ); - bcopy( ibuf, &reqcnt, sizeof( u_short )); + memcpy( &reqcnt, ibuf, sizeof( reqcnt )); reqcnt = ntohs( reqcnt ); - ibuf += sizeof( u_short ); - ibuflen -= sizeof( u_short ); + ibuf += sizeof( reqcnt ); + ibuflen -= sizeof( reqcnt ); - bcopy( ibuf, &sindex, sizeof( u_short )); + memcpy( &sindex, ibuf, sizeof( sindex )); sindex = ntohs( sindex ); - ibuf += sizeof( u_short ); - ibuflen -= sizeof( u_short ); + ibuf += sizeof( sindex ); + ibuflen -= sizeof( sindex ); - bcopy( ibuf, &maxsz, sizeof( u_short )); + memcpy( &maxsz, ibuf, sizeof( maxsz )); maxsz = ntohs( maxsz ); - ibuf += sizeof( u_short ); - ibuflen -= sizeof( u_short ); + ibuf += sizeof( maxsz ); + ibuflen -= sizeof( maxsz ); if (( path = cname( vol, dir, &ibuf )) == NULL ) { *rbuflen = 0; return( AFPERR_NODIR ); } - data = rbuf + 3 * sizeof( u_short ); - sz = 3 * sizeof( u_short ); + data = rbuf + 3 * sizeof( u_int16_t ); + sz = 3 * sizeof( u_int16_t ); /* * Read the directory into a pre-malloced buffer, stored @@ -179,7 +187,7 @@ end = sd.sd_buf + sd.sd_buflen; } - bcopy( de->d_name, sd.sd_last, strlen( de->d_name ) + 1 ); + memcpy( sd.sd_last, de->d_name, strlen( de->d_name ) + 1 ); sd.sd_last += strlen( de->d_name ) + 1; } *sd.sd_last = 0; @@ -236,12 +244,12 @@ * inaccurate, since that means /dev/null is a file, /dev/printer * is a file, etc. */ - if ( st.st_mode & S_IFDIR ) { + if ( S_ISDIR(st.st_mode)) { if ( dbitmap == 0 ) { sd.sd_last += len + 1; continue; } - path = utompath( sd.sd_last ); + path = utompath( sd.sd_last, ucflag ); for ( dir = curdir->d_child; dir; dir = dir->d_next ) { if ( strcmp( dir->d_name, path ) == 0 ) { @@ -263,7 +271,7 @@ sd.sd_last += len + 1; continue; } - if (( ret = getfilparams( fbitmap, utompath( sd.sd_last ), + if (( ret = getfilparams( fbitmap, utompath( sd.sd_last, ucflag ), curdir, &st, data + 2 * sizeof( u_char ), &esz )) != AFP_OK ) { *rbuflen = 0; @@ -290,7 +298,7 @@ sz += esz + 2 * sizeof( u_char ); *data++ = esz + 2 * sizeof( u_char ); - if ( st.st_mode & S_IFDIR ) { + if ( S_ISDIR(st.st_mode)) { *data++ = 1<<7; } else { *data++ = 0; @@ -311,14 +319,14 @@ * All done, fill in misc junk in rbuf */ fbitmap = htons( fbitmap ); - bcopy( &fbitmap, rbuf, sizeof( u_short )); - rbuf += sizeof( u_short ); + memcpy( rbuf, &fbitmap, sizeof( fbitmap )); + rbuf += sizeof( fbitmap ); dbitmap = htons( dbitmap ); - bcopy( &dbitmap, rbuf, sizeof( u_short )); - rbuf += sizeof( u_short ); + memcpy( rbuf, &dbitmap, sizeof( dbitmap )); + rbuf += sizeof( dbitmap ); actcnt = htons( actcnt ); - bcopy( &actcnt, rbuf, sizeof( u_short )); - rbuf += sizeof( u_short ); + memcpy( rbuf, &actcnt, sizeof( actcnt )); + rbuf += sizeof( actcnt ); *rbuflen = sz; return( AFP_OK ); }