This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch/ob] openat and friends for Cygwin


Hi,

I appied the below patch as obvious.  It adds definitions and declarations
for the openat family of functions, but only for Cygwin for now.

The patch also contains a single patch which affects all target, but is
obvious as well.  The declaration of readlink was not POSIX conformant.
It doesn't return int but ssize_t and the type of the forth parameter
(buflen) is not int but size_t.


Corinna


        * libc/include/stdio.h (renameat): Declare for Cygwin.
        (symlinkat): Ditto.
        * libc/include/sys/unistd.h (readlink): Align declaration to POSIX.
        (faccessat): Declare for Cygwin.
        (fchownat): Ditto.
        (linkat): Ditto.
        (readlinkat): Ditto.
        * libc/include/sys/_default_fcntl.h (AT_FDCWD): Define for Cygwin.
        (AT_EACCESS): Ditto.
        (AT_SYMLINK_NOFOLLOW): Ditto.
        (AT_SYMLINK_FOLLOW): Ditto.
        (AT_REMOVEDIR): Ditto.
        (futimesat): Declare for Cygwin.
        (openat): Ditto.
        (unlinkat): Ditto.
        * libc/include/sys/stat.h (fchmodat): Ditto.
        (fstatat): Ditto.
        (mkdirat): Ditto.
        (mkfifoat): Ditto.
        (mknodat): Ditto.


