move all security policy stuff out of userspace
[nestedvm.git] / src / org / ibex / nestedvm / support_aux.c
index c309899..fcb7b31 100644 (file)
 #include <signal.h>
 #include <sys/sysctl.h>
 #include <sys/utsname.h>
-#include <nestedvm/sockets.h>
 #include <paths.h>
 
+#include <nestedvm/socket.h>
+
 int _syscall_set_errno(struct _reent *ptr, int err) {
     ptr->_errno = -err;
     return -1;
 }
 
-extern int _stat_r(struct _reent *, const char *, struct stat *);
-int _access_r(struct _reent *ptr, const char *pathname, int mode) {
-    struct stat statbuf;
-    if(_stat_r(ptr,pathname,&statbuf) < 0) return -1;
-    return 0;
-}
-
-/* NestedVM doesn't, and probably never will, support this security related stuff */
-uid_t getuid() { return 0; }
-gid_t getgid() { return 0; }
-uid_t geteuid() { return 0; }
-gid_t getegid() { return 0; }
-int getgroups(int gidsetlen, gid_t *gidset) {
-    if(gidsetlen) *gidset = 0;
-    return 1;
-}
-mode_t umask(mode_t new) { return 0022; }
-int _chmod_r(struct _reent *ptr, const char *f, mode_t mode) { return 0; }
-int _fchmod_r(struct _reent *ptr, int fd, mode_t mode) { return 0; }
-int _chown_r(struct _reent *ptr, const char *f, uid_t uid, gid_t gid) { return 0; }
-int _fchown_r(struct _reent *ptr, int fd, uid_t uid, gid_t gid) { return 0; }
-
 #define REENT_WRAPPER0R(f,rt) \
     extern rt _##f##_r(struct _reent *ptr); \
     rt f() { return _##f##_r(_REENT); }
@@ -113,12 +92,27 @@ REENT_WRAPPER3(setpriority,int,int,int)
 REENT_WRAPPER3(connect,int,const struct sockaddr *,socklen_t)
 REENT_WRAPPER3(socket,int,int,int)
 REENT_WRAPPER3(_resolve_hostname,const char *,char*,size_t*)
+REENT_WRAPPER3(_resolve_ip,int,char*,size_t)
 REENT_WRAPPER3(accept,int,struct sockaddr *,socklen_t*)
 REENT_WRAPPER5(getsockopt,int,int,int,void*,socklen_t*)
 REENT_WRAPPER5(setsockopt,int,int,int,const void*,socklen_t)
 REENT_WRAPPER3(bind,int,const struct sockaddr *,socklen_t)
 REENT_WRAPPER2(listen,int,int)
 REENT_WRAPPER2(shutdown,int,int)
+REENT_WRAPPER6(sendto,int,const void*,size_t,int,const struct sockaddr*,socklen_t)
+REENT_WRAPPER6(recvfrom,int,void*,size_t,int,struct sockaddr*,socklen_t*)
+REENT_WRAPPER5(select,int,fd_set*,fd_set*,fd_set*,struct timeval*)
+REENT_WRAPPER4(send,int,const void*,size_t,int)
+REENT_WRAPPER4(recv,int,void*,size_t,int)
+REENT_WRAPPER2(getgroups,int,gid_t*)
+REENT_WRAPPER3(getsockname,int,struct sockaddr*,int*)
+REENT_WRAPPER3(getpeername,int,struct sockaddr*,int*)
+REENT_WRAPPER1(setuid,uid_t)
+REENT_WRAPPER1(seteuid,uid_t)
+REENT_WRAPPER1(setgid,gid_t)
+REENT_WRAPPER1(setegid,gid_t)
+REENT_WRAPPER2(setgroups,int,const gid_t *)
+REENT_WRAPPER0R(setsid,pid_t)
 
 extern int __execve_r(struct _reent *ptr, const char *path, char *const argv[], char *const envp[]);
 int _execve(const char *path, char *const argv[], char *const envp[]) {
@@ -155,6 +149,19 @@ long _pathconf_r(struct _reent *ptr,const char *path, int name) {
     }
 }
 
+int _sysctl_r(struct _reent *ptr, int *name, int namelen, void *oldp, size_t *oldlen, void *newp, size_t newlen) {
+    if(name[0] != CTL_USER) return _sysctl(name,namelen,oldp,oldlen,newp,newlen);
+    if(newp != NULL) { ptr->_errno = EPERM; return -1; }
+    if(namelen != 2) { ptr->_errno = EINVAL; return -1; }
+    
+    switch(name[1]) {
+        default:
+            fprintf(stderr,"WARNING: sysctl: Unknown name: %d\n",name[1]);
+            ptr->_errno = EINVAL;
+            return -1;
+    }
+}
+
 void sync() {
     /* do nothing*/
 }
@@ -425,6 +432,88 @@ const char *path;
     return(bname);
 }
 
