OSDN Git Service

* syscall.c (cb_syscall) <case CB_SYS_lstat>: New case.
authorhp <hp>
Mon, 13 Dec 2004 00:38:38 +0000 (00:38 +0000)
committerhp <hp>
Mon, 13 Dec 2004 00:38:38 +0000 (00:38 +0000)
* callback.c (os_lstat): New function.

sim/common/ChangeLog
sim/common/callback.c
sim/common/syscall.c

index bc71bc9..0213a9c 100644 (file)
@@ -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.
index 2204787..7ba0c06 100644 (file)
@@ -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,
index 76b32ba..07521c9 100644 (file)
@@ -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.