mjk@trout.rice.edu (Mark J. Kilgard) (02/09/89)
The automount feature of Sun OS 4.O is an incrediably nice feature but it
has the annoying side effect of blurring what your current working
directory is. Example:
uncle-bens:/marsh/mjk#1 -> pwd
/tmp_mnt/auto274a00144/mjk
It kind of makes it hard to know where you are.
The following short program will return the "real" path name when you use
automounts:
/*
* realpwd - returns the "real" name of a directory even when
* obscurred by automounting
*
* by Mark Kilgard
* 1/29/88
*/
#include <stdio.h>
#include <mntent.h>
#include <sys/param.h>
#include <string.h>
#define TMP_MNT_PREFIX "/tmp_mnt/"
#define MTAB "/etc/mtab"
char* real_getwd()
{
static char cwd[MAXPATHLEN];
char mnt_prefix[MAXPATHLEN];
char mnt_suffix[MAXPATHLEN];
int i;
int j;
char* ptr;
FILE* mtab;
struct mntent* mount;
getwd(cwd);
if(!strncmp(cwd,TMP_MNT_PREFIX,sizeof(TMP_MNT_PREFIX)-1)) {
mtab=setmntent(MTAB,"r");
if(mtab==NULL) {
return(cwd);
}
mnt_prefix[0]='/';
i=1;
while(cwd[i]!='/') {
mnt_prefix[i]=cwd[i];
i++;
}
mnt_prefix[i]='/';
i++;
while(cwd[i]!='/' && cwd[i]!='\0') {
mnt_prefix[i]=cwd[i];
i++;
}
mnt_prefix[i]='\0';
j=0;
while(cwd[i]!='\0') {
mnt_suffix[j]=cwd[i];
i++;
j++;
}
mnt_suffix[j]='\0';
while((mount=getmntent(mtab))!=NULL) {
if(!strcmp(mount->mnt_dir,mnt_prefix)) {
ptr=strrchr(mount->mnt_fsname,':');
if(ptr==NULL) {
return(cwd);
}
ptr++;
strcpy(mnt_prefix,ptr);
strcat(mnt_prefix,mnt_suffix);
return(mnt_prefix);
}
}
return(cwd);
}
return(cwd);
}
main()
{
printf("%s\n",real_getwd());
}
Extracting the routine may be useful. Realize the routine stores the
result in a static area for each call. Essentially the routine does a
lookup in /etc/mtab.
- Mark Kilgard <mjk@rice.edu>ekrell@ulysses.att.com (02/15/89)
In ksh, pwd is a builtin which returns the "logical" name of the current
working directory, so if you "cd /foo/bar", pwd always returns "/foo/bar",
even if you're in a different place as a consequence of following symbolic
links or other such wierdness.
Eduardo Krell AT&T Bell Laboratories, Murray Hill, NJ
UUCP: {att,decvax,ucbvax}!ulysses!ekrell Internet: ekrell@ulysses.att.comlmb@vicom.com (Larry Blair) (02/23/89)
ekrell@ulysses.att.com writes: >In ksh, pwd is a builtin which returns the "logical" name of the current >working directory, so if you "cd /foo/bar", pwd always returns "/foo/bar", >even if you're in a different place as a consequence of following symbolic >links or other such wierdness. when I used csh, I used to have a "cwd", which just did a "echo $cwd". That way I could get both the logical and physical current directory. When I changed to ksh, I wanted to retain this functionality, so I put the following in the .kshrc: alias cwd='print - ~+' unalias pwd Now "pwd" and "cwd" work like they did for csh. -- Larry Blair ames!vsi1!lmb lmb@vicom.com
brent%terra@sun.com (Brent Callaghan) (02/28/89)
In article <8902090049.AA21344@hector.homer.nj.att.com>, ekrell@ulysses.att.com writes: > In ksh, pwd is a builtin which returns the "logical" name of the current > working directory, so if you "cd /foo/bar", pwd always returns "/foo/bar", > even if you're in a different place as a consequence of following symbolic > links or other such wierdness. Just to follow up on Eduardo's comment: I automount my home directory. I'm a ksh user so I see what I expect to see when I do a pwd in my home directory "/home/sparky/brent". The C shell also maintains $PWD. You can get the same effect as the ksh builtin just by setting up pwd as an alias to echo $PWD. Just make sure that the csh hardpaths option isn't set (I don't think it is by default). The mount point names are a little more attractive if you use the 4.0.1 automounter. The "/tmp_mnt/autoa12345" mount points have been replaced by a scheme that gives you the same path except for a prepended "/tmp_mnt" e.g. a /bin/pwd of my home directory now gives "/tmp_mnt/home/sparky/brent". Made in New Zealand --> Brent Callaghan @ Sun Microsystems uucp: sun!bcallaghan phone: (415) 336 1051
stanonik@nprdc.navy.mil (Ron Stanonik) (04/05/89)
One quirk of automount using subdirectories seems to be that the /tmp_mnt mount point includes the full path, not just the parent. For example, we automount /usr/local using this map bin alpha:/usr/local:$ARCH/bin lib alpha:/usr/local:$ARCH/lib * alpha:/usr/local:& After referencing /usr/local/bin we find (using df) that alpha:/usr/local is mounted on /tmp_mnt/usr/local/bin, not on /tmp_mnt/usr/local. automount gets the symlinks correct, eg beta# ls -l /usr/local/bin lrwxrwxrwx 1 root /usr/local/bin -> /tmp_mnt/usr/local/bin/sun4/bin but it would be nice (from an admin/systemhack view) if the mount point was /tmp_mnt/usr/local. Maybe I'm doing something wrong? Thanks, Ron Stanonik stanonik@nprdc.navy.mil [[ The next message is a response to this one. --wnl ]]
brent@sun.com (Brent Callaghan) (04/05/89)
The symbolic links for the 4.0.1 automounter were made more attractive by attempting to recreate the original path, with the exception of "/tmp_mnt" stuck on the front. The 4.0 version used to invent disgusting pathnames via tmpnam(3). The symbolic links look pretty good for most mounts - except if you use the subdirectory feature in a map (i.e. a second colon). This feature allows the automounter to do the mount at a higher level and thus allow several map entries to share a common mount. One side effect of this shared mount point is that it's now impossible to build a completely satisfying symbolic link. The 4.0.1 automounter fudges a path by incorporating the key used in the first reference that caused the mount. This is best illustrated with an example: An automounter map to mount user's home directories. The map is looked up by loginname - not servername. brent sparky:/home/sparky:brent derek sparky:/home/sparky:derek cindy sparky:/home/sparky:cindy fred gurgle:/home/gurgle:fred I mount this map on /home thus: automount /home /etc/auto.home Then I do the following: $ ls -l /home/brent lrwxrwxrwx /home/brent -> /tmp_mnt/home/brent/brent $ ls -l /home/derek lrwxrwxrwx /home/derek -> /tmp_mnt/home/brent/derek $ ls -l /home/cindy lrwxrwxrwx /home/cindy -> /tmp_mnt/home/brent/cindy $ ls -l /home/fred lrwxrwxrwx /home/fred -> /tmp_mnt/home/fred/fred The symbolic links are all pointing to the right places, it's just that the names look a little weird. If you use this scheme for mounting your home directory you can "fix up" the name by having the shell keep track for you. Both the C shell an Korn shell keep the original path in $PWD. You can set up an alias so a "pwd" will echo $PWD. If you still don't like the idea of weird symbolic links, then just replace second colon in the map entry with a slash and put up with the overhead of extra mounting. The pathname will still be longer than you expect, but not quite so weird and unpredictable. Brent