+ /* with unix priv maybe we have to change adouble file priv first */
+ bit = 0;
+ while ( bitmap != 0 ) {
+ while (( bitmap & 1 ) == 0 ) {
+ bitmap = bitmap>>1;
+ bit++;
+ }
+ switch( bit ) {
+ case FILPBIT_ATTR :
+ change_mdate = 1;
+ memcpy(&ashort, buf, sizeof( ashort ));
+ buf += sizeof( ashort );
+ break;
+ case FILPBIT_CDATE :
+ change_mdate = 1;
+ memcpy(&cdate, buf, sizeof(cdate));
+ buf += sizeof( cdate );
+ break;
+ case FILPBIT_MDATE :
+ memcpy(&newdate, buf, sizeof( newdate ));
+ buf += sizeof( newdate );
+ break;
+ case FILPBIT_BDATE :
+ change_mdate = 1;
+ memcpy(&bdate, buf, sizeof( bdate));
+ buf += sizeof( bdate );
+ break;
+ case FILPBIT_FINFO :
+ change_mdate = 1;
+ memcpy(finder_buf, buf, 32 );
+ buf += 32;
+ break;
+ case FILPBIT_UNIXPR :
+ if (!vol_unix_priv(vol)) {
+ /* this volume doesn't use unix priv */
+ err = AFPERR_BITMAP;
+ bitmap = 0;
+ break;
+ }
+ change_mdate = 1;
+ change_parent_mdate = 1;
+
+ memcpy( &aint, buf, sizeof( aint ));
+ f_uid = ntohl (aint);
+ buf += sizeof( aint );
+ memcpy( &aint, buf, sizeof( aint ));
+ f_gid = ntohl (aint);
+ buf += sizeof( aint );
+ setfilowner(vol, f_uid, f_gid, path);
+
+ memcpy( &upriv, buf, sizeof( upriv ));
+ buf += sizeof( upriv );
+ upriv = ntohl (upriv);
+ if ((upriv & S_IWUSR)) {
+ setfilunixmode(vol, path, upriv);
+ }
+ else {
+ /* do it later */
+ upriv_bit = 1;
+ }
+ break;
+ case FILPBIT_PDINFO :
+ if (afp_version < 30) { /* else it's UTF8 name */
+ achar = *buf;
+ buf += 2;
+ /* Keep special case to support crlf translations */
+ if ((unsigned int) achar == 0x04) {
+ fdType = (u_char *)"TEXT";
+ buf += 2;
+ } else {
+ xyy[0] = ( u_char ) 'p';
+ xyy[1] = achar;
+ xyy[3] = *buf++;
+ xyy[2] = *buf++;
+ fdType = xyy;
+ }
+ break;
+ }
+ /* fallthrough */
+ default :
+ err = AFPERR_BITMAP;
+ /* break while loop */
+ bitmap = 0;
+ break;
+ }
+
+ bitmap = bitmap>>1;
+ bit++;
+ }
+
+ /* second try with adouble open
+ */
+ if ( ad_open_metadata( upath, vol_noadouble(vol), O_CREAT, adp) < 0) {
+ LOG(log_debug, logtype_afpd, "setfilparams: ad_open_metadata error");
+ /*
+ * For some things, we don't need an adouble header:
+ * - change of modification date
+ * - UNIX privs (Bug-ID #2863424)
+ */
+ if ( (f_bitmap & ~(1<<FILPBIT_MDATE | 1<<FILPBIT_UNIXPR))) {
+ LOG(log_debug, logtype_afpd, "setfilparams: need adouble access");