lew@gsg.UUCP (Paul Lew) (02/19/88)
Index: v13i048 (Resource allocation program) Description: 'With' will change file mode, group ID, and user ID to that of the user. At end, it will set file mode to read only by root, group ID to 3. This may confuse users who do not know about 'with' and found out he could not open the device after some one just finish using 'with'. This patch will save the original mode, gid, uid and restore them when 'with' terminates. Repeat-by: > ls -l /dev/rmt0 crw-rw-rw- 1 root 16, 0 Nov 11 11:37 /dev/rmt0 > with tape > ..... > ^D > ls -l /dev/rmt0 crw------- 1 root 16, 0 Nov 11 11:37 /dev/rmt0 Fix: *** with.c.old Thu Feb 18 23:17:37 1988 --- with.c Thu Feb 18 23:20:27 1988 *************** *** 12,17 **** --- 12,20 ---- * /usr/spool/uucp/LCK..cul0 cul0 /dev/cul0 * * $Log: with.c,v $ + * Revision 2.0.1.1 88/02/18 22:14:28 lew + * save device mode, uid, gid before with and restore at end + * * Revision 2.0 87/10/26 09:32:15 cudcv * "Stable" * *************** *** 52,58 **** * Initial revision * */ ! static char RCSid[] = "$Header: with.c,v 2.0 87/10/26 09:32:15 cudcv Exp $"; #include <ctype.h> #include <pwd.h> #include <signal.h> --- 55,61 ---- * Initial revision * */ ! static char RCSid[] = "$Header: with.c,v 2.0.1.1 88/02/18 22:14:28 lew Exp $"; #include <ctype.h> #include <pwd.h> #include <signal.h> *************** *** 124,129 **** --- 127,138 ---- void print_locks(); + struct { + u_short sv_mode; /* mode */ + short sv_uid; /* user ID of owner */ + short sv_gid; /* group ID of owner */ + } saved_id [MAXPDEV]; + main(argc,argv) int argc; char *argv[]; *************** *** 257,262 **** --- 266,272 ---- (void) ftruncate(lockfile, sizeof(int) + PW_NAMEL); lkp->locked++; for(pdev = 0;pdev < MAXPDEV && (*subdev(lkp,pdev));pdev++){ + save_id (subdev(lkp,pdev), pdev); (void) chown( subdev(lkp,pdev),uuid,ugid ); (void) chmod( subdev(lkp,pdev),OWNERONLY); } *************** *** 471,478 **** register int pdev; for(pdev = 0;pdev < MAXPDEV && (*subdev(lkp,pdev));pdev++){ ! (void) chown( subdev(lkp,pdev),Rootuid,Rootgid ); ! (void) chmod( subdev(lkp,pdev),OWNERONLY); } } --- 481,489 ---- register int pdev; for(pdev = 0;pdev < MAXPDEV && (*subdev(lkp,pdev));pdev++){ ! (void) chown( subdev(lkp,pdev), ! saved_id[pdev].sv_uid, saved_id[pdev].sv_gid); ! (void) chmod( subdev(lkp,pdev), saved_id[pdev].sv_mode); } } *************** *** 513,516 **** --- 524,539 ---- if (!resource) (void) unlink(nolok.lok); exit(sig ? -1 : nerrs); + } + + save_id (fname, idx) + char *fname; /* filename */ + int idx; /* index to saved_id structure */ + { + struct stat statbuf; + + stat (fname, &statbuf); + saved_id[idx].sv_mode = statbuf.st_mode; + saved_id[idx].sv_uid = statbuf.st_uid; + saved_id[idx].sv_gid = statbuf.st_gid; } -- Paul Lew {oliveb,harvard,decvax}!gsg!lew (UUCP) General Systems Group, 5 Manor Parkway, Salem, NH 03079 (603) 893-1000