aixv41Kludges.C

Go to the documentation of this file.
00001 /*
00002  * See the dyninst/COPYRIGHT file for copyright information.
00003  * 
00004  * We provide the Paradyn Tools (below described as "Paradyn")
00005  * on an AS IS basis, and do not warrant its validity or performance.
00006  * We reserve the right to update, modify, or discontinue this
00007  * software at any time.  We shall have no obligation to supply such
00008  * updates or modifications or any other form of support to you.
00009  * 
00010  * By your use of Paradyn, you understand and agree that we (or any
00011  * other person or entity with proprietary rights in Paradyn) are
00012  * under no obligation to provide either maintenance services,
00013  * update services, notices of latent defects, or correction of
00014  * defects for Paradyn.
00015  * 
00016  * This library is free software; you can redistribute it and/or
00017  * modify it under the terms of the GNU Lesser General Public
00018  * License as published by the Free Software Foundation; either
00019  * version 2.1 of the License, or (at your option) any later version.
00020  * 
00021  * This library is distributed in the hope that it will be useful,
00022  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00023  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00024  * Lesser General Public License for more details.
00025  * 
00026  * You should have received a copy of the GNU Lesser General Public
00027  * License along with this library; if not, write to the Free Software
00028  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
00029  */
00030 
00031 #include "common/h/headers.h"
00032 
00033 extern "C" {
00034 //extern int accept(int, struct sockaddr *addr, int *);
00035 //extern int accept(int, struct sockaddr *addr, size_t *);
00036 extern int getrusage(int, struct rusage*);
00037 //extern int getsockname(int, struct sockaddr*, int *);
00038 //extern int getsockname(int, struct sockaddr*, size_t *);
00039 
00040 extern int listen(int, int);
00041 extern int rexec(char **ahost, u_short inport, char *user, char *passwd,
00042          char *cmd, int *fd2p);
00043 extern int socket(int, int, int);
00044 extern int socketpair(int, int, int, int sv[2]);
00045 extern int pipe(int fd[2]);
00046 extern int vfork();
00047 extern int fork();
00048 
00049 /* 
00050  * Warning this next ifdef may not be correct on all platforms.  We have
00051  *   noticed that the xdrrec_endofrecord protoype is missing for gcc295.1 on
00052  *   the UMD AIX 4.2 systems, but seems fine on the Wisconsin gcc295.2 AIX
00053  *   4.3 systems.  The need for this prototype may be different elsewhere.
00054  *   jkh (hollings@cs.umd.edu) 3/21/00
00055  *
00056  */
00057 #ifndef _AIX43
00058 extern bool_t xdrrec_endofrecord (XDR *xdrs, bool_t sendnow);
00059 #endif
00060 
00061 };
00062 
00063 /* Non standard (even from sunos4 to sunos5 -- blech */
00064 
00065 /* POSIX */
00066 int P_getopt(int argc, char *argv[], const char *optstring) { return getopt(argc, argv, optstring);}
00067 void P_abort() { abort();}
00068 int P_close (int FILEDES) { return (close(FILEDES));}
00069 int P_dup2 (int OLD, int NEW) { return (dup2(OLD, NEW));}
00070 // int P_execlp (const char *FILENAME, const char *ARG0) {
00071 //  return (execlp(FILENAME, ARG0, NULL));}
00072 int P_execvp (const char *FILENAME, char *const ARGV[]) {
00073   return (execvp(FILENAME, ARGV));}
00074 int P_execve (const char* FILENAME, char* const ARGV[], char* const ENVP[]) {
00075     return (execve(FILENAME, ARGV, ENVP));
00076 }
00077 void P__exit (int STATUS) { _exit(STATUS);}
00078 int P_fcntl (int filedes, int command, int arg2) {
00079   return (fcntl(filedes, command, arg2));}
00080 FILE * P_fdopen (int FILEDES, const char *OPENTYPE) {
00081   return (fdopen(FILEDES, OPENTYPE));}
00082 FILE * P_fopen (const char *FILENAME, const char *OPENTYPE) {
00083   return (fopen(FILENAME, OPENTYPE));}
00084 int P_fstat (int FILEDES, struct stat *BUF) { return (fstat(FILEDES, BUF));}
00085 pid_t P_getpid () { return (getpid());}
00086 int P_kill(pid_t PID, int SIGNUM) { return (kill(PID, SIGNUM));}
00087 off_t P_lseek (int FILEDES, off_t OFFSET, int WHENCE) {
00088   return (lseek(FILEDES, OFFSET, WHENCE));}
00089 int P_open(const char *FILENAME, int FLAGS, mode_t MODE) {
00090   return (open64(FILENAME, FLAGS, MODE));}
00091 int P_pclose (FILE *STREAM) { return (pclose(STREAM));}
00092 FILE *P_popen (const char *COMMAND, const char *MODE) { return (popen(COMMAND, MODE));}
00093 size_t P_read (int FILEDES, void *BUFFER, size_t SIZE) {
00094   return (read(FILEDES, BUFFER, SIZE));}
00095 int P_uname(utsname *unm) { return (uname(unm));}
00096 pid_t P_wait(int *status_ptr) { return (wait(status_ptr));}
00097 pid_t P_waitpid(pid_t pid, int *statusp, int options) {
00098   return (waitpid(pid, statusp, options));}
00099 size_t P_write (int FILEDES, const void *BUFFER, size_t SIZE) {
00100   return (write(FILEDES, BUFFER, SIZE));}
00101 
00102 /* SYSTEM-V shared memory */
00103 int P_shmget(key_t thekey, int size, int flags) { return shmget(thekey, size, flags); }
00104 void *P_shmat(int shmid, void *addr, int flags) { return shmat(shmid, addr, flags); }
00105 int P_shmdt(void *addr) { return shmdt(addr); }
00106 int P_shmctl(int shmid, int cmd, struct shmid_ds *buf) { return shmctl(shmid, cmd, buf); }
00107 
00108 /* ANSI */
00109 void P_exit (int STATUS) { exit(STATUS);}
00110 int P_fflush(FILE *stream) {return (fflush(stream));}
00111 char *P_fgets (char *S, int COUNT, FILE *STREAM) { return (fgets(S, COUNT, STREAM));}
00112 void * P_malloc (size_t SIZE) { return (malloc(SIZE));}
00113 void * P_memcpy (void *A1, const void *A2, size_t SIZE) {
00114   return (memcpy(A1, A2, SIZE));}
00115 void * P_memset (void *BLOCK, int C, unsigned SIZE) {
00116   return (memset(BLOCK, C, SIZE));}
00117 void P_perror (const char *MESSAGE) { perror(MESSAGE);}
00118 P_sig_handler P_signal (int SIGNUM, P_sig_handler ACTION) {
00119   return (signal(SIGNUM, ACTION));}
00120 char *P_strcat(char *TO, const char *FROM) { return (strcat(TO, FROM));}
00121 char *P_strchr(const char *S, int C) { return (strchr(S, C));}
00122 int P_strcmp(const char *S1, const char *S2) { return (strcmp(S1, S2));}
00123 char *P_strcpy(char *TO, const char *FROM) { return (strcpy(TO, FROM));}
00124 char *P_strdup(const char *FROM) { return (strdup(FROM));}
00125 size_t P_strlen (const char *S) { return (strlen(S));}
00126 char * P_strncat (char *TO, const char *FROM, size_t SIZE) {
00127   return (strncat(TO, FROM, SIZE));}
00128 int P_strncmp (const char *S1, const char *S2, size_t SIZE) {
00129   return (strncmp(S1, S2, SIZE));}
00130 char * P_strncpy (char *TO, const char *FROM, size_t SIZE) {
00131   return (strncpy(TO, FROM, SIZE));}
00132 char * P_strrchr (const char *STRING, int C) { return (strrchr(STRING, C));}
00133 char * P_strstr (const char *HAYSTACK, const char *NEEDLE) {
00134   return (strstr(HAYSTACK, NEEDLE));}
00135 double P_strtod (const char *STRING, char **TAILPTR) {
00136   return(strtod(STRING, TAILPTR));}
00137 char * P_strtok (char *NEWSTRING, const char *DELIMITERS) {
00138   return (strtok(NEWSTRING, DELIMITERS));}
00139 long int P_strtol (const char *STRING, char **TAILPTR, int BASE){
00140   return (strtol(STRING, TAILPTR, BASE));}
00141 unsigned long int P_strtoul(const char *STRING, char **TAILPTR, int BASE){
00142   return (strtoul(STRING, TAILPTR, BASE));}
00143 
00144 /* BSD */
00145 
00146 int P_accept (int SOCK, struct sockaddr *ADDR, socklen_t *LENGTH_PTR) {
00147 #if defined(CROSSCOMPILER)
00148   return (accept(SOCK, ADDR, (int *)LENGTH_PTR));
00149 #else
00150   return (accept(SOCK, ADDR, LENGTH_PTR));
00151 #endif
00152 }
00153 
00154 int P_bind(int socket, struct sockaddr *addr, socklen_t len) {
00155   return (bind(socket, addr, len));}
00156 
00157 // void P_bzero(void *block, size_t size) { bzero(block, size);}
00158 
00159 int P_connect(int socket, struct sockaddr *addr, socklen_t len) {
00160   return (connect(socket, addr, len));}
00161 
00162 struct hostent *P_gethostbyname (const char *NAME) { 
00163   return (gethostbyname(NAME));
00164 }
00165 
00166 int P_gethostname(char *name, size_t size) {
00167   return (gethostname(name, size));}
00168 
00169 int P_getrusage(int i, struct rusage *r) {return (getrusage(i, r));}
00170 
00171 struct servent *P_getservbyname (const char *NAME, const char *PROTO) {
00172   return (getservbyname(NAME, PROTO));}
00173 
00174 int P_getsockname (int SOCKET, struct sockaddr *ADDR, socklen_t *LENGTH_PTR) {
00175 #if defined(CROSSCOMPILER)
00176   return (getsockname(SOCKET, ADDR, (int *)LENGTH_PTR));
00177 #else
00178   return (getsockname(SOCKET, ADDR, LENGTH_PTR));
00179 #endif
00180 }
00181 
00182 /* int P_gettimeofday (struct timeval *TP, struct timezone *TZP) {
00183   return (gettimeofday(TP, TZP));} */
00184 
00185 int P_listen(int socket, unsigned int n) {
00186   return (listen(socket, n));}
00187 
00188 caddr_t P_mmap(caddr_t addr, size_t len, int prot, int flags,
00189            int fd, off_t off) {
00190   return ((caddr_t)mmap(addr, len, prot, flags, fd, off));}
00191 
00192 int P_munmap(caddr_t ca, int i) {return (munmap(ca, i));}
00193 
00194 int P_select (int wid, fd_set *rd, fd_set *wr, fd_set *ex, struct timeval *tm) {
00195   return (select((unsigned long)wid, rd, wr, ex, tm));}
00196 
00197 int P_socket (int NAMESPACE, int STYLE, int PROTOCOL) {
00198   return (socket(NAMESPACE, STYLE, PROTOCOL));}
00199 
00200 int P_socketpair(int NAMESPACE, int style, int protocol, int filedes[2]) {
00201   return (socketpair(NAMESPACE, style, protocol, filedes));}
00202 
00203 int P_pipe(int fd[2]) { return (pipe(fd)); }
00204 
00205 int P_recv(int s, void *buf, size_t len, int flags) {
00206    return (recv(s, buf, len, flags));
00207 }
00208 
00209 
00210 int P_strcasecmp(const char *s1, const char *s2) {
00211   return (strcasecmp(s1, s2));}
00212 
00213 int P_strncasecmp (const char *S1, const char *S2, size_t N) {
00214   return (strncasecmp(S1, S2, N));}
00215 
00216 int P_rexec(char **ahost, u_short inport, char *user,
00217         char *passwd, char *cmd, int *fd2p){
00218   return (rexec(ahost, inport, user, passwd, cmd, fd2p));}
00219 
00220 void P_endservent(void) { endservent(); }
00221 
00222 void P_xdr_destroy(XDR *xdrs) { xdr_destroy(xdrs); }
00223 bool_t P_xdr_u_char(XDR *x, u_char *u) { return (xdr_u_char(x, u));}
00224 bool_t P_xdr_int(XDR *x, int *i) { return (xdr_int(x, i));}
00225 bool_t P_xdr_double(XDR *x, double *d) { return (xdr_double(x, d));}
00226 bool_t P_xdr_u_int(XDR *x, u_int *u) { return (xdr_u_int(x, u));}
00227 bool_t P_xdr_float(XDR *x, float *f) { return (xdr_float(x, f));}
00228 bool_t P_xdr_char(XDR *x, char *c) { return (xdr_char(x, c));}
00229 bool_t P_xdr_string(XDR *x, char **c, const u_int maxsize) {
00230   return (xdr_string(x, c, maxsize));}
00231 bool_t P_xdrrec_endofrecord(XDR *x, int now) {return (xdrrec_endofrecord(x, now));}
00232 bool_t P_xdrrec_skiprecord(XDR*x) { return (xdrrec_skiprecord(x));}
00233 void P_xdrrec_create(XDR *x, const u_int send_sz, const u_int rec_sz,
00234              const caddr_t handle, 
00235              xdr_rd_func readit, xdr_wr_func writeit) {
00236   xdrrec_create(x, send_sz, rec_sz, handle, 
00237         (int(*)(void *, char *, int))readit, 
00238         (int(*)(void *, char *, int))writeit);}
00239 
00240 
00241 #define DMGL_PARAMS      (1 << 0)       /* Include function args */
00242 #define DMGL_ANSI        (1 << 1)       /* Include const, volatile, etc */
00243 
00244 #if defined(cap_native_demangler)
00245 #include <demangle.h>
00246 extern "C" {
00247 extern Name *demangle(char *name, char **rest, unsigned long options);
00248 extern NameKind kind(Name *);
00249 extern char *text(Name *);
00250 extern char *functionName(Name *);
00251 extern char *varName(Name *);
00252 extern void erase(Name *);
00253 }
00254 #endif
00255 
00256 #if defined(cap_liberty)
00257 extern "C" char *cplus_demangle(char *, int);
00258 #endif
00259 
00260 #if defined(cap_gnu_demangler)
00261 #include <cxxabi.h>
00262 using namespace __cxxabiv1;
00263 #endif
00264 
00265 extern void dedemangle( char * demangled, char * dedemangled );
00266 
00267 char *P_cplus_demangle( const char * symbol, bool nativeCompiler, bool includeTypes ) {
00268    /* If the symbol isn't from the native compiler, or the native demangler
00269       isn't available, use the built-in. */
00270 #if defined(cap_liberty) || defined(cap_gnu_demangler)
00271    if( !nativeCompiler ) {
00272 #if defined(cap_gnu_demangler)
00273    int status;
00274    char *demangled = __cxa_demangle(symbol, NULL, NULL, &status);
00275    if (status == -1) {
00276       //Memory allocation failure.
00277       return NULL;
00278    }
00279    if (status == -2) {
00280       //Not a C++ name
00281       return NULL;
00282    }
00283    assert(status == 0); //Success
00284 #else
00285    char * demangled = cplus_demangle( const_cast<char *>(symbol),
00286                                          includeTypes ? DMGL_PARAMS | DMGL_ANSI : 0 );
00287 #endif
00288       if( demangled == NULL ) { return NULL; }
00289 
00290       if( ! includeTypes ) {
00291          /* De-demangling never makes a string longer. */
00292          char * dedemangled = strdup( demangled );
00293          assert( dedemangled != NULL );
00294 
00295          dedemangle( demangled, dedemangled );
00296          assert( dedemangled != NULL );
00297 
00298          free( demangled );
00299          return dedemangled;
00300       }
00301 
00302       return demangled;
00303    } /* end if not using native demangler. */
00304 #endif
00305 
00306 #if defined(cap_native_demangler)
00307    /* Use the native demangler, which apparently behaves funny. */
00308    Name * name;
00309    char * rest;
00310    
00311    /* native_demangle() won't actually demangled 'symbol'.
00312       Find out what kind() of symbol it is and demangle from there. */
00313    name = demangle( const_cast<char*>(symbol), (char **) & rest,
00314                     RegularNames | ClassNames | SpecialNames | ParameterText | QualifierText );
00315    if( name == NULL ) { return NULL; }
00316    
00317    char * demangled = NULL;
00318    switch( kind( name ) ) {
00319       case ::Function:
00320          if (includeTypes)
00321             demangled = text(name);
00322          else
00323             demangled = functionName(name);   
00324          break;
00325          
00326       case MemberFunction:
00327          /* Doing it this way preserves the leading classnames. */
00328          demangled = text(name);
00329          break;
00330          
00331       case MemberVar:
00332          demangled = varName(name);
00333          break;
00334          
00335       case VirtualName:
00336       case Class:
00337       case Special:
00338       case Long:
00339          demangled = text(name);
00340          break;
00341       default: assert( 0 );
00342    } /* end kind() switch */
00343    
00344    /* Potential memory leak: no erase( name ) call.  Also, the
00345       char *'s returned from a particular Name will be freed
00346       when that name is erase()d or destroyed, so strdup if we're
00347       fond of them. */
00348    
00349    if( ! includeTypes ) {
00350       /* De-demangling never makes a string longer. */
00351       char * dedemangled = strdup( demangled );
00352       char *old_demangled = dedemangled;
00353       assert( dedemangled != NULL );
00354       
00355       dedemangle( demangled, dedemangled );
00356       assert( dedemangled != NULL );
00357       erase(name);
00358       
00359       assert(old_demangled == dedemangled);
00360       return dedemangled;
00361    }
00362    char *strname = strdup(demangled);
00363    erase(name);
00364    return strname;
00365 #endif
00366    return NULL;
00367 } /* end P_cplus_demangle() */
00368 
00369 
00370 
00371 
00372 
00373 
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

Generated on 12 Jul 2013 for SymtabAPI by  doxygen 1.6.1