Skip to content

Commit

Permalink
More trampolines.
Browse files Browse the repository at this point in the history
  • Loading branch information
icculus committed Feb 12, 2013
1 parent 82c8645 commit 6ccda28
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 2 deletions.
50 changes: 50 additions & 0 deletions macelf/mactrampolines.c
Expand Up @@ -60,6 +60,7 @@
#include <sys/param.h>
#include <sys/ucred.h>
#include <sys/mount.h>
#include <sys/utsname.h>

#include "macelf.h"

Expand Down Expand Up @@ -1574,6 +1575,50 @@ static int mactrampoline_endmntent(FILE *io)

//static char* mactrampoline_hasmntopt(const struct mntent *a, const char *b)

#define LINUX_UTSNAME_STRING_LENGTH 65
typedef struct
{
char sysname[LINUX_UTSNAME_STRING_LENGTH];
char nodename[LINUX_UTSNAME_STRING_LENGTH];
char release[LINUX_UTSNAME_STRING_LENGTH];
char version[LINUX_UTSNAME_STRING_LENGTH];
char machine[LINUX_UTSNAME_STRING_LENGTH];
char domainname[LINUX_UTSNAME_STRING_LENGTH];
} LinuxUtsName;

static int mactrampoline_uname(LinuxUtsName *lnxname)
{
struct utsname macname;
if (uname(&macname) == -1)
return -1;
else if (gethostname(lnxname->domainname, sizeof (lnxname->domainname)) == -1)
return -1;

#define CPYUTSSTR(x) snprintf(lnxname->x, sizeof (lnxname->x), "%s", macname.x)
CPYUTSSTR(sysname);
CPYUTSSTR(nodename);
CPYUTSSTR(release);
CPYUTSSTR(version);
CPYUTSSTR(machine);
#undef CPYUTSSTR

return 0;
} // mactrampoline_uname

static int mactrampoline_sigaction(int sig, const void/*struct sigaction*/ *lnxact, void/*struct sigaction*/ *lnxoact)
{
STUBBED("write me");
errno = ENOTSUP;
return -1;
} // mactrampoline_sigaction

static int mactrampoline_fcvt_r(double number, int ndigits, int *decpt, int *sign, char *buf, size_t len)
{
STUBBED("this is wrong: not reentrant, wrong retval");
char *str = fcvt(number, ndigits, decpt, sign);
snprintf(buf, len, "%s", str);
return 0;
} // mactrampoline_fcvt_r

static int mactrampoline_getrlimit(int resource, struct rlimit *limit)
{
Expand Down Expand Up @@ -1628,6 +1673,11 @@ static void mactrampoline_longjmp(jmp_buf env, int val)
longjmp(env, val);
} // mactrampoline_longjmp

static void mactrampoline__longjmp(jmp_buf env, int val)
{
longjmp(env, val);
} // mactrampoline__longjmp


// pthread_t matches up closely enough, but much of the rest of the pthread
// structs don't, so we end up allocating the mac versions, and using the
Expand Down
10 changes: 8 additions & 2 deletions macelf/mactrampolines.h
Expand Up @@ -117,6 +117,7 @@ MACTRAMPOLINE_OVERRIDE(__assert_fail)
MACTRAMPOLINE_OVERRIDE(waitpid)
MACTRAMPOLINE_OVERRIDE(_setjmp)
MACTRAMPOLINE_OVERRIDE(longjmp)
MACTRAMPOLINE_OVERRIDE(_longjmp)
MACTRAMPOLINE_OVERRIDE(stat)
MACTRAMPOLINE_OVERRIDE(lstat)
MACTRAMPOLINE_OVERRIDE(fstat)
Expand All @@ -127,6 +128,7 @@ MACTRAMPOLINE_OVERRIDE(__xstat64)
MACTRAMPOLINE_OVERRIDE(__lxstat64)
MACTRAMPOLINE_OVERRIDE(__fxstat64)
MACTRAMPOLINE_OVERRIDE(mkstemp64)
MACTRAMPOLINE_OVERRIDE(uname)
MACTRAMPOLINE_OVERRIDE(getrlimit)
MACTRAMPOLINE_OVERRIDE(getrlimit64)
MACTRAMPOLINE_OVERRIDE(setrlimit)
Expand Down Expand Up @@ -314,6 +316,8 @@ MACTRAMPOLINE(char *,if_indextoname,(unsigned int a, char *b),(a,b),return)
MACTRAMPOLINE(struct if_nameindex *,if_nameindex,(void),(),return)
MACTRAMPOLINE(void,if_freenameindex,(struct if_nameindex *a),(a),)

