Move sys_readlink() to libreplace.
[ira/wip.git] / source3 / lib / system.c
index 604228233cd78b13ad74c6d3c22daa05e6cf9de2..ac64954107473d64063d66507bedc63f2c640223 100644 (file)
@@ -573,11 +573,7 @@ char *sys_getwd(char *s)
 {
        char *wd;
 #ifdef HAVE_GETCWD
-#ifdef PATH_MAX
        wd = (char *)getcwd(s, PATH_MAX);
-#else
-       wd = (char *)getcwd(s, sizeof (pstring));
-#endif
 #else
        wd = (char *)getwd(s);
 #endif
@@ -598,53 +594,6 @@ int sys_symlink(const char *oldpath, const char *newpath)
 #endif
 }
 
-/*******************************************************************
-system wrapper for readlink
-********************************************************************/
-
-int sys_readlink(const char *path, char *buf, size_t bufsiz)
-{
-#ifndef HAVE_READLINK
-       errno = ENOSYS;
-       return -1;
-#else
-       return readlink(path, buf, bufsiz);
-#endif
-}
-
-/*******************************************************************
-system wrapper for link
-********************************************************************/
-
-int sys_link(const char *oldpath, const char *newpath)
-{
-#ifndef HAVE_LINK
-       errno = ENOSYS;
-       return -1;
-#else
-       return link(oldpath, newpath);
-#endif
-}
-
-/*******************************************************************
-chown isn't used much but OS/2 doesn't have it
-********************************************************************/
-
-int sys_chown(const char *fname,uid_t uid,gid_t gid)
-{
-#ifndef HAVE_CHOWN
-       static int done;
-       if (!done) {
-               DEBUG(1,("WARNING: no chown!\n"));
-               done=1;
-       }
-       errno = ENOSYS;
-       return -1;
-#else
-       return(chown(fname,uid,gid));
-#endif
-}
-
 /*******************************************************************
  Wrapper for lchown.
 ********************************************************************/
@@ -684,24 +633,6 @@ int sys_chroot(const char *dname)
 
 #if defined(HAVE_POSIX_CAPABILITIES)
 
-#ifdef HAVE_SYS_CAPABILITY_H
-
-#if defined(BROKEN_REDHAT_7_SYSTEM_HEADERS) && !defined(_I386_STATFS_H) && !defined(_PPC_STATFS_H)
-#define _I386_STATFS_H
-#define _PPC_STATFS_H
-#define BROKEN_REDHAT_7_STATFS_WORKAROUND
-#endif
-
-#include <sys/capability.h>
-
-#ifdef BROKEN_REDHAT_7_STATFS_WORKAROUND
-#undef _I386_STATFS_H
-#undef _PPC_STATFS_H
-#undef BROKEN_REDHAT_7_STATFS_WORKAROUND
-#endif
-
-#endif /* HAVE_SYS_CAPABILITY_H */
-
 /**************************************************************************
  Try and abstract process capabilities (for systems that have them).
 ****************************************************************************/
@@ -753,6 +684,11 @@ static bool set_process_capability(enum smbd_capability capability,
 #elif CAP_MKNOD
                        /* Linux has CAP_MKNOD for DMAPI access. */
                        cap_vals[num_cap_vals++] = CAP_MKNOD;
+#endif
+                       break;
+               case LEASE_CAPABILITY:
+#ifdef CAP_LEASE
+                       cap_vals[num_cap_vals++] = CAP_LEASE;
 #endif
                        break;
        }
@@ -1056,81 +992,6 @@ void sys_endpwent(void)
  Wrappers for getpwnam(), getpwuid(), getgrnam(), getgrgid()
 ****************************************************************************/
 
-#ifdef ENABLE_BUILD_FARM_HACKS
-
-/*
- * In the build farm we want to be able to join machines to the domain. As we
- * don't have root access, we need to bypass direct access to /etc/passwd
- * after a user has been created via samr. Fake those users.
- */
-
-static struct passwd *fake_pwd;
-static int num_fake_pwd;
-
-struct passwd *sys_getpwnam(const char *name)
-{
-       int i;
-
-       for (i=0; i<num_fake_pwd; i++) {
-               if (strcmp(fake_pwd[i].pw_name, name) == 0) {
-                       DEBUG(10, ("Returning fake user %s\n", name));
-                       return &fake_pwd[i];
-               }
-       }
-
-       return getpwnam(name);
-}
-
-struct passwd *sys_getpwuid(uid_t uid)
-{
-       int i;
-
-       for (i=0; i<num_fake_pwd; i++) {
-               if (fake_pwd[i].pw_uid == uid) {
-                       DEBUG(10, ("Returning fake user %s\n",
-                                  fake_pwd[i].pw_name));
-                       return &fake_pwd[i];
-               }
-       }
-
-       return getpwuid(uid);
-}
-
-void faked_create_user(const char *name)
-{
-       int i;
-       uid_t uid;
-       struct passwd new_pwd;
-
-       for (i=0; i<10; i++) {
-               generate_random_buffer((unsigned char *)&uid,
-                                      sizeof(uid));
-               if (getpwuid(uid) == NULL) {
-                       break;
-               }
-       }
-
-       if (i==10) {
-               /* Weird. No free uid found... */
-               return;
-       }
-
-       new_pwd.pw_name = SMB_STRDUP(name);
-       new_pwd.pw_passwd = SMB_STRDUP("x");
-       new_pwd.pw_uid = uid;
-       new_pwd.pw_gid = 100;
-       new_pwd.pw_gecos = SMB_STRDUP("faked user");
-       new_pwd.pw_dir = SMB_STRDUP("/nodir");
-       new_pwd.pw_shell = SMB_STRDUP("/bin/false");
-
-       ADD_TO_ARRAY(NULL, struct passwd, new_pwd, &fake_pwd,
-                    &num_fake_pwd);
-
-       DEBUG(10, ("Added fake user %s, have %d fake users\n",
-                  name, num_fake_pwd));
-}
-
-#else
 
 struct passwd *sys_getpwnam(const char *name)
 {
@@ -1142,8 +1003,6 @@ struct passwd *sys_getpwuid(uid_t uid)
        return getpwuid(uid);
 }
 
