From: Hans-Peter Nilsson Date: Mon, 13 Dec 2004 00:38:38 +0000 (+0000) Subject: * syscall.c (cb_syscall) : New case. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0d3cd463e38ed3e3f7ae27ca38c00170150a275f;p=binutils-gdb.git * syscall.c (cb_syscall) : New case. * callback.c (os_lstat): New function. --- diff --git a/sim/common/ChangeLog b/sim/common/ChangeLog index bc71bc9d624..0213a9c6dac 100644 --- a/sim/common/ChangeLog +++ b/sim/common/ChangeLog @@ -1,3 +1,8 @@ +2004-12-13 Hans-Peter Nilsson + + * syscall.c (cb_syscall) : New case. + * callback.c (os_lstat): New function. + 2004-12-08 Hans-Peter Nilsson * run.1: Document --sysroot=filepath. diff --git a/sim/common/callback.c b/sim/common/callback.c index 22047876277..7ba0c06fb06 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 76b32bafe16..07521c93c90 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.