#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); }
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[]) {
}
}
+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*/
}
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
_exit(0);
}
- /*if (setsid() == -1)
- return (-1);*/
+ if (setsid() == -1)
+ return (-1);
if (!nochdir)
(void)chdir("/");