#if HAVE_CONFIG_H
#include "clamav-config.h"
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <errno.h>
#include <pwd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <time.h>
#include <fcntl.h>
#include <signal.h>
#include <target.h>
#include "output.h"
#include "others.h"
int fileinfo(const char *filename, short i)
{
struct stat infostruct;
if(stat(filename, &infostruct) == -1)
return(-1);
switch(i) {
case 1:
return infostruct.st_size;
case 2:
return (mode_t)infostruct.st_mode;
case 3:
return infostruct.st_mtime;
case 4:
return infostruct.st_uid;
case 5:
return infostruct.st_gid;
default:
mprintf("!fileinfo(): Unknown option.\n");
exit(1);
}
}
int checkaccess(const char *path, const char *username, int mode)
{
struct passwd *user;
int ret = 0, status;
if(!geteuid()) {
if((user = getpwnam(username)) == NULL) {
return -1;
}
switch(fork()) {
case -1:
return -2;
case 0:
if(setgid(user->pw_gid)) {
fprintf(stderr, "ERROR: setgid(%d) failed.\n", (int) user->pw_gid);
exit(0);
}
if(setuid(user->pw_uid)) {
fprintf(stderr, "ERROR: setuid(%d) failed.\n", (int) user->pw_uid);
exit(0);
}
if(access(path, mode))
exit(0);
else
exit(1);
default:
wait(&status);
if(WIFEXITED(status) && WEXITSTATUS(status) == 1)
ret = 1;
}
} else {
if(!access(path, mode))
ret = 1;
}
return ret;
}
int filecopy(const char *src, const char *dest)
{
#ifdef C_DARWIN
char *ditto = (char *) mcalloc(strlen(src) + strlen(dest) + 30, sizeof(char));
sprintf(ditto, "/usr/bin/ditto --rsrc %s %s", src, dest);
if(system(ditto)) {
free(ditto);
return -1;
}
free(ditto);
return 0;
#else
char buffer[FILEBUFF];
int s, d, bytes;
if((s = open(src, O_RDONLY)) == -1)
return -1;
if((d = open(dest, O_CREAT|O_WRONLY|O_TRUNC)) == -1) {
close(s);
return -1;
}
while((bytes = read(s, buffer, FILEBUFF)) > 0)
write(d, buffer, bytes);
close(s);
return close(d);
#endif //__APPLE_CC__
}
int isnumb(const char *str)
{
int i;
for(i = 0; i < strlen(str); i++)
if(!isdigit(str[i]))
return 0;
return 1;
}