Index: libc/include/stdio.h
===================================================================
RCS file: /cvs/src/src/newlib/libc/include/stdio.h,v
retrieving revision 1.48
diff -u -p -r1.48 stdio.h
--- libc/include/stdio.h	2 Aug 2007 20:23:06 -0000	1.48
+++ libc/include/stdio.h	23 Apr 2008 11:06:12 -0000
@@ -339,7 +339,10 @@ FILE *	_EXFUN(fmemopen, (void *, size_t,
 /* getdelim - see __getdelim for now */
 /* getline - see __getline for now */
 FILE *	_EXFUN(open_memstream, (char **, size_t *));
-/* renameat - unimplemented for now */
+#if defined (__CYGWIN__)
+int	_EXFUN(renameat, (int, const char *, int, const char *));
+int	_EXFUN(symlinkat, (const char *, int, const char *));
+#endif
 int	_EXFUN(vdprintf, (int, const char *, __VALIST)
                _ATTRIBUTE ((__format__ (__printf__, 2, 0))));
 # endif
Index: libc/include/sys/_default_fcntl.h
===================================================================
RCS file: /cvs/src/src/newlib/libc/include/sys/_default_fcntl.h,v
retrieving revision 1.1
diff -u -p -r1.1 _default_fcntl.h
--- libc/include/sys/_default_fcntl.h	19 Dec 2007 18:49:17 -0000	1.1
+++ libc/include/sys/_default_fcntl.h	23 Apr 2008 11:06:12 -0000
@@ -131,6 +131,17 @@ extern "C" {
 #define	F_UNLKSYS	4	/* remove remote locks for a given system */
 #endif	/* !_POSIX_SOURCE */
 
+#ifdef __CYGWIN__
+/* Special descriptor value to denote the cwd in calls to openat(2) etc. */
+#define AT_FDCWD -2
+
+/* Flag values for faccessat2) et al. */
+#define AT_EACCESS              1
+#define AT_SYMLINK_NOFOLLOW     2
+#define AT_SYMLINK_FOLLOW       4
+#define AT_REMOVEDIR            8
+#endif
+
 /*#include <sys/stdtypes.h>*/
 
 #ifndef __CYGWIN__
@@ -166,6 +177,11 @@ struct eflock {
 extern int open _PARAMS ((const char *, int, ...));
 extern int creat _PARAMS ((const char *, mode_t));
 extern int fcntl _PARAMS ((int, int, ...));
+#ifdef __CYGWIN__
+extern int futimesat _PARAMS ((int, const char *, const struct timeval *));
+extern int openat _PARAMS ((int, const char *, int, ...));
+extern int unlinkat _PARAMS ((int, const char *, int));
+#endif
 
 /* Provide _<systemcall> prototypes for functions provided by some versions
    of newlib.  */
Index: libc/include/sys/stat.h
===================================================================
RCS file: /cvs/src/src/newlib/libc/include/sys/stat.h,v
retrieving revision 1.17
diff -u -p -r1.17 stat.h
--- libc/include/sys/stat.h	20 Jun 2007 17:30:58 -0000	1.17
+++ libc/include/sys/stat.h	23 Apr 2008 11:06:12 -0000
@@ -129,6 +129,14 @@ int	_EXFUN(lstat,( const char *__path, s
 int	_EXFUN(mknod,( const char *__path, mode_t __mode, dev_t __dev ));
 #endif
 
+#if defined (__CYGWIN__)
+int	_EXFUN(fchmodat, (int, const char *, mode_t, int));
+int	_EXFUN(fstatat, (int, const char *, struct __stat64 *, int));
+int	_EXFUN(mkdirat, (int, const char *, mode_t));
+int	_EXFUN(mkfifoat, (int, const char *, mode_t));
+int	_EXFUN(mknodat, (int, const char *, mode_t, dev_t));
+#endif
+
 /* Provide prototypes for most of the _<systemcall> names that are
    provided in newlib for some compilers.  */
 #ifdef _COMPILING_NEWLIB
Index: libc/include/sys/unistd.h
===================================================================
RCS file: /cvs/src/src/newlib/libc/include/sys/unistd.h,v
retrieving revision 1.65
diff -u -p -r1.65 unistd.h
--- libc/include/sys/unistd.h	27 Mar 2008 09:55:05 -0000	1.65
+++ libc/include/sys/unistd.h	23 Apr 2008 11:06:12 -0000
@@ -46,6 +46,9 @@ int     _EXFUN(execlp, (const char *__fi
 int     _EXFUN(execv, (const char *__path, char * const __argv[] ));
 int     _EXFUN(execve, (const char *__path, char * const __argv[], char * const __envp[] ));
 int     _EXFUN(execvp, (const char *__file, char * const __argv[] ));
+#if defined(__CYGWIN__)
+int	_EXFUN(faccessat, (int __dirfd, const char *__path, int __mode, int __flags));
+#endif
 #if defined(__CYGWIN__) || defined(__rtems__) || defined(__SPU__)
 int     _EXFUN(fchdir, (int __fildes));
 #endif
@@ -53,6 +56,9 @@ int     _EXFUN(fchmod, (int __fildes, mo
 #if !defined(__INSIDE_CYGWIN__)
 int     _EXFUN(fchown, (int __fildes, uid_t __owner, gid_t __group ));
 #endif
+#if defined(__CYGWIN__)
+int	_EXFUN(fchownat, (int __dirfd, const char *__path, uid_t __owner, gid_t __group, int __flags));
+#endif
 pid_t   _EXFUN(fork, (void ));
 long    _EXFUN(fpathconf, (int __fd, int __name ));
 int     _EXFUN(fsync, (int __fd));
@@ -99,6 +105,9 @@ int     _EXFUN(isatty, (int __fildes ));
 int     _EXFUN(lchown, (const char *__path, uid_t __owner, gid_t __group ));
 #endif
 int     _EXFUN(link, (const char *__path1, const char *__path2 ));
+#if defined(__CYGWIN__)
+int     _EXFUN(linkat, (int __dirfd1, const char *__path1, int __dirfd2, const char *__path2, int __flags ));
+#endif
 int	_EXFUN(nice, (int __nice_value ));
 #if !defined(__INSIDE_CYGWIN__)
 off_t   _EXFUN(lseek, (int __fildes, off_t __offset, int __whence ));
@@ -226,7 +235,10 @@ void    _EXFUN(sync, (void));
 int     _EXFUN(sync, (void));
 #endif
 
-int     _EXFUN(readlink, (const char *__path, char *__buf, int __buflen));
+ssize_t _EXFUN(readlink, (const char *__path, char *__buf, size_t __buflen));
+#if defined(__CYGWIN__)
+ssize_t	_EXFUN(readlinkat, (int __dirfd1, const char *__path, char *__buf, size_t __buflen));
+#endif
 int     _EXFUN(symlink, (const char *__name1, const char *__name2));
 
 #define	F_OK	0

-- 
Corinna Vinschen
Cygwin Project Co-Leader
Red Hat


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]