As an experiment try setting /home/richard 755. You also might add calls to:
uid_t getuid(void); uid_t geteuid(void); gid_t getgid(void); gid_t getegid(void); just before the call to getcwd. The following should *not* be relevant, but circa 1998, Sun made a change such that getcwd would set errno even though the call succeeded. This broke code I'd written 6 years earlier that ran on AIX, Irix, Clix, Ultrix, HP-UX and Solaris and required no maintenance during that time. The friend who fixed it related this over lunch one day. His solution was to modify the failure test to check for a null pointer being returned instead of the traditional clearing and testing of errno that I used. Have Fun! Reg --- On Fri, 3/22/13, Richard PALO <[email protected]> wrote: > From: Richard PALO <[email protected]> > Subject: [discuss] getcwd on a nfs mounted home directory subdir > To: [email protected] > Date: Friday, March 22, 2013, 1:40 PM > scratching my head trying to debug an > issue with getcwd on an nfs mount, and I'm at a loss already > as to the failure case with the following butt-simple > program: > > > #include <unistd.h> > > #include <sys/param.h> > > #include <stdio.h> > > #include <errno.h> > > int main (void) > > { > > char cwd[MAXPATHLEN+1]; > > int errsv = 0; > > > > if (getcwd(cwd, sizeof(cwd)) == > NULL) > > { > > errsv = errno; > > perror("pwd"); > > } > > else > > printf("Current > path is %s\n", cwd); > > return errsv; > > } > > ============================== > > > > richard@omni1:~/src/tcov$ ./a.out > > Current path is /home/richard/src/tcov > ok > > > richard@omni1:~/src/tcov$ sudo ./a.out > > Current path is /home/richard/src/tcov > ok > > > richard@omni1:~/src/tcov$ pfexec ./a.out > > Current path is /home/richard/src/tcov > ok > > > richard@omni1:~/src/tcov$ truss ./a.out > > execve("a.out", 0x08047D44, 0x08047D4C) argc = 1 > > sysinfo(SI_MACHINE, "i86pc", 257) > = 6 > > mmap(0x00000000, 32, PROT_READ|PROT_WRITE|PROT_EXEC, > MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFEFB0000 > > mmap(0x00000000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, > MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFEFA0000 > > mmap(0x00000000, 4096, PROT_READ|PROT_WRITE, > MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFEF90000 > > mmap(0x00000000, 4096, PROT_READ|PROT_WRITE, > MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFEF80000 > > memcntl(0xFEFB6000, 47484, MC_ADVISE, MADV_WILLNEED, 0, > 0) = 0 > > memcntl(0x08050000, 2880, MC_ADVISE, MADV_WILLNEED, 0, > 0) = 0 > > resolvepath("/usr/lib/ld.so.1", "/lib/ld.so.1", 1023) = > 12 > > getcwd("/home/richard/src/tcov", > 1017) = 0 > > resolvepath("/home/richard/src/tcov/a.out", > "/home/richard/src/tcov/a.out", 1023) = 28 > > stat64("/home/richard/src/tcov/a.out", 0x080479D8) = 0 > > open("/var/ld/ld.config", O_RDONLY) > Err#2 ENOENT > > sysconfig(_CONFIG_PAGESIZE) > = 4096 > > stat64("/lib/libc.so.1", 0x080471F8) > = 0 > > resolvepath("/lib/libc.so.1", "/lib/libc.so.1", 1023) = > 14 > > open("/lib/libc.so.1", O_RDONLY) > = 3 > > mmapobj(3, MMOBJ_INTERPRET, 0xFEFA0A28, 0x08047264, > 0x00000000) = 0 > > close(3) > = > 0 > > memcntl(0xFEE30000, 244408, MC_ADVISE, MADV_WILLNEED, > 0, 0) = 0 > > mmap(0x00000000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, > MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFEE20000 > > mmap(0x00010000, 24576, PROT_READ|PROT_WRITE|PROT_EXEC, > MAP_PRIVATE|MAP_ANON|MAP_ALIGN, -1, 0) = 0xFEE10000 > > getcontext(0x08047818) > > getrlimit(RLIMIT_STACK, 0x08047810) > = 0 > > getpid() > = > 1157 [1156] > > lwp_private(0, 1, 0xFEE12A40) > = 0x000001C3 > > setustack(0xFEE12AA0) > > sysi86(SI86FPSTART, 0xFEF7CF8C, 0x0000133F, 0x00001F80) > = 0x00000001 > > getcwd("/home/richard/src/tcov", > 1025) = 0 > > ioctl(1, TCGETA, 0x08046A3E) > = 0 > > fstat64(1, 0x08046980) > = > 0 > > Current path is /home/richard/src/tcov > > write(1, " C u r r e n t p a t h".., > 39) = 39 > > _exit(0) > > ok > > > richard@omni1:~/src/tcov$ sudo truss ./a.out > > execve("a.out", 0x08047E10, 0x08047E18) argc = 1 > > sysinfo(SI_MACHINE, "i86pc", 257) > = 6 > > mmap(0x00000000, 32, PROT_READ|PROT_WRITE|PROT_EXEC, > MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFEFB0000 > > mmap(0x00000000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, > MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFEFA0000 > > mmap(0x00000000, 4096, PROT_READ|PROT_WRITE, > MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFEF90000 > > mmap(0x00000000, 4096, PROT_READ|PROT_WRITE, > MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFEF80000 > > memcntl(0xFEFB6000, 47484, MC_ADVISE, MADV_WILLNEED, 0, > 0) = 0 > > memcntl(0x08050000, 2880, MC_ADVISE, MADV_WILLNEED, 0, > 0) = 0 > > resolvepath("/usr/lib/ld.so.1", "/lib/ld.so.1", 1023) = > 12 > > getcwd("/home/richard/src/tcov", > 1017) = 0 > > resolvepath("/home/richard/src/tcov/a.out", > "/home/richard/src/tcov/a.out", 1023) = 28 > > stat64("/home/richard/src/tcov/a.out", 0x08047AA4) = 0 > > open("/var/ld/ld.config", O_RDONLY) > Err#2 ENOENT > > sysconfig(_CONFIG_PAGESIZE) > = 4096 > > stat64("/lib/libc.so.1", 0x080472C4) > = 0 > > resolvepath("/lib/libc.so.1", "/lib/libc.so.1", 1023) = > 14 > > open("/lib/libc.so.1", O_RDONLY) > = 3 > > mmapobj(3, MMOBJ_INTERPRET, 0xFEFA0A28, 0x08047330, > 0x00000000) = 0 > > close(3) > = > 0 > > memcntl(0xFEE30000, 244408, MC_ADVISE, MADV_WILLNEED, > 0, 0) = 0 > > mmap(0x00000000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, > MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFEE20000 > > mmap(0x00010000, 24576, PROT_READ|PROT_WRITE|PROT_EXEC, > MAP_PRIVATE|MAP_ANON|MAP_ALIGN, -1, 0) = 0xFEE10000 > > getcontext(0x080478E4) > > getrlimit(RLIMIT_STACK, 0x080478DC) > = 0 > > getpid() > = > 1162 [1161] > > lwp_private(0, 1, 0xFEE12A40) > = 0x000001C3 > > setustack(0xFEE12AA0) > > sysi86(SI86FPSTART, 0xFEF7CF8C, 0x0000133F, 0x00001F80) > = 0x00000001 > > getcwd("/home/richard/src/tcov", > 1025) = 0 > > ioctl(1, TCGETA, 0x08046B0E) > = 0 > > fstat64(1, 0x08046A50) > = > 0 > > Current path is /home/richard/src/tcov > > write(1, " C u r r e n t p a t h".., > 39) = 39 > > _exit(0) > > ok > > > richard@omni1:~/src/tcov$ pfexec truss ./a.out > > execve("a.out", 0x08047D44, 0x08047D4C) argc = 1 > > sysinfo(SI_MACHINE, "i86pc", 257) > = 6 > > mmap(0x00000000, 32, PROT_READ|PROT_WRITE|PROT_EXEC, > MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFEFB0000 > > mmap(0x00000000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, > MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFEFA0000 > > mmap(0x00000000, 4096, PROT_READ|PROT_WRITE, > MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFEF90000 > > mmap(0x00000000, 4096, PROT_READ|PROT_WRITE, > MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFEF80000 > > memcntl(0xFEFB6000, 47484, MC_ADVISE, MADV_WILLNEED, 0, > 0) = 0 > > memcntl(0x08050000, 2880, MC_ADVISE, MADV_WILLNEED, 0, > 0) = 0 > > resolvepath("/usr/lib/ld.so.1", "/lib/ld.so.1", 1023) = > 12 > > > getcwd(0x08047658, 1017) > Err#13 EACCES > > > resolvepath("a.out", "a.out", 1023) > = 5 > > sysconfig(_CONFIG_PAGESIZE) > = 4096 > > stat64("a.out", 0x080479D8) > = 0 > > open("/var/ld/ld.config", O_RDONLY) > Err#2 ENOENT > > stat64("/lib/libc.so.1", 0x080471F8) > = 0 > > resolvepath("/lib/libc.so.1", "/lib/libc.so.1", 1023) = > 14 > > open("/lib/libc.so.1", O_RDONLY) > = 3 > > mmapobj(3, MMOBJ_INTERPRET, 0xFEFA0A28, 0x08047264, > 0x00000000) = 0 > > close(3) > = > 0 > > memcntl(0xFEE30000, 244408, MC_ADVISE, MADV_WILLNEED, > 0, 0) = 0 > > mmap(0x00000000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, > MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFEE20000 > > mmap(0x00010000, 24576, PROT_READ|PROT_WRITE|PROT_EXEC, > MAP_PRIVATE|MAP_ANON|MAP_ALIGN, -1, 0) = 0xFEE10000 > > getcontext(0x08047818) > > getrlimit(RLIMIT_STACK, 0x08047810) > = 0 > > getpid() > = > 1166 [1165] > > lwp_private(0, 1, 0xFEE12A40) > = 0x000001C3 > > setustack(0xFEE12AA0) > > sysi86(SI86FPSTART, 0xFEF7CF8C, 0x0000133F, 0x00001F80) > = 0x00000001 > > > getcwd(0x0804790B, 1025) > Err#13 EACCES > > > brk(0x080611C0) > = > 0 > > brk(0x080631C0) > = > 0 > > pwdwrite(2, " p w d", 3) > = > 3 > > : write(2, " : ", 2) > = > 2 > > Permission deniedwrite(2, " P e r m i s s i o > n d".., 17) = 17 > > > > write(2, "\n", 1) > = 1 > > _exit(13) > > WTF? there must be some insidious reason to this. > > pfexec seems to use the short path, and sudo the full > path... > > the nfs environment > simple /etc/auto_home containing the following extract > > richard > x3200:/dpool/export/home/& > > extract from mount > > /home/richard on x3200:/dpool/export/home/richard > remote/read/write/setuid/devices/xattr/dev=8600001 on ven. > mars 22 18:03:00 2013 > > /home/richard/src on > x3200:/dpool/export/home/richard/src > remote/read/write/setuid/devices/xattr/dev=8600003 on ven. > mars 22 18:41:41 2013 > from /etc/user_attr > > richard::::type=normal;profiles=Primary Administrator > > root is NOT a role but still a normal account. > /etc/security/exec_attr is stock standard with Primary > Administrator having > > Primary Administrator:solaris:cmd:::*:uid=0;gid=0 > > and > > richard@omni1:~/src/tcov$ df -gh . > > Filesystem > Size Used Available > Capacity Mounted on > > x3200:/dpool/export/home/richard/src > > > 190G 17G > 174G > 9% /home/richard/src > > richard@omni1:~/src/tcov$ ls -lahd /home /home/richard > /home/richard/src > > dr-xr-xr-x 2 root > root > 2 mars 22 17:53 /home/ > > drwxr-x--x 90 richard staff > 314 mars 22 18:44 /home/richard/ > > drwxrwxrwx 48 richard staff > 73 mars 17 09:59 > /home/richard/src/ > > > is this because Primary Administrator is really not enough > for this operation? if so, why? what profile > specifically needs to be added? > > > > ------------------------------------------- > illumos-discuss > Archives: https://www.listbox.com/member/archive/182180/=now > RSS Feed: https://www.listbox.com/member/archive/rss/182180/23998448-902cecc3 > Modify Your Subscription: https://www.listbox.com/member/?& > Powered by Listbox: http://www.listbox.com > ------------------------------------------- illumos-discuss Archives: https://www.listbox.com/member/archive/182180/=now RSS Feed: https://www.listbox.com/member/archive/rss/182180/21175430-2e6923be Modify Your Subscription: https://www.listbox.com/member/?member_id=21175430&id_secret=21175430-6a77cda4 Powered by Listbox: http://www.listbox.com
