/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/

#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dlfcn.h>

#ifdef _cplusplus
extern "C" {
#endif

#ifdef SOLARIS

#include <sys/systeminfo.h>
#include <strings.h>

int   chown  (const char *path, uid_t owner, gid_t group) {return 0;}
int   lchown (const char *path, uid_t owner, gid_t group) {return 0;}
int   fchown (int fildes, uid_t owner, gid_t group)       {return 0;}

uid_t getuid  (void) {return 0;}
int stat(const char *path,  struct stat *buf);
#ifdef __notdef__
uid_t geteuid (void) {return 0;}
gid_t getgid  (void) {return 0;}
gid_t getegid (void) {return 0;}
#endif

int   setuid  (uid_t p)  {return 0;}
int   setgid  (gid_t p)  {return 0;}

/* This is to fool cpio and pkgmk */
int fstat(int fildes, struct stat *buf)
{
    int ret = 0;
    static int (*p_fstat) (int fildes, struct stat *buf) = NULL;
    if (p_fstat == NULL)
        p_fstat = (int (*)(int fildes, struct stat *buf))
            dlsym (RTLD_NEXT, "fstat");
    ret = (*p_fstat)(fildes, buf);
    if (buf != NULL)
    {
        buf->st_uid = 0; /* root */
        buf->st_gid = 2; /* bin */
    }

    return ret;
}

/* this is to fool mkdir, don't allow to remove owner execute right from directories */
int chmod(const char *path, mode_t mode)
{
    int ret = 0;
    static int (*p_chmod) (const char *path, mode_t mode) = NULL;
    if (p_chmod == NULL)
        p_chmod = (int (*)(const char *path, mode_t mode))
            dlsym (RTLD_NEXT, "chmod");

	if ((mode & S_IXUSR) == 0)
	{
		struct stat statbuf;
		if (stat(path, &statbuf) == 0)
		{
			if ((statbuf.st_mode & S_IFDIR) != 0)
				mode = (mode | S_IXUSR);
		}
	}

    ret = (*p_chmod)(path, mode);
    return ret;
}



/* This is to fool tar */
int fstatat64(int fildes, const char *path, struct stat64  *buf, int flag)
{
    int ret = 0;
    static int (*p_fstatat) (int fildes, const char *path, struct stat64 *buf, int flag) = NULL;
    if (p_fstatat == NULL)
        p_fstatat = (int (*)(int fildes, const char *path, struct stat64 *buf, int flag))
            dlsym (RTLD_NEXT, "fstatat64");
    ret = (*p_fstatat)(fildes, path, buf, flag);
    if (buf != NULL)
    {
        buf->st_uid = 0; /* root */
        buf->st_gid = 2; /* bin */
    }

    return ret;
}
#elif  defined LINUX

uid_t getuid  (void)    {return 0;}
uid_t geteuid (void)    {return 0;}
int setgid    (gid_t p) {return 0;}

/* This is to fool epm, tar, dpkg, et.al. into thinking we are root */
#ifdef X86_64
int __lxstat(int n, const char *path, struct stat *buf)
{
    int ret = 0;
    static int (*p_lstat) (int n, const char *path, struct stat *buf) = NULL;
    if (p_lstat == NULL)
        p_lstat = (int (*)(int n, const char *path, struct stat *buf))
            dlsym (RTLD_NEXT, "__lxstat");
    ret = (*p_lstat)(n, path, buf);
    if (buf != NULL)
    {
        buf->st_uid = 0; /* root */
        buf->st_gid = 0; /* root */
    }
    return ret;
}
#else
int __lxstat64(int n, const char *path, struct stat64 *buf)
{
    int ret = 0;
    static int (*p_lstat) (int n, const char *path, struct stat64 *buf) = NULL;
    if (p_lstat == NULL)
        p_lstat = (int (*)(int n, const char *path, struct stat64 *buf))
            dlsym (RTLD_NEXT, "__lxstat64");
    ret = (*p_lstat)(n, path, buf);
    if (buf != NULL)
    {
        buf->st_uid = 0;
        buf->st_gid = 0;
    }
    return ret;
}
#endif
#endif

#ifdef _cplusplus
}
#endif
