|
From: <sv...@va...> - 2006-10-01 18:13:17
|
Author: sewardj
Date: 2006-10-01 19:13:14 +0100 (Sun, 01 Oct 2006)
New Revision: 6130
Log:
- AIX implementations of various stuff, nothing surprising.
- For all platforms: make VG_(read) and VG_(write) return (negative)
actual error values rather than producing -1 for all failures.
Modified:
branches/AIX5/coregrind/m_libcfile.c
branches/AIX5/coregrind/pub_core_libcfile.h
branches/AIX5/include/pub_tool_libcfile.h
Modified: branches/AIX5/coregrind/m_libcfile.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/AIX5/coregrind/m_libcfile.c 2006-10-01 18:07:31 UTC (rev 612=
9)
+++ branches/AIX5/coregrind/m_libcfile.c 2006-10-01 18:13:14 UTC (rev 613=
0)
@@ -28,7 +28,10 @@
The GNU General Public License is contained in the file COPYING.
*/
=20
+#include "pub_core_debuglog.h"
#include "pub_core_basics.h"
+#include "pub_core_vki.h"
+#include "pub_core_vkiscnums.h"
#include "pub_core_libcbase.h"
#include "pub_core_libcassert.h"
#include "pub_core_libcfile.h"
@@ -36,7 +39,6 @@
#include "pub_core_libcproc.h" // VG_(getpid), VG_(getppid)
#include "pub_core_clientstate.h" // VG_(fd_hard_limit)
#include "pub_core_syscall.h"
-#include "vki_unistd.h"
=20
/* ---------------------------------------------------------------------
File stuff
@@ -60,6 +62,7 @@
if (newfd !=3D -1)
VG_(close)(oldfd);
=20
+ /* Set the close-on-exec flag for this fd. */
VG_(fcntl)(newfd, VKI_F_SETFD, VKI_FD_CLOEXEC);
=20
vg_assert(newfd >=3D VG_(fd_hard_limit));
@@ -95,14 +98,30 @@
=20
Int VG_(read) ( Int fd, void* buf, Int count)
{
+ Int ret;
SysRes res =3D VG_(do_syscall3)(__NR_read, fd, (UWord)buf, count);
- return res.isError ? -1 : res.val;
+ if (res.isError) {
+ ret =3D - (Int)(Word)res.err;
+ vg_assert(ret < 0);
+ } else {
+ ret =3D (Int)(Word)res.res;
+ vg_assert(ret >=3D 0);
+ }
+ return ret;
}
=20
Int VG_(write) ( Int fd, const void* buf, Int count)
{
+ Int ret;
SysRes res =3D VG_(do_syscall3)(__NR_write, fd, (UWord)buf, count);
- return res.isError ? -1 : res.val;
+ if (res.isError) {
+ ret =3D - (Int)(Word)res.err;
+ vg_assert(ret < 0);
+ } else {
+ ret =3D (Int)(Word)res.res;
+ vg_assert(ret >=3D 0);
+ }
+ return ret;
}
=20
Int VG_(pipe) ( Int fd[2] )
@@ -114,39 +133,61 @@
OffT VG_(lseek) ( Int fd, OffT offset, Int whence )
{
SysRes res =3D VG_(do_syscall3)(__NR_lseek, fd, offset, whence);
- return res.isError ? (-1) : res.val;
+ return res.isError ? (-1) : res.res;
/* if you change the error-reporting conventions of this, also
change VG_(pread) and all other usage points. */
}
=20
SysRes VG_(stat) ( Char* file_name, struct vki_stat* buf )
{
+# if defined(VGO_linux)
SysRes res =3D VG_(do_syscall2)(__NR_stat, (UWord)file_name, (UWord)b=
uf);
return res;
+# elif defined(VGO_aix5)
+ SysRes res =3D VG_(do_syscall4)(__NR_AIX5_statx,
+ (UWord)file_name,
+ (UWord)buf,
+ sizeof(struct vki_stat),
+ VKI_STX_NORMAL);
+ return res;
+# else
+# error Unknown OS
+# endif
}
=20
Int VG_(fstat) ( Int fd, struct vki_stat* buf )
{
+# if defined(VGO_linux)
SysRes res =3D VG_(do_syscall2)(__NR_fstat, fd, (UWord)buf);
return res.isError ? (-1) : 0;
+# elif defined(VGO_aix5)
+ I_die_here;
+# else
+# error Unknown OS
+# endif
}
=20
Int VG_(fsize) ( Int fd )
{
-#ifdef __NR_fstat64
+# if defined(VGO_linux) && defined(__NR_fstat64)
struct vki_stat64 buf;
SysRes res =3D VG_(do_syscall2)(__NR_fstat64, fd, (UWord)&buf);
-#else
+ return res.isError ? (-1) : buf.st_size;
+# elif defined(VGO_linux) && !defined(__NR_fstat64)
struct vki_stat buf;
SysRes res =3D VG_(do_syscall2)(__NR_fstat, fd, (UWord)&buf);
-#endif
return res.isError ? (-1) : buf.st_size;
+# elif defined(VGO_aix5)
+ I_die_here;
+# else
+# error Unknown OS
+# endif
}
=20
Bool VG_(is_dir) ( HChar* f )
{
struct vki_stat buf;
- SysRes res =3D VG_(do_syscall2)(__NR_stat, (UWord)f, (UWord)&buf);
+ SysRes res =3D VG_(stat)(f, &buf);
return res.isError ? False
: VKI_S_ISDIR(buf.st_mode) ? True : False;
}
@@ -160,7 +201,7 @@
Int VG_(fcntl) ( Int fd, Int cmd, Int arg )
{
SysRes res =3D VG_(do_syscall3)(__NR_fcntl, fd, cmd, arg);
- return res.isError ? -1 : res.val;
+ return res.isError ? -1 : res.res;
}
=20
Int VG_(rename) ( Char* old_name, Char* new_name )
@@ -175,14 +216,25 @@
return res.isError ? (-1) : 0;
}
=20
-/* Nb: we do not allow the Linux extension which malloc()s memory for th=
e
- buffer if buf=3D=3DNULL, because we don't want Linux calling malloc()=
*/
Bool VG_(getcwd) ( Char* buf, SizeT size )
{
+# if defined(VGO_linux)
SysRes res;
vg_assert(buf !=3D NULL);
res =3D VG_(do_syscall2)(__NR_getcwd, (UWord)buf, size);
return res.isError ? False : True;
+# elif defined(VGO_aix5)
+ static Int complaints =3D 3;
+ if (complaints-- > 0)
+ VG_(debugLog)(0, "libcfile",
+ "Warning: AIX5: m_libcfile.c: kludged 'getcwd'\n"=
);
+ if (size < 2) return False;
+ buf[0] =3D '.';
+ buf[1] =3D 0;
+ return True;
+# else
+# error Unknown OS
+# endif
}
=20
Int VG_(readlink) (Char* path, Char* buf, UInt bufsiz)
@@ -190,7 +242,7 @@
SysRes res;
/* res =3D readlink( path, buf, bufsiz ); */
res =3D VG_(do_syscall3)(__NR_readlink, (UWord)path, (UWord)buf, bufs=
iz);
- return res.isError ? -1 : res.val;
+ return res.isError ? -1 : res.res;
}
=20
Int VG_(getdents) (UInt fd, struct vki_dirent *dirp, UInt count)
@@ -198,14 +250,14 @@
SysRes res;
/* res =3D getdents( fd, dirp, count ); */
res =3D VG_(do_syscall3)(__NR_getdents, fd, (UWord)dirp, count);
- return res.isError ? -1 : res.val;
+ return res.isError ? -1 : res.res;
}
=20
/* Check accessibility of a file. Returns zero for access granted,
nonzero otherwise. */
Int VG_(access) ( HChar* path, Bool irusr, Bool iwusr, Bool ixusr )
{
-#if defined(VGO_linux)
+# if defined(VGO_linux)
/* Very annoyingly, I cannot find any definition for R_OK et al in
the kernel interfaces. Therefore I reluctantly resort to
hardwiring in these magic numbers that I determined by
@@ -214,10 +266,16 @@
| (iwusr ? 2/*W_OK*/ : 0)
| (ixusr ? 1/*X_OK*/ : 0);
SysRes res =3D VG_(do_syscall2)(__NR_access, (UWord)path, w);
- return res.isError ? 1 : res.val;
-#else
-# error "Don't know how to do VG_(access) on this OS"
-#endif
+ return res.isError ? 1 : 0;
+# elif defined(VGO_aix5)
+ UWord w =3D (irusr ? VKI_R_OK : 0)
+ | (iwusr ? VKI_W_OK : 0)
+ | (ixusr ? VKI_X_OK : 0);
+ SysRes res =3D VG_(do_syscall2)(__NR_access, (UWord)path, w);
+ return res.isError ? 1 : 0; =20
+# else
+# error "Don't know how to do VG_(access) on this OS"
+# endif
}
=20
/*=20
@@ -239,11 +297,11 @@
=20
res =3D VG_(stat)(f, &st);
if (res.isError) {
- return res.val;
+ return res.err;
}
=20
if (st.st_mode & (VKI_S_ISUID | VKI_S_ISGID)) {
- //VG_(printf)("Can't execute suid/sgid executable %s\n", exe);
+ /* VG_(printf)("Can't execute suid/sgid executable %s\n", exe); */
return VKI_EACCES;
}
=20
@@ -321,7 +379,7 @@
if (sres.isError)
continue;
/* VG_(safe_fd) doesn't return if it fails. */
- fd =3D VG_(safe_fd)( sres.val );
+ fd =3D VG_(safe_fd)( sres.res );
if (fullname)
VG_(strcpy)( fullname, buf );
return fd;
@@ -341,7 +399,12 @@
Int my_socket ( Int domain, Int type, Int protocol );
=20
static
-Int my_connect ( Int sockfd, struct vki_sockaddr_in* serv_addr,=20
+Int my_connect ( Int sockfd,=20
+# if defined(VGO_linux)
+ struct vki_sockaddr_in* serv_addr,=20
+# else
+ void* serv_addr,
+# endif
Int addrlen );
=20
UInt VG_(htonl) ( UInt x )
@@ -399,6 +462,9 @@
*/
Int VG_(connect_via_socket)( UChar* str )
{
+#if defined(VGO_aix5)
+ I_die_here;
+#else /* Yay, Linux */
Int sd, res;
struct vki_sockaddr_in servAddr;
UInt ip =3D 0;
@@ -433,13 +499,14 @@
}
=20
return sd;
+#endif
}
=20
=20
/* Let d =3D one or more digits. Accept either:
d.d.d.d or d.d.d.d:d
*/
-Int parse_inet_addr_and_port ( UChar* str, UInt* ip_addr, UShort* port )
+static Int parse_inet_addr_and_port ( UChar* str, UInt* ip_addr, UShort*=
port )
{
# define GET_CH ((*str) ? (*str++) : 0)
UInt ipa, i, j, c, any;
@@ -490,20 +557,28 @@
args[1] =3D type;
args[2] =3D protocol;
res =3D VG_(do_syscall2)(__NR_socketcall, VKI_SYS_SOCKET, (UWord)&arg=
s);
- return res.isError ? -1 : res.val;
+ return res.isError ? -1 : res.res;
=20
#elif defined(VGP_amd64_linux)
SysRes res;
res =3D VG_(do_syscall3)(__NR_socket, domain, type, protocol );
- return res.isError ? -1 : res.val;
+ return res.isError ? -1 : res.res;
=20
+#elif defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
+ I_die_here;
+
#else
# error Unknown arch
#endif
}
=20
static
-Int my_connect ( Int sockfd, struct vki_sockaddr_in* serv_addr,=20
+Int my_connect ( Int sockfd,
+# if defined(VGO_linux)
+ struct vki_sockaddr_in* serv_addr,=20
+# else
+ void* serv_addr,
+# endif
Int addrlen )
{
#if defined(VGP_x86_linux) || defined(VGP_ppc32_linux) || defined(VGP_pp=
c64_linux)
@@ -513,13 +588,16 @@
args[1] =3D (UWord)serv_addr;
args[2] =3D addrlen;
res =3D VG_(do_syscall2)(__NR_socketcall, VKI_SYS_CONNECT, (UWord)&ar=
gs);
- return res.isError ? -1 : res.val;
+ return res.isError ? -1 : res.res;
=20
#elif defined(VGP_amd64_linux)
SysRes res;
res =3D VG_(do_syscall3)(__NR_connect, sockfd, (UWord)serv_addr, addr=
len);
- return res.isError ? -1 : res.val;
+ return res.isError ? -1 : res.res;
=20
+#elif defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
+ I_die_here;
+
#else
# error Unknown arch
#endif
@@ -528,10 +606,9 @@
Int VG_(write_socket)( Int sd, void *msg, Int count )
{
/* This is actually send(). */
- /* Requests not to send SIGPIPE on errors on stream oriented
- sockets when the other end breaks the connection. The EPIPE
- error is still returned. */
- Int flags =3D VKI_MSG_NOSIGNAL;
+ /* For Linux, VKI_MSG_NOSIGNAL is a request not to send SIGPIPE on
+ errors on stream oriented sockets when the other end breaks the
+ connection. The EPIPE error is still returned. */
=20
#if defined(VGP_x86_linux) || defined(VGP_ppc32_linux) || defined(VGP_pp=
c64_linux)
SysRes res;
@@ -539,15 +616,19 @@
args[0] =3D sd;
args[1] =3D (UWord)msg;
args[2] =3D count;
- args[3] =3D flags;
+ args[3] =3D VKI_MSG_NOSIGNAL;
res =3D VG_(do_syscall2)(__NR_socketcall, VKI_SYS_SEND, (UWord)&args)=
;
- return res.isError ? -1 : res.val;
+ return res.isError ? -1 : res.res;
=20
#elif defined(VGP_amd64_linux)
SysRes res;
- res =3D VG_(do_syscall6)(__NR_sendto, sd, (UWord)msg, count, flags, 0=
,0);
- return res.isError ? -1 : res.val;
+ res =3D VG_(do_syscall6)(__NR_sendto, sd, (UWord)msg,=20
+ count, VKI_MSG_NOSIGNAL, 0,0);
+ return res.isError ? -1 : res.res;
=20
+#elif defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
+ I_die_here;
+
#else
# error Unknown arch
#endif
@@ -555,21 +636,24 @@
=20
Int VG_(getsockname) ( Int sd, struct vki_sockaddr *name, Int *namelen)
{
+#if defined(VGP_x86_linux) || defined(VGP_ppc32_linux) || defined(VGP_pp=
c64_linux)
SysRes res;
-
-#if defined(VGP_x86_linux) || defined(VGP_ppc32_linux) || defined(VGP_pp=
c64_linux)
UWord args[3];
args[0] =3D sd;
args[1] =3D (UWord)name;
args[2] =3D (UWord)namelen;
res =3D VG_(do_syscall2)(__NR_socketcall, VKI_SYS_GETSOCKNAME, (UWord=
)&args);
- return res.isError ? -1 : res.val;
+ return res.isError ? -1 : res.res;
=20
#elif defined(VGP_amd64_linux)
+ SysRes res;
res =3D VG_(do_syscall3)( __NR_getsockname,
(UWord)sd, (UWord)name, (UWord)namelen );
- return res.isError ? -1 : res.val;
+ return res.isError ? -1 : res.res;
=20
+#elif defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
+ I_die_here;
+
#else
# error Unknown arch
#endif
@@ -577,32 +661,34 @@
=20
Int VG_(getpeername) ( Int sd, struct vki_sockaddr *name, Int *namelen)
{
+#if defined(VGP_x86_linux) || defined(VGP_ppc32_linux) || defined(VGP_pp=
c64_linux)
SysRes res;
-
-#if defined(VGP_x86_linux) || defined(VGP_ppc32_linux) || defined(VGP_pp=
c64_linux)
UWord args[3];
args[0] =3D sd;
args[1] =3D (UWord)name;
args[2] =3D (UWord)namelen;
res =3D VG_(do_syscall2)(__NR_socketcall, VKI_SYS_GETPEERNAME, (UWord=
)&args);
- return res.isError ? -1 : res.val;
+ return res.isError ? -1 : res.res;
=20
#elif defined(VGP_amd64_linux)
+ SysRes res;
res =3D VG_(do_syscall3)( __NR_getpeername,
(UWord)sd, (UWord)name, (UWord)namelen );
- return res.isError ? -1 : res.val;
+ return res.isError ? -1 : res.res;
=20
+#elif defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
+ I_die_here;
+
#else
-# error Unknown archx
+# error Unknown arch
#endif
}
=20
Int VG_(getsockopt) ( Int sd, Int level, Int optname, void *optval,
Int *optlen)
{
+#if defined(VGP_x86_linux) || defined(VGP_ppc32_linux) || defined(VGP_pp=
c64_linux)
SysRes res;
-
-#if defined(VGP_x86_linux) || defined(VGP_ppc32_linux) || defined(VGP_pp=
c64_linux)
UWord args[5];
args[0] =3D sd;
args[1] =3D level;
@@ -610,14 +696,18 @@
args[3] =3D (UWord)optval;
args[4] =3D (UWord)optlen;
res =3D VG_(do_syscall2)(__NR_socketcall, VKI_SYS_GETSOCKOPT, (UWord)=
&args);
- return res.isError ? -1 : res.val;
+ return res.isError ? -1 : res.res;
=20
#elif defined(VGP_amd64_linux)
+ SysRes res;
res =3D VG_(do_syscall5)( __NR_getsockopt,
(UWord)sd, (UWord)level, (UWord)optname,=20
(UWord)optval, (UWord)optlen );
- return res.isError ? -1 : res.val;
+ return res.isError ? -1 : res.res;
=20
+#elif defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
+ I_die_here;
+
#else
# error Unknown arch
#endif
Modified: branches/AIX5/coregrind/pub_core_libcfile.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/AIX5/coregrind/pub_core_libcfile.h 2006-10-01 18:07:31 UTC (=
rev 6129)
+++ branches/AIX5/coregrind/pub_core_libcfile.h 2006-10-01 18:13:14 UTC (=
rev 6130)
@@ -34,6 +34,7 @@
//--------------------------------------------------------------------
// PURPOSE: This module contains all the libc code that relates to
// files and sockets: opening, reading, writing, etc.
+// To use, you must first include: pub_core_vki.h
//--------------------------------------------------------------------
=20
#include "pub_tool_libcfile.h"
Modified: branches/AIX5/include/pub_tool_libcfile.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/AIX5/include/pub_tool_libcfile.h 2006-10-01 18:07:31 UTC (re=
v 6129)
+++ branches/AIX5/include/pub_tool_libcfile.h 2006-10-01 18:13:14 UTC (re=
v 6130)
@@ -35,6 +35,8 @@
File-related functions.
------------------------------------------------------------------ */
=20
+/* To use this file you must first include pub_tool_vki.h. */
+
extern SysRes VG_(open) ( const Char* pathname, Int flags, Int mode );
extern void VG_(close) ( Int fd );
extern Int VG_(read) ( Int fd, void* buf, Int count);
|