cck@CUNIXC.COLUMBIA.EDU.UUCP (10/30/87)
Two more bug reports. The first is fairly low priority. The second
is of medium impact.
Charlie C. Kim
User Services
Columbia University
*******************************************************************************
CAP Pre-Release Distribution 4.00 with Patches 5,6,7
Bug Report: 0010
Date: Oct 1, 1987
Problem: Volume space usage data is wrong for the first 3 seconds or so after
a volume is mounted. Only affects "System" volumes.
Reported by: Rob Cartolano
Priority: Low
Diagnosis: Systems volumes are scanned by server on startup. This includes
getting disk space info, etc. This may well change between
Aufs startup and the time the "child" forks off. In fact, the
latency here may be days!
Solution: The fix is to make openvol get the volume information
again. Here's the fix along with some cleanup.
%%%START OF PATCH%%%
*** /tmp/,RCSt1019604 Tue Oct 13 09:11:08 1987
--- afpvols.c Wed Oct 7 14:09:59 1987
***************
*** 1,7
/*
! * $Author: cck $ $Date: 87/09/06 16:52:26 $
! * $Header: afpvols.c,v 1.17 87/09/06 16:52:26 cck Exp $
! * $Revision: 1.17 $
*/
/*
--- 1,7 -----
/*
! * $Author: cck $ $Date: 87/10/07 14:09:44 $
! * $Header: afpvols.c,v 1.18 87/10/07 14:09:44 cck Exp $
! * $Revision: 1.18 $
*/
/*
***************
*** 351,356
OpenVolPkt ovl;
char pwd[MAXPASSWD+1]; /* null terminated password */
int v;
ovl.ovl_pass[0] = '\0'; /* zero optional password */
ntohPackX(PsOpenVol,p,l,(byte *) &ovl); /* decode packet */
--- 351,358 -----
OpenVolPkt ovl;
char pwd[MAXPASSWD+1]; /* null terminated password */
int v;
+ OSErr err;
+ VolPtr vp;
ovl.ovl_pass[0] = '\0'; /* zero optional password */
ntohPackX(PsOpenVol,p,l,(byte *) &ovl); /* decode packet */
***************
*** 368,375
if (v >= VolCnt) /* did we find a vol in the scan? */
return(aeParamErr); /* no... unknown volume name */
! if (*VolTbl[v]->v_pwd != '\0') /* password exists on volume? */
! if (strcmp(VolTbl[v]->v_pwd,pwd) != 0) /* yes, check for match */
return(aeAccessDenied); /* not the same... return failure */
if (DBVOL)
--- 370,378 -----
if (v >= VolCnt) /* did we find a vol in the scan? */
return(aeParamErr); /* no... unknown volume name */
! vp = VolTbl[v]; /* dereference */
! if (*vp->v_pwd != '\0') /* password exists on volume? */
! if (strcmp(vp->v_pwd,pwd) != 0) /* yes, check for match */
return(aeAccessDenied); /* not the same... return failure */
if (DBVOL)
***************
*** 373,380
return(aeAccessDenied); /* not the same... return failure */
if (DBVOL)
! printf("FPOpenVol: name=%s volid=%d\n",
! VolTbl[v]->v_name,VolTbl[v]->v_volid);
VolTbl[v]->v_mounted = TRUE; /* now it is opened... */
--- 376,382 -----
return(aeAccessDenied); /* not the same... return failure */
if (DBVOL)
! printf("FPOpenVol: name=%s volid=%d\n", vp->v_name,vp->v_volid);
vp->v_mounted = TRUE; /* now it is opened... */
***************
*** 376,382
printf("FPOpenVol: name=%s volid=%d\n",
VolTbl[v]->v_name,VolTbl[v]->v_volid);
! VolTbl[v]->v_mounted = TRUE; /* now it is opened... */
VolTbl[v]->v_bitmap = ovl.ovl_bitmap; /* bitmap for packing result */
--- 378,384 -----
if (DBVOL)
printf("FPOpenVol: name=%s volid=%d\n", vp->v_name,vp->v_volid);
! vp->v_mounted = TRUE; /* now it is opened... */
/* update volume info */
if ((err = OSVolInfo(vp->v_path,vp,VP_ALL)) != noErr)
***************
*** 378,384
VolTbl[v]->v_mounted = TRUE; /* now it is opened... */
! VolTbl[v]->v_bitmap = ovl.ovl_bitmap; /* bitmap for packing result */
*rl = htonPackX(VolPackR,(byte *) VolTbl[v],r);
return(noErr); /* return ok */
--- 380,388 -----
vp->v_mounted = TRUE; /* now it is opened... */
! /* update volume info */
! if ((err = OSVolInfo(vp->v_path,vp,VP_ALL)) != noErr)
! return(err);
vp->v_bitmap = ovl.ovl_bitmap; /* bitmap for packing result */
***************
*** 380,386
VolTbl[v]->v_bitmap = ovl.ovl_bitmap; /* bitmap for packing result */
! *rl = htonPackX(VolPackR,(byte *) VolTbl[v],r);
return(noErr); /* return ok */
}
--- 384,392 -----
if ((err = OSVolInfo(vp->v_path,vp,VP_ALL)) != noErr)
return(err);
! vp->v_bitmap = ovl.ovl_bitmap; /* bitmap for packing result */
!
! *rl = htonPackX(VolPackR,(byte *) vp,r);
return(noErr); /* return ok */
}
%%%END OF PATCH%%%
*******************************************************************************
CAP Pre-Release Distribution 4.00 with Patches 5,6,7
Bug Report: 0011
Date: Oct 21, 1987
Problem: "Change Priviledges" changes the protection of the data
files, the .finderinfo file for the directory, and the protections on
the directory and its .finderinfo and .resource directories, but not
the finderinfo and resource files. This is a problem!
Reported by: Rob Cartolano, User Services, Columbia U.
Priority: Medium
Diagnosis: Awk! I messed up Bill's code (or it was never right in the
first place :-)
Solution: Apply the following patch:
%%% START OF PATCH %%%
*** /tmp/,RCSt1004901 Wed Oct 21 14:06:27 1987
--- afpos.c Wed Oct 21 14:05:18 1987
***************
*** 122,127
private OSErr unix_chown(),unix_chmod(),unix_stat();
private OSErr ItoEErr();
/*
* OwnerID = 0 means that the folder is "unowned" or owned by
* <any user>. The owner bit of the User Rights summary is always
--- 122,129 -----
private OSErr unix_chown(),unix_chmod(),unix_stat();
private OSErr ItoEErr();
+ private void os_chmod_all();
+
/*
* OwnerID = 0 means that the folder is "unowned" or owned by
* <any user>. The owner bit of the User Rights summary is always
***************
*** 1184,1189
if ((err = os_chmod(ipdir,fn,acc,F_DATA)) != noErr)
return(err);
if ((err = os_chmod(ipdir,fn,acc,F_RSRC)) != noErr &&
err != aeObjectNotFound)
return(err);
--- 1186,1194 -----
if ((err = os_chmod(ipdir,fn,acc,F_DATA)) != noErr)
return(err);
+ os_chmod_all(ipdir, fn, acc, F_DATA); /* change all file protections */
+ os_chmod_all(ipdir, fn, acc, F_RSRC);
+ os_chmod_all(ipdir, fn, acc, F_FNDR);
if ((err = os_chmod(ipdir,fn,acc,F_RSRC)) != noErr &&
err != aeObjectNotFound)
return(err);
***************
*** 1224,1232
* Directory id (idir), and type (typ) specify a directory name.
* Internal access bits are mode.
*
! * Change the protection of the directory to eacc. Also since
! * unix has file protection and AFP does not, change the protection
! * of each file in the directory as well.
*
* Do not change the protection of directories contained within
* the directory...
--- 1229,1235 -----
* Directory id (idir), and type (typ) specify a directory name.
* Internal access bits are mode.
*
! * Change the protection of the directory to eacc.
*
*/
private OSErr
***************
*** 1228,1236
* unix has file protection and AFP does not, change the protection
* of each file in the directory as well.
*
- * Do not change the protection of directories contained within
- * the directory...
- *
*/
private OSErr
os_chmod(idir,fn,mode,typ)
--- 1231,1236 -----
*
* Change the protection of the directory to eacc.
*
*/
private OSErr
os_chmod(idir,fn,mode,typ)
***************
*** 1240,1250
int typ;
{
char path[MAXPATHLEN];
! struct timeval ut[2];
! struct stat stb;
! struct direct *dp;
! DIR *dirp;
! int pl,err;
OSfname(path,idir,fn,typ); /* convert unix name */
if (DBOSI)
--- 1240,1246 -----
int typ;
{
char path[MAXPATHLEN];
! int err;
OSfname(path,idir,fn,typ); /* convert unix name */
if (DBOSI)
***************
*** 1254,1266
if (err != noErr)
return(err);
- #ifdef notdef
- time(&ut[0]); /* set mod time for dir */
- ut[1] = ut[0];
- if (utimes(path,&ut[0]) != 0)
- if (DBOSI)
- printf("os_chmod: utimes failed %s\n",syserr());
- #endif
EModified(idir);
dirp = opendir(path);
--- 1250,1255 -----
if (err != noErr)
return(err);
EModified(idir);
return(noErr);
}
***************
*** 1262,1267
printf("os_chmod: utimes failed %s\n",syserr());
#endif
EModified(idir);
dirp = opendir(path);
if (dirp == NULL) {
--- 1251,1258 -----
return(err);
EModified(idir);
+ return(noErr);
+ }
/*
* Change file protection for all files in directory
***************
*** 1263,1268
#endif
EModified(idir);
dirp = opendir(path);
if (dirp == NULL) {
if (DBOSI)
--- 1254,1300 -----
return(noErr);
}
+ /*
+ * Change file protection for all files in directory
+ *
+ * Have to do because:
+ * unix has file protection and AFP does not, change the protection
+ * of each file in the directory as well.
+ *
+ * Do not change the protection of directories contained within
+ * the directory...
+ *
+ */
+ private void
+ os_chmod_all(idir,fn,mode,typ)
+ IDirP idir;
+ char *fn;
+ u_short mode;
+ int typ;
+ {
+ char path[MAXPATHLEN];
+ struct stat stb;
+ struct direct *dp;
+ DIR *dirp;
+ int pl,err;
+
+ OSfname(path,idir,fn,F_DATA); /* convert unix name */
+ pl = strlen(path);
+ switch (typ) {
+ case F_DATA:
+ break;
+ case F_RSRC:
+ path[pl] = '/';
+ strcpy(path+pl+1, RFDIRFN);
+ break;
+ case F_FNDR:
+ path[pl] = '/';
+ strcpy(path+pl+1, FIDIRFN);
+ break;
+ }
+ if (DBOSI)
+ printf("os_chmod: setting %o for %s\n",mode,path);
+
dirp = opendir(path);
if (dirp == NULL) {
if (DBOSI)
***************
*** 1267,1273
if (dirp == NULL) {
if (DBOSI)
printf("os_chmod: opendir failed on %s\n",path);
! return(aeObjectNotFound); /* screwy */
}
pl = strlen(path); /* length of the path */
--- 1299,1305 -----
if (dirp == NULL) {
if (DBOSI)
printf("os_chmod: opendir failed on %s\n",path);
! return;
}
pl = strlen(path); /* length of the path */
***************
*** 1283,1289
if (dp->d_name[0] != '.')
continue;
/* if not .resource or .finderinfo then skip */
! if (strcmp(dp->d_name,RFDIRFN) != 0 && strcmp(dp->d_name, FIDIRFN) != 0)
continue;
}
err = unix_chmod(path,mode); /* set the mode for this file */
--- 1315,1322 -----
if (dp->d_name[0] != '.')
continue;
/* if not .resource or .finderinfo then skip */
! if (typ != F_DATA &&
! strcmp(dp->d_name,RFDIRFN) != 0 && strcmp(dp->d_name, FIDIRFN) != 0)
continue;
}
err = unix_chmod(path,mode); /* set the mode for this file */
***************
*** 1287,1293
continue;
}
err = unix_chmod(path,mode); /* set the mode for this file */
- #ifdef notdef
/* ignore errors */
if (err != noErr) /* and if error, then stop */
break;
--- 1320,1325 -----
continue;
}
err = unix_chmod(path,mode); /* set the mode for this file */
/* ignore errors */
}
closedir(dirp); /* close the directory */
***************
*** 1289,1297
err = unix_chmod(path,mode); /* set the mode for this file */
#ifdef notdef
/* ignore errors */
- if (err != noErr) /* and if error, then stop */
- break;
- #endif
}
closedir(dirp); /* close the directory */
return(err); /* return the last error */
--- 1321,1326 -----
}
err = unix_chmod(path,mode); /* set the mode for this file */
/* ignore errors */
}
closedir(dirp); /* close the directory */
}
***************
*** 1294,1300
#endif
}
closedir(dirp); /* close the directory */
- return(err); /* return the last error */
}
--- 1323,1328 -----
/* ignore errors */
}
closedir(dirp); /* close the directory */
}
%%% END OF PATCH %%%
*******************************************************************************