/**************************************************************
 * 
 * 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;}

/* This is to fool tar */
#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

