mirror of
https://github.com/kingk85/uFTP.git
synced 2025-04-23 01:48:40 +03:00
857 lines
23 KiB
C
Executable File
857 lines
23 KiB
C
Executable File
/*
|
||
* The MIT License
|
||
*
|
||
* Copyright 2018 Ugo Cirmignani.
|
||
*
|
||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
* of this software and associated documentation files (the "Software"), to deal
|
||
* in the Software without restriction, including without limitation the rights
|
||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||
* copies of the Software, and to permit persons to whom the Software is
|
||
* furnished to do so, subject to the following conditions:
|
||
*
|
||
* The above copyright notice and this permission notice shall be included in
|
||
* all copies or substantial portions of the Software.
|
||
*
|
||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||
* THE SOFTWARE.
|
||
*/
|
||
|
||
#include <pwd.h>
|
||
#include <grp.h>
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
#include <dirent.h>
|
||
#include <sys/stat.h>
|
||
#include <sys/statvfs.h>
|
||
#include <sys/types.h>
|
||
#include <unistd.h>
|
||
#include <fcntl.h>
|
||
#include <sys/resource.h>
|
||
|
||
#include "fileManagement.h"
|
||
#include "dynamicVectors.h"
|
||
#include "dynamicMemory.h"
|
||
#include "../debugHelper.h"
|
||
|
||
static int FILE_CompareString(const void * a, const void * b);
|
||
static int FILE_CompareString(const void * a, const void * b)
|
||
{
|
||
return strcmp (*(const char **) a, *(const char **) b);
|
||
}
|
||
|
||
static int FILE_CompareStringParameter(const void * a, const void * b);
|
||
|
||
static int FILE_CompareStringParameter(const void * a, const void * b)
|
||
{
|
||
const FILE_StringParameter_DataType * typeA = *(const FILE_StringParameter_DataType **)a;
|
||
const FILE_StringParameter_DataType * typeB = *(const FILE_StringParameter_DataType **)b;
|
||
//my_printf("Comparing %s with %s",typeA->Name, typeB->Name);
|
||
return strcmp(typeA->Name, typeB->Name);
|
||
}
|
||
|
||
static time_t convertToUTC(time_t inputTime);
|
||
|
||
time_t convertToUTC(time_t inputTime)
|
||
{
|
||
struct tm *utc_tm;
|
||
time_t utc_time;
|
||
utc_tm = gmtime(&inputTime);
|
||
utc_time = mktime(utc_tm);
|
||
|
||
//my_printf("\nLocal time: %ld", inputTime);
|
||
//my_printf("\nutc_time time: %ld", utc_time);
|
||
|
||
return utc_time;
|
||
}
|
||
|
||
|
||
int FILE_fdIsValid(int fd)
|
||
{
|
||
return fcntl(fd, F_GETFD);
|
||
}
|
||
|
||
/* Check if inode is a directory */
|
||
int FILE_IsDirectory(char *DirectoryPath)
|
||
{
|
||
struct stat sb;
|
||
if (stat(DirectoryPath, &sb) == 0 && S_ISDIR(sb.st_mode))
|
||
{
|
||
return 1;
|
||
}
|
||
else
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
long int FILE_GetAvailableSpace(const char* path)
|
||
{
|
||
struct statvfs stat;
|
||
|
||
if (statvfs(path, &stat) != 0)
|
||
{
|
||
// error happens, just quits here
|
||
return -1;
|
||
}
|
||
|
||
// the available size is f_bsize * f_bavail
|
||
return stat.f_bsize * stat.f_bavail;
|
||
}
|
||
|
||
/* Get the file size */
|
||
long long int FILE_GetFileSize(FILE *TheFilePointer)
|
||
{
|
||
#ifdef LARGE_FILE_SUPPORT_ENABLED
|
||
//#warning LARGE FILE SUPPORT IS ENABLED!
|
||
long long int Prev = 0, TheFileSize = 0;
|
||
Prev = ftello64(TheFilePointer);
|
||
fseeko64(TheFilePointer, 0, SEEK_END);
|
||
TheFileSize = ftello64(TheFilePointer);
|
||
fseeko64(TheFilePointer, Prev, SEEK_SET);
|
||
return TheFileSize;
|
||
#endif
|
||
|
||
#ifndef LARGE_FILE_SUPPORT_ENABLED
|
||
#warning LARGE FILE SUPPORT IS NOT ENABLED!
|
||
long long int Prev = 0, TheFileSize = 0;
|
||
Prev = ftell(TheFilePointer);
|
||
fseek(TheFilePointer, 0, SEEK_END);
|
||
TheFileSize = ftell(TheFilePointer);
|
||
fseek(TheFilePointer, Prev, SEEK_SET);
|
||
return TheFileSize;
|
||
#endif
|
||
}
|
||
|
||
long long int FILE_GetFileSizeFromPath(char *TheFileName)
|
||
{
|
||
|
||
|
||
#ifdef LARGE_FILE_SUPPORT_ENABLED
|
||
//#warning LARGE FILE SUPPORT IS ENABLED!
|
||
if (FILE_IsFile(TheFileName) == 1)
|
||
{
|
||
FILE *TheFilePointer;
|
||
TheFilePointer = fopen64(TheFileName, "rb");
|
||
long long int Prev = 0, TheFileSize = 0;
|
||
Prev = ftello64(TheFilePointer);
|
||
fseeko64(TheFilePointer, 0L, SEEK_END);
|
||
TheFileSize = ftello64(TheFilePointer);
|
||
fseeko64(TheFilePointer, Prev, SEEK_SET);
|
||
fclose(TheFilePointer);
|
||
return TheFileSize;
|
||
}
|
||
else
|
||
{
|
||
return 0;
|
||
}
|
||
#endif
|
||
|
||
#ifndef LARGE_FILE_SUPPORT_ENABLED
|
||
#warning LARGE FILE SUPPORT IS NOT ENABLED!
|
||
if (FILE_IsFile(TheFileName) == 1)
|
||
{
|
||
FILE *TheFilePointer;
|
||
TheFilePointer = fopen(TheFileName, "rb");
|
||
long long int Prev = 0, TheFileSize = 0;
|
||
Prev = ftell(TheFilePointer);
|
||
fseek(TheFilePointer, 0L, SEEK_END);
|
||
TheFileSize = ftell(TheFilePointer);
|
||
fseek(TheFilePointer, Prev, SEEK_SET);
|
||
fclose(TheFilePointer);
|
||
return TheFileSize;
|
||
}
|
||
else
|
||
{
|
||
return 0;
|
||
}
|
||
#endif
|
||
|
||
|
||
}
|
||
|
||
/* Check if a file is valid */
|
||
int FILE_IsFile(const char *TheFileName)
|
||
{
|
||
FILE *TheFile;
|
||
|
||
#ifdef LARGE_FILE_SUPPORT_ENABLED
|
||
//#warning LARGE FILE SUPPORT IS ENABLED!
|
||
TheFile = fopen64(TheFileName, "rb");
|
||
#endif
|
||
|
||
#ifndef LARGE_FILE_SUPPORT_ENABLED
|
||
#warning LARGE FILE SUPPORT IS NOT ENABLED!
|
||
TheFile = fopen(TheFileName, "rb");
|
||
#endif
|
||
|
||
if (TheFile != NULL)
|
||
{
|
||
fclose(TheFile);
|
||
return 1;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
void FILE_GetDirectoryInodeList(char * DirectoryInodeName, char *** InodeList, int * FilesandFolders, int Recursive, char * commandOps, DYNMEM_MemoryTable_DataType ** memoryTable)
|
||
{
|
||
int FileAndFolderIndex = *FilesandFolders;
|
||
my_printf("\nLIST DETAILS OF: %s", DirectoryInodeName);
|
||
my_printf("\ncommandOps: %s", commandOps);
|
||
|
||
//Allocate the array for the 1st time
|
||
if (*InodeList == NULL)
|
||
{
|
||
(*InodeList) = (char **) DYNMEM_malloc(sizeof(char *), memoryTable, "InodeList");
|
||
}
|
||
|
||
if (FILE_IsDirectory(DirectoryInodeName))
|
||
{
|
||
DIR *TheDirectory;
|
||
struct dirent *dir;
|
||
TheDirectory = opendir(DirectoryInodeName);
|
||
if (TheDirectory)
|
||
{
|
||
while ((dir = readdir(TheDirectory)) != NULL)
|
||
{
|
||
|
||
if ( dir->d_name[0] == '.' && strnlen(dir->d_name, 2) == 1)
|
||
continue;
|
||
|
||
if ( dir->d_name[0] == '.' && dir->d_name[1] == '.' && strnlen(dir->d_name, 3) == 2)
|
||
continue;
|
||
|
||
//Skips all files and dir starting with .
|
||
if ((dir->d_name[0] == '.' && commandOps == NULL) || (dir->d_name[0] == '.' && commandOps[0] != 'a' && commandOps[0] != 'A'))
|
||
continue;
|
||
|
||
//Set the row to needed size
|
||
int ReallocSize = sizeof(char *) * (FileAndFolderIndex+1)+1;
|
||
(*InodeList) = (char ** ) DYNMEM_realloc((*InodeList), ReallocSize, memoryTable);
|
||
size_t nsize = strnlen(dir->d_name, 256) * sizeof(char) + strlen(DirectoryInodeName) * sizeof(char) + 2;
|
||
//Allocate the path string size
|
||
(*InodeList)[FileAndFolderIndex] = (char *) DYNMEM_malloc (nsize , memoryTable, "InodeList");
|
||
strcpy((*InodeList)[FileAndFolderIndex], DirectoryInodeName );
|
||
strcat((*InodeList)[FileAndFolderIndex], "/" );
|
||
strcat((*InodeList)[FileAndFolderIndex], dir->d_name );
|
||
(*InodeList)[FileAndFolderIndex][ strlen(dir->d_name) + strlen(DirectoryInodeName) + 1 ] = '\0';
|
||
(*FilesandFolders)++;
|
||
FileAndFolderIndex++;
|
||
|
||
if ( Recursive == 1 && FILE_IsDirectory((*InodeList)[*FilesandFolders-1]) == 1 )
|
||
{
|
||
FILE_GetDirectoryInodeList ( (*InodeList)[FileAndFolderIndex-1], InodeList, FilesandFolders, Recursive, "Z", memoryTable);
|
||
FileAndFolderIndex = (*FilesandFolders);
|
||
}
|
||
|
||
}
|
||
closedir(TheDirectory);
|
||
}
|
||
|
||
qsort ((*InodeList), *FilesandFolders, sizeof (const char *), FILE_CompareString);
|
||
}
|
||
else if (FILE_IsFile(DirectoryInodeName))
|
||
{
|
||
//my_printf("\nAdding single file to inode list: %s", DirectoryInodeName);
|
||
int ReallocSize = sizeof(char *) * (FileAndFolderIndex+1)+1;
|
||
(*InodeList) = (char ** ) DYNMEM_realloc((*InodeList), ReallocSize, memoryTable);
|
||
int nsize = strlen(DirectoryInodeName) * sizeof(char) + 2;
|
||
|
||
(*InodeList)[FileAndFolderIndex] = (char *) DYNMEM_malloc (nsize, memoryTable, "InodeList");
|
||
strcpy((*InodeList)[FileAndFolderIndex], DirectoryInodeName );
|
||
(*InodeList)[FileAndFolderIndex][strlen(DirectoryInodeName)] = '\0';
|
||
(*FilesandFolders)++;
|
||
FileAndFolderIndex++;
|
||
}
|
||
else
|
||
{
|
||
//my_printf("\n%s is not a file or a directory", DirectoryInodeName);
|
||
//No valid path specified, returns zero elements
|
||
(*FilesandFolders) = 0;
|
||
}
|
||
}
|
||
|
||
int FILE_GetDirectoryInodeCount(char * DirectoryInodeName)
|
||
{
|
||
int FileAndFolderIndex = 0;
|
||
|
||
DIR *TheDirectory;
|
||
struct dirent *dir;
|
||
TheDirectory = opendir(DirectoryInodeName);
|
||
|
||
if (TheDirectory)
|
||
{
|
||
while ((dir = readdir(TheDirectory)) != NULL)
|
||
{
|
||
if ( dir->d_name[0] == '.' && strnlen(dir->d_name, 2) == 1)
|
||
continue;
|
||
|
||
if ( dir->d_name[0] == '.' && dir->d_name[1] == '.' && strnlen(dir->d_name, 3) == 2)
|
||
continue;
|
||
|
||
FileAndFolderIndex++;
|
||
|
||
}
|
||
|
||
closedir(TheDirectory);
|
||
}
|
||
|
||
return FileAndFolderIndex;
|
||
}
|
||
|
||
int FILE_GetStringFromFile(char * filename, char **file_content, DYNMEM_MemoryTable_DataType ** memoryTable)
|
||
{
|
||
long long int file_size = 0;
|
||
int c, count;
|
||
|
||
if (FILE_IsFile(filename) == 0)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
|
||
#ifdef LARGE_FILE_SUPPORT_ENABLED
|
||
//#warning LARGE FILE SUPPORT IS ENABLED!
|
||
FILE *file = fopen64(filename, "rb");
|
||
#endif
|
||
|
||
#ifndef LARGE_FILE_SUPPORT_ENABLED
|
||
#warning LARGE FILE SUPPORT IS NOT ENABLED!
|
||
FILE *file = fopen(filename, "rb");
|
||
#endif
|
||
|
||
if (file == NULL)
|
||
{
|
||
fclose(file);
|
||
return 0;
|
||
}
|
||
|
||
file_size = FILE_GetFileSize(file);
|
||
|
||
count = 0;
|
||
*file_content = (char *) DYNMEM_malloc((file_size * sizeof(char) + 100), memoryTable, "getstringfromfile");
|
||
|
||
while ((c = fgetc(file)) != EOF)
|
||
{
|
||
(*file_content)[count++] = (char) c;
|
||
}
|
||
(*file_content)[count] = '\0';
|
||
|
||
|
||
|
||
fclose(file);
|
||
|
||
|
||
|
||
return count;
|
||
}
|
||
|
||
void FILE_ReadStringParameters(char * filename, DYNV_VectorGenericDataType *ParametersVector)
|
||
{
|
||
FILE *File;
|
||
char Line[FILE_MAX_LINE_LENGHT];
|
||
int i;
|
||
int c;
|
||
char FirstChar = 0;
|
||
char SeparatorChar = 0;
|
||
char ParameterChar = 0;
|
||
int BufferNameCursor = 0;
|
||
int BufferValueCursor = 0;
|
||
FILE_StringParameter_DataType TheParameter;
|
||
|
||
memset (TheParameter.Name, 0, FILE_MAX_PAR_VAR_SIZE);
|
||
memset (TheParameter.Value, 0, FILE_MAX_PAR_VAR_SIZE);
|
||
|
||
File = fopen(filename, "r");
|
||
if(File == NULL)
|
||
{
|
||
my_printf("error while opening file %s", filename);
|
||
}
|
||
else
|
||
{
|
||
//my_printf("Parameter initializing from file %s", filename);
|
||
|
||
while(fgets(Line, FILE_MAX_LINE_LENGHT, File) != NULL)
|
||
{
|
||
//my_printf("LINE: %s", Line);
|
||
i = 0;
|
||
|
||
while (i<FILE_MAX_LINE_LENGHT)
|
||
{
|
||
c = Line[i++];
|
||
if (((char) c == ' ' && FirstChar != '#') || (char) c == '\r' || (c == 9 && FirstChar != '#' ) || (c == 10) || (c == 13))
|
||
{
|
||
continue;
|
||
}
|
||
|
||
if ((char) c == '\0' )
|
||
{
|
||
if ((FirstChar != '#' && FirstChar != '=' && FirstChar != 0 ) && SeparatorChar == '=' && ParameterChar != 0 )
|
||
{
|
||
TheParameter.Name[BufferNameCursor] = '\0';
|
||
TheParameter.Value[BufferValueCursor] = '\0';
|
||
//my_printf("Adding name: %s value: %s", TheParameter.Name, TheParameter.Value);
|
||
//my_printf("TheParameter.Name[0] = %d", TheParameter.Name[0]);
|
||
|
||
ParametersVector->PushBack(ParametersVector, &TheParameter, sizeof(FILE_StringParameter_DataType));
|
||
BufferNameCursor = 0;
|
||
BufferValueCursor = 0;
|
||
memset (TheParameter.Name, 0, FILE_MAX_PAR_VAR_SIZE);
|
||
memset (TheParameter.Value, 0, FILE_MAX_PAR_VAR_SIZE);
|
||
}
|
||
|
||
FirstChar = 0;
|
||
SeparatorChar = 0;
|
||
ParameterChar = 0;
|
||
|
||
if ((char) c == '\0')
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//my_printf("Checking chars");
|
||
|
||
//first char, parameter name
|
||
if (FirstChar == 0)
|
||
{
|
||
FirstChar = (char) c;
|
||
//my_printf("FirstChar = %c", FirstChar);
|
||
}
|
||
else if (FirstChar != 0 && SeparatorChar == 0 && (char) c == '=')
|
||
{
|
||
SeparatorChar = (char) c;
|
||
//my_printf("SeparatorChar = %c", SeparatorChar);
|
||
}
|
||
else if (FirstChar != 0 && SeparatorChar != 0 && ParameterChar == 0)
|
||
{
|
||
ParameterChar = (char) c;
|
||
//my_printf("ParameterChar = %c", ParameterChar);
|
||
}
|
||
|
||
//Get the parameter name
|
||
if ( FirstChar != '#' && FirstChar != 0 && SeparatorChar == 0 && BufferNameCursor < FILE_MAX_PAR_VAR_SIZE )
|
||
TheParameter.Name[BufferNameCursor++] = (char) c;
|
||
|
||
//Get the parameter value
|
||
if ( FirstChar != '#' && FirstChar != 0 && SeparatorChar != 0 && ParameterChar != 0 && BufferValueCursor < FILE_MAX_PAR_VAR_SIZE )
|
||
TheParameter.Value[BufferValueCursor++] = (char) c;
|
||
}
|
||
}
|
||
}
|
||
|
||
fclose(File);
|
||
}
|
||
|
||
// my_printf("ParametersVector->Size %d", ParametersVector->Size);
|
||
|
||
for (i = 0; i < ParametersVector->Size; i++)
|
||
{
|
||
//my_printf("ParametersVector->Data[%d])->Name = %s",i, ((FILE_StringParameter_DataType *)ParametersVector->Data[i])->Name);
|
||
}
|
||
|
||
qsort(ParametersVector->Data, ParametersVector->Size, sizeof(void *), FILE_CompareStringParameter);
|
||
|
||
//my_printf("Sorted");
|
||
for (i = 0; i < ParametersVector->Size; i++)
|
||
{
|
||
//my_printf("ParametersVector->Data[%d])->Name = %s",i, ((FILE_StringParameter_DataType *)ParametersVector->Data[i])->Name);
|
||
}
|
||
|
||
}
|
||
|
||
int FILE_StringParametersLinearySearch(DYNV_VectorGenericDataType *TheVectorGeneric, void * name)
|
||
{
|
||
|
||
for(int i = 0; i < TheVectorGeneric->Size; i++)
|
||
{
|
||
if(strcmp(((FILE_StringParameter_DataType *)TheVectorGeneric->Data[i])->Name, (char *) name) == 0)
|
||
{
|
||
return i;
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
int FILE_StringParametersBinarySearch(DYNV_VectorGenericDataType *TheVectorGeneric, void * Needle)
|
||
{
|
||
|
||
long long int CompareResult;
|
||
|
||
if (TheVectorGeneric->Size <= 0)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
int littler = 0;
|
||
int last = TheVectorGeneric->Size - 1;
|
||
int middle = (littler + last) / 2;
|
||
|
||
while (littler <= last)
|
||
{
|
||
CompareResult = strcmp(((FILE_StringParameter_DataType *)TheVectorGeneric->Data[middle])->Name, Needle);
|
||
//my_printf("CompareResult = %d.\n", CompareResult);
|
||
|
||
if ((CompareResult == 0))
|
||
{
|
||
//my_printf("%d found at location %d.\n", Needle, middle);
|
||
return middle;
|
||
}
|
||
else if (CompareResult < 0)
|
||
{
|
||
littler = middle + 1;
|
||
//my_printf("Needle bigger than middle at %d .\n", middle);
|
||
}
|
||
else
|
||
{
|
||
last = middle - 1;
|
||
//my_printf("Needle lower than middle at %d.\n", middle);
|
||
}
|
||
|
||
middle = (littler + last)/2;
|
||
}
|
||
|
||
|
||
return -1;
|
||
|
||
}
|
||
|
||
char * FILE_GetFilenameFromPath(char * FileName)
|
||
{
|
||
char * TheStr = FileName;
|
||
for (int i = 0; i< strlen(FileName); i++)
|
||
{
|
||
if (FileName[i] == '/' || FileName[i] == '\\')
|
||
{
|
||
TheStr = FileName+i+1;
|
||
}
|
||
}
|
||
|
||
return TheStr;
|
||
}
|
||
|
||
char * FILE_GetListPermissionsString(char *file, DYNMEM_MemoryTable_DataType ** memoryTable) {
|
||
struct stat st, stl;
|
||
char *modeval = DYNMEM_malloc(sizeof(char) * 10 + 1, memoryTable, "getperm");
|
||
if(stat(file, &st) == 0)
|
||
{
|
||
mode_t perm = st.st_mode;
|
||
modeval[0] = (S_ISDIR(st.st_mode)) ? 'd' : '-';
|
||
modeval[1] = (perm & S_IRUSR) ? 'r' : '-';
|
||
modeval[2] = (perm & S_IWUSR) ? 'w' : '-';
|
||
modeval[3] = (perm & S_IXUSR) ? 'x' : '-';
|
||
modeval[4] = (perm & S_IRGRP) ? 'r' : '-';
|
||
modeval[5] = (perm & S_IWGRP) ? 'w' : '-';
|
||
modeval[6] = (perm & S_IXGRP) ? 'x' : '-';
|
||
modeval[7] = (perm & S_IROTH) ? 'r' : '-';
|
||
modeval[8] = (perm & S_IWOTH) ? 'w' : '-';
|
||
modeval[9] = (perm & S_IXOTH) ? 'x' : '-';
|
||
modeval[10] = '\0';
|
||
|
||
if(lstat(file, &stl) == 0 &&
|
||
S_ISLNK(stl.st_mode))
|
||
{
|
||
modeval[0] = 'l'; // is a link
|
||
}
|
||
|
||
}
|
||
else {
|
||
return NULL;
|
||
}
|
||
|
||
return modeval;
|
||
}
|
||
|
||
int checkParentDirectoryPermissions(char *fileName, int uid, int gid)
|
||
{
|
||
char theFileName[4096];
|
||
memset(theFileName, 0, 4096);
|
||
|
||
size_t theFileNameLen = 0;
|
||
size_t theLen = strlen(fileName);
|
||
size_t theParentLen = 0;
|
||
|
||
for (size_t i = 0; i < theLen; i++)
|
||
{
|
||
if (fileName[i] == '/')
|
||
{
|
||
theParentLen = i;
|
||
}
|
||
}
|
||
|
||
for (size_t i = 0; i < theParentLen; i++)
|
||
{
|
||
if (i < 4096)
|
||
theFileName[theFileNameLen++] = fileName[i];
|
||
}
|
||
|
||
//my_printf ("\n checking parent permissions on : %s", theFileName);
|
||
return checkUserFilePermissions(theFileName, uid, gid);
|
||
}
|
||
|
||
|
||
int checkUserFilePermissions(char *fileName, int uid, int gid)
|
||
{
|
||
|
||
if (uid == 0 || gid == 0)
|
||
{
|
||
//my_printf("\n User is root");
|
||
return FILE_PERMISSION_RW;
|
||
}
|
||
|
||
int filePermissions = FILE_PERMISSION_NO_RW;
|
||
int returnCode = 0;
|
||
char *toReturn;
|
||
struct stat info;
|
||
|
||
if ((returnCode = stat(fileName, &info)) == -1)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
if (info.st_uid == uid ||
|
||
info.st_gid == gid)
|
||
{
|
||
//my_printf("\n User is owner");
|
||
filePermissions = FILE_PERMISSION_RW;
|
||
}
|
||
else
|
||
{
|
||
mode_t perm = info.st_mode;
|
||
if (perm & S_IROTH){
|
||
//my_printf("\nfile can be readen");
|
||
filePermissions |= FILE_PERMISSION_R;
|
||
}
|
||
|
||
if (perm & S_IWOTH){
|
||
//my_printf("\nfile can be written");
|
||
filePermissions |= FILE_PERMISSION_W;
|
||
}
|
||
}
|
||
|
||
return filePermissions;
|
||
}
|
||
|
||
char * FILE_GetOwner(char *fileName, DYNMEM_MemoryTable_DataType **memoryTable)
|
||
{
|
||
int returnCode = 0;
|
||
char *toReturn;
|
||
struct stat info;
|
||
|
||
struct passwd pd;
|
||
struct passwd* pwdptr=&pd;
|
||
struct passwd* tempPwdPtr;
|
||
char pwdbuffer[200];
|
||
int pwdlinelen = sizeof(pwdbuffer);
|
||
|
||
if ((returnCode = stat(fileName, &info)) == -1)
|
||
return NULL;
|
||
|
||
if ((getpwuid_r(info.st_uid, pwdptr, pwdbuffer, pwdlinelen, &tempPwdPtr))!=0)
|
||
return NULL;
|
||
|
||
toReturn = (char *) DYNMEM_malloc (strlen(pd.pw_name) + 1, memoryTable, "getowner");
|
||
strcpy(toReturn, pd.pw_name);
|
||
|
||
return toReturn;
|
||
}
|
||
|
||
char * FILE_GetGroupOwner(char *fileName, DYNMEM_MemoryTable_DataType **memoryTable)
|
||
{
|
||
char *toReturn;
|
||
struct stat info;
|
||
short int lp;
|
||
struct group grp;
|
||
struct group * grpptr=&grp;
|
||
struct group * tempGrpPtr;
|
||
char grpbuffer[200];
|
||
int grplinelen = sizeof(grpbuffer);
|
||
|
||
if (stat(fileName, &info) == -1 )
|
||
return NULL;
|
||
|
||
if ((getgrgid_r(info.st_gid,grpptr,grpbuffer,grplinelen,&tempGrpPtr))!=0)
|
||
return NULL;
|
||
|
||
toReturn = (char *) DYNMEM_malloc (strlen(grp.gr_name) + 1, memoryTable, "getowner");
|
||
strcpy(toReturn, grp.gr_name);
|
||
|
||
return toReturn;
|
||
}
|
||
|
||
|
||
time_t FILE_GetLastModifiedData(char *path)
|
||
{
|
||
struct stat statbuf;
|
||
if (stat(path, &statbuf) == -1)
|
||
{
|
||
time_t theTime = 0;
|
||
return theTime;
|
||
}
|
||
|
||
return convertToUTC(statbuf.st_mtime);
|
||
}
|
||
|
||
void FILE_AppendToString(char ** sourceString, char *theString, DYNMEM_MemoryTable_DataType ** memoryTable)
|
||
{
|
||
size_t theNewSize = strlen(*sourceString) + strlen(theString);
|
||
*sourceString = DYNMEM_realloc(*sourceString, theNewSize + 10, memoryTable);
|
||
strcat(*sourceString, theString);
|
||
(*sourceString)[theNewSize] = '\0';
|
||
}
|
||
|
||
void FILE_DirectoryToParent(char ** sourceString, DYNMEM_MemoryTable_DataType ** memoryTable)
|
||
{
|
||
//my_printf("\n");
|
||
|
||
int theLastSlash = -1;
|
||
size_t strLen = 0;
|
||
|
||
strLen = strlen(*sourceString);
|
||
//my_printf("\nThe directory = %s", (*sourceString));
|
||
//my_printf("\ndirectory to parent strLen = %d", strLen);
|
||
|
||
for (size_t i = 0; i < strLen; i++)
|
||
{
|
||
//my_printf("%c", (*sourceString)[i]);
|
||
if ( (*sourceString)[i] == '/')
|
||
{
|
||
theLastSlash = i;
|
||
}
|
||
}
|
||
|
||
//my_printf("\n theLastSlash = %d", theLastSlash);
|
||
|
||
if (theLastSlash > -1)
|
||
{
|
||
int theNewSize = theLastSlash;
|
||
if (theLastSlash == 0)
|
||
{
|
||
theNewSize = 1;
|
||
}
|
||
|
||
//my_printf("\n theNewSize = %d", theNewSize);
|
||
|
||
*sourceString = DYNMEM_realloc(*sourceString, theNewSize+1, &*memoryTable);
|
||
(*sourceString)[theNewSize] = '\0';
|
||
|
||
//my_printf("\nThe directory upped is = %s", (*sourceString));
|
||
}
|
||
}
|
||
|
||
int FILE_LockFile(int fd)
|
||
{
|
||
struct flock fl;
|
||
fl.l_type = F_WRLCK;
|
||
fl.l_start = 0;
|
||
fl.l_whence = SEEK_SET;
|
||
fl.l_len = 0;
|
||
return(fcntl(fd, F_SETLK, &fl));
|
||
}
|
||
|
||
int FILE_doChownFromUidGid(const char *file_path, uid_t uid, gid_t gid)
|
||
{
|
||
if (chown(file_path, uid, gid) == -1)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
int FILE_doChownFromUidGidString ( const char *file_path,
|
||
const char *user_name,
|
||
const char *group_name)
|
||
{
|
||
uid_t uid;
|
||
gid_t gid;
|
||
const struct group *grp;
|
||
uid = FILE_getUID(user_name);
|
||
gid = FILE_getGID(group_name);
|
||
|
||
if (chown(file_path, uid, gid) == -1)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
uid_t FILE_getUID(const char *user_name)
|
||
{
|
||
struct passwd pd;
|
||
struct passwd* pwdptr=&pd;
|
||
struct passwd* tempPwdPtr;
|
||
char pwdbuffer[200];
|
||
int pwdlinelen = sizeof(pwdbuffer);
|
||
|
||
if ((getpwnam_r(user_name, pwdptr, pwdbuffer, pwdlinelen, &tempPwdPtr))!=0)
|
||
return 0;
|
||
else
|
||
return pd.pw_uid;
|
||
|
||
}
|
||
|
||
gid_t FILE_getGID(const char *group_name)
|
||
{
|
||
short int lp;
|
||
struct group grp;
|
||
struct group * grpptr=&grp;
|
||
struct group * tempGrpPtr;
|
||
|
||
char grpbuffer[200];
|
||
int grplinelen = sizeof(grpbuffer);
|
||
|
||
if ((getgrnam_r(group_name, grpptr, grpbuffer, grplinelen, &tempGrpPtr))!=0)
|
||
return 0;
|
||
else
|
||
return grp.gr_gid;
|
||
}
|
||
|
||
|
||
void FILE_checkAllOpenedFD(void)
|
||
{
|
||
int openedFd = 0;
|
||
int ret;
|
||
|
||
struct rlimit rl;
|
||
if (getrlimit(RLIMIT_NOFILE, &rl) < 0)
|
||
my_printf("%s: can’t get file limit", "");
|
||
|
||
if (rl.rlim_max == RLIM_INFINITY)
|
||
rl.rlim_max = 1024;
|
||
|
||
for (int i = 0; i < rl.rlim_max; i++)
|
||
{
|
||
ret = FILE_fdIsValid(i);
|
||
//my_printf("\nret = %d", ret);
|
||
if (ret != -1)
|
||
{
|
||
struct stat statbuf;
|
||
fstat(i, &statbuf);
|
||
if (S_ISSOCK(statbuf.st_mode))
|
||
{
|
||
//my_printf("\n fd %d is socket", i);
|
||
}
|
||
else if (S_ISDIR(statbuf.st_mode))
|
||
{
|
||
//my_printf("\n fd %d is dir", i);
|
||
}
|
||
|
||
|
||
openedFd++;
|
||
}
|
||
}
|
||
//my_printf("\n\nOpened fd : %d", openedFd);
|
||
}
|