-#endif
-
 struct group *sys_getgrnam(const char *name)
 {
        return getgrnam(name);
@@ -2016,11 +1875,6 @@ int sys_fremovexattr (int filedes, const char *name)
 #endif
 }
 
-#if !defined(HAVE_SETXATTR)
-#define XATTR_CREATE  0x1       /* set value, fail if attr already exists */
-#define XATTR_REPLACE 0x2       /* set value, fail if attr does not exist */
-#endif
-
 int sys_setxattr (const char *path, const char *name, const void *value, size_t size, int flags)
 {
 #if defined(HAVE_SETXATTR)
@@ -2071,9 +1925,10 @@ int sys_setxattr (const char *path, const char *name, const void *value, size_t
 #elif defined(HAVE_ATTROPEN)
        int ret = -1;
        int myflags = O_RDWR;
+       int attrfd;
        if (flags & XATTR_CREATE) myflags |= O_EXCL;
        if (!(flags & XATTR_REPLACE)) myflags |= O_CREAT;
-       int attrfd = solaris_attropen(path, name, myflags, (mode_t) SOLARIS_ATTRMODE);
+       attrfd = solaris_attropen(path, name, myflags, (mode_t) SOLARIS_ATTRMODE);
        if (attrfd >= 0) {
                ret = solaris_write_xattr(attrfd, value, size);
                close(attrfd);
@@ -2134,9 +1989,10 @@ int sys_lsetxattr (const char *path, const char *name, const void *value, size_t
 #elif defined(HAVE_ATTROPEN)
        int ret = -1;
        int myflags = O_RDWR | AT_SYMLINK_NOFOLLOW;
+       int attrfd;
        if (flags & XATTR_CREATE) myflags |= O_EXCL;
        if (!(flags & XATTR_REPLACE)) myflags |= O_CREAT;
-       int attrfd = solaris_attropen(path, name, myflags, (mode_t) SOLARIS_ATTRMODE);
+       attrfd = solaris_attropen(path, name, myflags, (mode_t) SOLARIS_ATTRMODE);
        if (attrfd >= 0) {
                ret = solaris_write_xattr(attrfd, value, size);
                close(attrfd);
@@ -2198,9 +2054,10 @@ int sys_fsetxattr (int filedes, const char *name, const void *value, size_t size
 #elif defined(HAVE_ATTROPEN)
        int ret = -1;
        int myflags = O_RDWR | O_XATTR;
+       int attrfd;
        if (flags & XATTR_CREATE) myflags |= O_EXCL;
        if (!(flags & XATTR_REPLACE)) myflags |= O_CREAT;
-       int attrfd = solaris_openat(filedes, name, myflags, (mode_t) SOLARIS_ATTRMODE);
+       attrfd = solaris_openat(filedes, name, myflags, (mode_t) SOLARIS_ATTRMODE);
        if (attrfd >= 0) {
                ret = solaris_write_xattr(attrfd, value, size);
                close(attrfd);
@@ -2271,7 +2128,6 @@ static ssize_t solaris_list_xattr(int attrdirfd, char *list, size_t size)
                                break;
                        } else {
                                safe_strcpy(list + len, de->d_name, listlen);
-                               pstrcpy(list + len, de->d_name);
                                len += listlen;
                                list[len] = '\0';
                                ++len;
@@ -2545,3 +2401,45 @@ int sys_getpeereid( int s, uid_t *uid)
        return -1;
 #endif
 }
+
+int sys_getnameinfo(const struct sockaddr *psa,
+                       socklen_t salen,
+                       char *host,
+                       size_t hostlen,
+                       char *service,
+                       size_t servlen,
+                       int flags)
+{
+       /*
+        * For Solaris we must make sure salen is the
+        * correct length for the incoming sa_family.
+        */
+
+       if (salen == sizeof(struct sockaddr_storage)) {
+               salen = sizeof(struct sockaddr_in);
+#if defined(HAVE_IPV6)
+               if (psa->sa_family == AF_INET6) {
+                       salen = sizeof(struct sockaddr_in6);
+               }
+#endif
+       }
+       return getnameinfo(psa, salen, host, hostlen, service, servlen, flags);
+}
+
+int sys_connect(int fd, const struct sockaddr * addr)
+{
+       socklen_t salen = -1;
+
+       if (addr->sa_family == AF_INET) {
+           salen = sizeof(struct sockaddr_in);
+       } else if (addr->sa_family == AF_UNIX) {
+           salen = sizeof(struct sockaddr_un);
+       }
+#if defined(HAVE_IPV6)
+       else if (addr->sa_family == AF_INET6) {
+           salen = sizeof(struct sockaddr_in6);
+       }
+#endif
+
+       return connect(fd, addr, salen);
+}