MACTRAMPOLINE_OVERRIDE(fcvt_r)

// !!! FIXME: mode_t is 2 bytes on Mac OS X, but 4 on Linux.
//MACTRAMPOLINE(DBM*,dbm_open,(const char *a, int b, mode_t c),(a,b,c),return)
//MACTRAMPOLINE(int,posix_spawn_file_actions_addopen,(posix_spawn_file_actions_t *a, int b, const char *c, int d, mode_t e),(a,b,c,d,e),return)
Expand Down Expand Up @@ -352,6 +356,8 @@ MACTRAMPOLINE_OVERRIDE(getmntent)
MACTRAMPOLINE_OVERRIDE(endmntent)
//MACTRAMPOLINE_OVERRIDE(hasmntopt)

MACTRAMPOLINE_OVERRIDE(sigaction)


// Things that map directly, with just some stack-aligning macro glue.

Expand Down Expand Up @@ -726,6 +732,7 @@ MACTRAMPOLINE(double,yn,(int a, double b),(a,b),return)
MACTRAMPOLINE(int,isnan,(double a),(a),return)
MACTRAMPOLINE(int,isinf,(double a),(a),return)
MACTRAMPOLINE(int,isfinite,(double a),(a),return)
MACTRAMPOLINE(int,finite,(double a),(a),return)
MACTRAMPOLINE(double,acosh,(double a),(a),return)
MACTRAMPOLINE(double,asinh,(double a),(a),return)
MACTRAMPOLINE(double,atanh,(double a),(a),return)
Expand Down Expand Up @@ -1113,7 +1120,6 @@ MACTRAMPOLINE(int,utimes,(const char *a, const struct timeval b[2]),(a,b),return
MACTRAMPOLINE(pid_t,wait,(int *a),(a),return)
//MACTRAMPOLINE(pid_t,wait3,(int *a, int b, struct rusage *c),(a,b,c),return)
//MACTRAMPOLINE(int,waitid,(idtype_t a, id_t b, siginfo_t *c, int d),(a,b,c,d),return)
//MACTRAMPOLINE(int,uname,(struct utsname *a),(a),return)
//MACTRAMPOLINE(int,msgctl,(int a, int b, struct msqid_ds *c),(a,b,c),return)
//MACTRAMPOLINE(int,msgget,(key_t a, int b),(a,b),return)
//MACTRAMPOLINE(ssize_t,msgrcv,(int a, void *b, size_t c, long int d, int e),(a,b,c,d,e),return)
Expand All @@ -1136,6 +1142,7 @@ MACTRAMPOLINE(struct in_addr,inet_makeaddr,(in_addr_t a, in_addr_t b),(a,b),retu
MACTRAMPOLINE(in_addr_t,inet_netof,(struct in_addr a),(a),return)
MACTRAMPOLINE(in_addr_t,inet_network,(const char *a),(a),return)
MACTRAMPOLINE(char*,inet_ntoa,(struct in_addr a),(a),return)
MACTRAMPOLINE(int,inet_aton,(const char *a, struct in_addr *b),(a,b),return)
//MACTRAMPOLINE(int,dbm_clearerr,(DBM *a),(a),return)
//MACTRAMPOLINE(void,dbm_close,(DBM *a),(a),)
//MACTRAMPOLINE(int,dbm_delete,(DBM *a, datum b),(a,b),return)
Expand Down Expand Up @@ -1200,7 +1207,6 @@ MACTRAMPOLINE(int,ungetc,(int a, FILE *b),(a,b),return)
//MACTRAMPOLINE(void,endgrent,(void),(),)
//MACTRAMPOLINE(void,setgrent,(void),(),)
//MACTRAMPOLINE(void,siglongjmp,(sigjmp_buf a, int b),(a,b),)
//MACTRAMPOLINE(void,_longjmp,(jmp_buf a, int b),(a,b),)
//MACTRAMPOLINE(int,posix_spawnattr_destroy,(posix_spawnattr_t *a),(a),return)
//MACTRAMPOLINE(int,posix_spawnattr_getsigdefault,(const posix_spawnattr_t *a, sigset_t *b),(a,b),return)
//MACTRAMPOLINE(int,posix_spawnattr_getflags,(const posix_spawnattr_t *a, short *b),(a,b),return)
Expand Down

0 comments on commit 6ccda28

Please sign in to comment.