[Forwarding email since somehow the ast-developers@ list has issues with postings from Olga's address... ;-( ] ---------- Forwarded message ---------- From: ольга крыжановская <olga.kryzhanov...@gmail.com> Date: Wed, Aug 29, 2012 at 7:36 AM Subject: Fwd: Per thread open(), stat(), rename() and so on, and *at() API To: Roland Mainz <roland.ma...@nrubsig.org>
Wenn du wach bist schick es bitte nochmal an ast-developers@research.att.com. Meine mail ist im spam-filter hangengeblieben. ---------- Forwarded message ---------- From: ольга крыжановская <olga.kryzhanov...@gmail.com> Date: Wed, Aug 29, 2012 at 6:54 AM Subject: Per thread open(), stat(), rename() and so on, and *at() API To: Glenn Fowler <g...@research.att.com>, David Korn <d...@research.att.com>, Phong Vo <k...@research.att.com> Cc: ast-developers@research.att.com Glenn, I have an alternative for your per thread open(), stat(), rename() and so on API plans: Instead of creating AST wrapper code for open(), stat(), rename() and so we could use the following macros, defined in <ast/fcntl.h>: ------------------cutme------------------------ #define unlink(path) unlinkat(AST_GET_CURRENT_THREAD_CWD_FD(), (path), 0) #define rmdir(path) unlinkat(AST_GET_CURRENT_THREAD_CWD_FD(), (path), AT_REMOVEDIR) #define chown(path, uid, gid) fchownat(AST_GET_CURRENT_THREAD_CWD_FD(), (path), (uid), (gid), 0) #define lchown(path, uid, gid) fchownat(AST_GET_CURRENT_THREAD_CWD_FD(), (path), (uid), (gid), AT_SYMLINK_NOFOLLOW) #define stat(path, sb) fstatat(AST_GET_CURRENT_THREAD_CWD_FD(), (path), (sb), 0) #define lstat(path, sb) fstatat(AST_GET_CURRENT_THREAD_CWD_FD(), (path), (sb), AT_SYMLINK_NOFOLLOW) #define rename(oldname, newname) renameat(AST_GET_CURRENT_THREAD_CWD_FD(), (oldname), AST_GET_CURRENT_THREAD_CWD_FD(), (newname)) #define access(path, amode) faccessat(AST_GET_CURRENT_THREAD_CWD_FD(), (path), (amode), 0) #define eaccess(path, amode) faccessat(AST_GET_CURRENT_THREAD_CWD_FD(), (path), (amode), AT_EACCESS) #define mkdir(path, amode) mkdirat(AST_GET_CURRENT_THREAD_CWD_FD(), (path), (amode)) #define mkfifo(path, amode) mkfifoat(AST_GET_CURRENT_THREAD_CWD_FD(), (path), (amode)) #define mknod(path, amode, adev) mknodat(AST_GET_CURRENT_THREAD_CWD_FD(), (path), (amode), (adev)) #define readlink(path, buf, bufsize) readlinkat(AST_GET_CURRENT_THREAD_CWD_FD(), (path), (buf), (bufsize)) #define symlink(oldpath, newpath) symlinkat((oldpath), AST_GET_CURRENT_THREAD_CWD_FD(), (newpath)) ------------------cutme------------------------ AST_GET_CURRENT_THREAD_CWD_FD() would be defined to be a preprocessor macro, which will be a function returning the current thread's cwd fd; if there is none allocated for this thread yet it will be done by within that function, using open(".", O_search). However, consumers of the <ast/fcntl.h> header are _free_ to redefine this macro, for example src/cmd/ksh93/include/defs.h could define AST_GET_CURRENT_THREAD_CWD_FD() as #define AST_GET_CURRENT_THREAD_CWD_FD() (shp->pwdfd) This would, at least, save the function call overhead, and finally make use of (shp->pwdfd) as it was intended. What do you think? It would make things easier for you to implement, i.e. you only have to implement the per thread AST_GET_CURRENT_THREAD_CWD_FD(), and applications are free to use the *at() API if they wish to. Olga -- , _ _ , { \/`o;====- Olga Kryzhanovska -====;o`\/ } .----'-/`-/ olga.kryzhanov...@gmail.com \-`\-'----. `'-..-| / http://twitter.com/fleyta \ |-..-'` /\/\ Solaris/BSD//C/C++ programmer /\/\ `--` `--` -- , _ _ , { \/`o;====- Olga Kryzhanovska -====;o`\/ } .----'-/`-/ olga.kryzhanov...@gmail.com \-`\-'----. `'-..-| / http://twitter.com/fleyta \ |-..-'` /\/\ Solaris/BSD//C/C++ programmer /\/\ `--` `--` -- __ . . __ (o.\ \/ /.o) roland.ma...@nrubsig.org \__\/\/__/ MPEG specialist, C&&JAVA&&Sun&&Unix programmer /O /==\ O\ TEL +49 641 3992797 (;O/ \/ \O;) _______________________________________________ ast-developers mailing list ast-developers@research.att.com https://mailman.research.att.com/mailman/listinfo/ast-developers