+/* FreeBSD's uname */
+int
+uname(name)
+struct utsname *name;
+{
+       int mib[2], rval;
+       size_t len;
+       char *p;
+       int oerrno;
+    
+       rval = 0;
+    
+       mib[0] = CTL_KERN;
+       mib[1] = KERN_OSTYPE;
+       len = sizeof(name->sysname);
+       oerrno = errno;
+       if (sysctl(mib, 2, &name->sysname, &len, NULL, 0) == -1) {
+               if(errno == ENOMEM)
+                       errno = oerrno;
+               else
+                       rval = -1;
+       }
+       name->sysname[sizeof(name->sysname) - 1] = '\0';
+    
+       mib[0] = CTL_KERN;
+       mib[1] = KERN_HOSTNAME;
+       len = sizeof(name->nodename);
+       oerrno = errno;
+       if (sysctl(mib, 2, &name->nodename, &len, NULL, 0) == -1) {
+               if(errno == ENOMEM)
+                       errno = oerrno;
+               else
+                       rval = -1;
+       }
+       name->nodename[sizeof(name->nodename) - 1] = '\0';
+    
+       mib[0] = CTL_KERN;
+       mib[1] = KERN_OSRELEASE;
+       len = sizeof(name->release);
+       oerrno = errno;
+       if (sysctl(mib, 2, &name->release, &len, NULL, 0) == -1) {
+               if(errno == ENOMEM)
+                       errno = oerrno;
+               else
+                       rval = -1;
+       }
+       name->release[sizeof(name->release) - 1] = '\0';
+    
+       /* The version may have newlines in it, turn them into spaces. */
+       mib[0] = CTL_KERN;
+       mib[1] = KERN_VERSION;
+       len = sizeof(name->version);
+       oerrno = errno;
+       if (sysctl(mib, 2, &name->version, &len, NULL, 0) == -1) {
+               if (errno == ENOMEM)
+                       errno = oerrno;
+               else
+                       rval = -1;
+       }
+       name->version[sizeof(name->version) - 1] = '\0';
+       for (p = name->version; len--; ++p) {
+               if (*p == '\n' || *p == '\t') {
+                       if (len > 1)
+                               *p = ' ';
+                       else
+                               *p = '\0';
+               }
+       }
+    
+       mib[0] = CTL_HW;
+       mib[1] = HW_MACHINE;
+       len = sizeof(name->machine);
+       oerrno = errno;
+       if (sysctl(mib, 2, &name->machine, &len, NULL, 0) == -1) {
+               if (errno == ENOMEM)
+                       errno = oerrno;
+               else
+                       rval = -1;
+       }
+       name->machine[sizeof(name->machine) - 1] = '\0';
+       return (rval);
+}
 
 /* FreeBSD's daemon() - modified for nestedvm */
 int
@@ -442,8 +531,8 @@ int nochdir, noclose;
             _exit(0);
        }
     
-       /*if (setsid() == -1)
-               return (-1);*/
+       if (setsid() == -1)
+               return (-1);
     
        if (!nochdir)
                (void)chdir("/");