diff options
author | Hans-Peter Nilsson <hp@axis.com> | 2004-12-13 00:38:38 +0000 |
---|---|---|
committer | Hans-Peter Nilsson <hp@axis.com> | 2004-12-13 00:38:38 +0000 |
commit | 0d3cd463e38ed3e3f7ae27ca38c00170150a275f (patch) | |
tree | b914bea3898f12983af0fc8a627d7f03d601cc79 /sim/common | |
parent | c4b36ce9fe15924cebd13edf3867f19eded2fa89 (diff) | |
download | gdb-0d3cd463e38ed3e3f7ae27ca38c00170150a275f.zip gdb-0d3cd463e38ed3e3f7ae27ca38c00170150a275f.tar.gz gdb-0d3cd463e38ed3e3f7ae27ca38c00170150a275f.tar.bz2 |
* syscall.c (cb_syscall) <case CB_SYS_lstat>: New case.
* callback.c (os_lstat): New function.
Diffstat (limited to 'sim/common')
-rw-r--r-- | sim/common/ChangeLog | 5 | ||||
-rw-r--r-- | sim/common/callback.c | 11 | ||||
-rw-r--r-- | sim/common/syscall.c | 44 |
3 files changed, 60 insertions, 0 deletions
diff --git a/sim/common/ChangeLog b/sim/common/ChangeLog index bc71bc9..0213a9c 100644 --- a/sim/common/ChangeLog +++ b/sim/common/ChangeLog @@ -1,3 +1,8 @@ +2004-12-13 Hans-Peter Nilsson <hp@axis.com> + + * syscall.c (cb_syscall) <case CB_SYS_lstat>: New case. + * callback.c (os_lstat): New function. + 2004-12-08 Hans-Peter Nilsson <hp@axis.com> * run.1: Document --sysroot=filepath. diff --git a/sim/common/callback.c b/sim/common/callback.c index 2204787..7ba0c06 100644 --- a/sim/common/callback.c +++ b/sim/common/callback.c @@ -407,6 +407,16 @@ os_fstat (p, fd, buf) return wrap (p, fstat (fdmap (p, fd), buf)); } +static int +os_lstat (p, file, buf) + host_callback *p; + const char *file; + struct stat *buf; +{ + /* NOTE: hpn/2004-12-12: Same issue here as with os_fstat. */ + return wrap (p, lstat (file, buf)); +} + static int os_ftruncate (p, fd, len) host_callback *p; @@ -589,6 +599,7 @@ host_callback default_callback = os_stat, os_fstat, + os_lstat, os_ftruncate, os_truncate, diff --git a/sim/common/syscall.c b/sim/common/syscall.c index 76b32ba..07521c9 100644 --- a/sim/common/syscall.c +++ b/sim/common/syscall.c @@ -471,6 +471,50 @@ cb_syscall (cb, sc) } break; + case CB_SYS_lstat : + { + char *path, *buf; + int buflen; + struct stat statbuf; + TADDR addr = sc->arg2; + + errcode = get_path (cb, sc, sc->arg1, &path); + if (errcode != 0) + { + result = -1; + goto FinishSyscall; + } + result = (*cb->lstat) (cb, path, &statbuf); + free (path); + if (result < 0) + goto ErrorFinish; + + buflen = cb_host_to_target_stat (cb, NULL, NULL); + buf = xmalloc (buflen); + if (cb_host_to_target_stat (cb, &statbuf, buf) != buflen) + { + /* The translation failed. This is due to an internal + host program error, not the target's fault. + Unfortunately, it's hard to test this case, so there's no + test-case for this execution path. */ + free (buf); + errcode = ENOSYS; + result = -1; + goto FinishSyscall; + } + + if ((*sc->write_mem) (cb, sc, addr, buf, buflen) != buflen) + { + free (buf); + errcode = EINVAL; + result = -1; + goto FinishSyscall; + } + + free (buf); + } + break; + case CB_SYS_time : { /* FIXME: May wish to change CB_SYS_time to something else. |