X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Fliburi.so_src%2Fmain.c;h=ca7194068832372f03e9a303b9075ee0d812e9be;hb=e7a76b0d8a0cc6aa77966509780973a6f8216ef7;hp=2d785f3eed3b1494e094db53cf2bdf616f0edf9d;hpb=7bc1f2fbeb70981e23b427e72d3f3d195c104884;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/liburi.so_src/main.c b/Usermode/Libraries/liburi.so_src/main.c index 2d785f3e..ca719406 100644 --- a/Usermode/Libraries/liburi.so_src/main.c +++ b/Usermode/Libraries/liburi.so_src/main.c @@ -2,7 +2,6 @@ * Acess2 - URI Parser and opener * By John Hodge (thePowersGang) */ -#include #include #include #include @@ -12,7 +11,7 @@ // === STRUCTURES === struct sURIFile { - int Handle; + void *Handle; int Mode; tURIHandler *Handler; int CurBlockOffset; @@ -22,21 +21,26 @@ struct sURIFile // === PROTOTYPES === int SoMain(void); tURI *URI_Parse(const char *String); -tURIFile *URI_MakeHandle(int Mode, int Handle, tURIHandler *Handler); +tURIFile *URI_MakeHandle(int Mode, void *Handle, tURIHandler *Handler); tURIFile *URI_Open(int Mode, tURI *URI); size_t URI_Read(tURIFile *File, size_t Bytes, void *Buffer); size_t URI_Write(tURIFile *File, size_t Bytes, void *Buffer); void URI_Close(tURIFile *File); // --- file:/// handler - int URI_file_Open(char *Host, int Port, char *Path, int Mode); -size_t URI_file_Read(int Handle, size_t Bytes, void *Buffer); -size_t URI_file_Write(int Handle, size_t Bytes, void *Buffer); -void URI_file_Close(int Handle); +void *URI_file_Open(const char *Host, int Port, const char *Path, int Mode); +void URI_file_Close(void *Handle); +size_t URI_file_Read(void *Handle, size_t Bytes, void *Buffer); +size_t URI_file_Write(void *Handle, size_t Bytes, const void *Buffer); +off_t URI_file_GetSize(void *Handle); // === CONSTANTS === // Builtin URI protocol handlers tURIHandler caBuiltinHandlers[] = { - {"file", 0, URI_file_Open, URI_file_Close, URI_file_Read, URI_file_Write} + {"file", 0, + URI_file_Open, URI_file_Close, + URI_file_Read, URI_file_Write, + URI_file_GetSize + } }; #define NUM_BUILTIN_HANDLERS (sizeof(caBuiltinHandlers)/sizeof(caBuiltinHandlers[0])) @@ -55,14 +59,14 @@ tURI *URI_Parse(const char *String) if(!String) return NULL; protolen = 0; - while( isalpha(*tmp) ) tmp++, protolen++; + while( isalpha(*tmp) || isdigit(*tmp) ) tmp++, protolen++; // true URI if(tmp[0] == ':' && tmp[1] == '/' && tmp[2] == '/') { int hostlen, portlen, pathlen; tmp += 3; // Eat '://' - ret = malloc(sizeof(tURI) + strlen(String) - 2); + ret = malloc(sizeof(tURI) + protolen + 1 + strlen(tmp) + 1); ret->Proto = (char*)ret + sizeof(tURI); memcpy(ret->Proto, String, protolen); @@ -75,7 +79,7 @@ tURI *URI_Parse(const char *String) if( *tmp == '[' ) { tmp ++; - while( *tmp != ']' ) { + while( *tmp && *tmp != ']' ) { ret->Host[hostlen] = *tmp; tmp ++; hostlen ++; @@ -86,7 +90,7 @@ tURI *URI_Parse(const char *String) // IPv4/DNS else { - while( *tmp != '/' && *tmp != ':' ) + while( *tmp && *tmp != '/' && *tmp != ':' ) { ret->Host[hostlen] = *tmp; tmp ++; @@ -119,6 +123,7 @@ tURI *URI_Parse(const char *String) else { ret->PortStr = NULL; ret->PortNum = -1; + portlen = 0; } if(*tmp == '\0') @@ -138,14 +143,7 @@ tURI *URI_Parse(const char *String) else ret->Path = ret->Host + hostlen + 1; - tmp ++; - pathlen = 0; - while(*tmp) - { - ret->Path[pathlen] = *tmp; - tmp ++; - pathlen ++; - } + strcpy(ret->Path, tmp); return ret; } @@ -169,7 +167,7 @@ tURI *URI_Parse(const char *String) } } -tURIFile *URI_MakeHandle(int Mode, int Handle, tURIHandler *Handler) +tURIFile *URI_MakeHandle(int Mode, void *Handle, tURIHandler *Handler) { tURIFile *ret; @@ -188,7 +186,7 @@ tURIFile *URI_Open(int Mode, tURI *URI) { tURIHandler *handler; tURIFile *ret; - int handle; + void *handle; int i; if(!URI) @@ -213,7 +211,7 @@ tURIFile *URI_Open(int Mode, tURI *URI) handle = handler->Open(URI->Host, URI->PortNum, URI->Path, Mode); printf("URI_Open: handle = %i\n", handle); - if(handle == -1) return NULL; + if(handle == NULL) return NULL; printf("URI_MakeHandle(Mode=%i, handle=%i, handler=%p)\n", Mode, handle, handler); @@ -225,6 +223,19 @@ tURIFile *URI_Open(int Mode, tURI *URI) return ret; } +int URI_GetSize(tURIFile *File, size_t *Size) +{ + if( !File || !Size ) return -1; + + if( File->Handler->GetSize ) + { + *Size = File->Handler->GetSize(File->Handle); + return 0; // Success + } + + return 1; // Size not avaliable +} + /** * \brief Read from a URI file */ @@ -235,7 +246,7 @@ size_t URI_Read(tURIFile *File, size_t Bytes, void *Buffer) size_t tmp; printf("URI_Read(File=%p, Bytes=%u, Buffer=%p)\n", - File, Bytes, Buffer); + File, (unsigned int)Bytes, Buffer); if(!File || !Buffer) return -1; if(Bytes == 0) return 0; @@ -295,30 +306,42 @@ size_t URI_Read(tURIFile *File, size_t Bytes, void *Buffer) // ==== // Builtin Handlers // ==== -int URI_file_Open(char *Host, int Port, char *Path, int Mode) +void *URI_file_Open(const char *Host, int Port, const char *Path, int Mode) { - int smode = 0; - if(Mode & URI_MODE_READ) smode |= OPENFLAG_READ; - if(Mode & URI_MODE_WRITE) smode |= OPENFLAG_WRITE; + const char *smode = NULL; + if( (Mode & URI_MODE_READ) && (Mode & URI_MODE_WRITE)) + smode = "r+"; + else if( (Mode & URI_MODE_READ) ) + smode = "r"; + else if( (Mode & URI_MODE_WRITE) ) + smode = "w"; + else + smode = ""; - printf("URI_file_Open: open('%s', 0x%x)\n", Path, smode); - { - int ret; - ret = open(Path, smode); - return ret; - } +// printf("URI_file_Open: open('%s', 0x%x)\n", Path, smode); + return fopen(Path, smode); } -size_t URI_file_Read(int Handle, size_t Bytes, void *Buffer) +size_t URI_file_Read(void *Handle, size_t Bytes, void *Buffer) { - printf("URI_file_Read: (Handle=%i, Bytes=%i, Buffer=%p)\n", - Handle, Bytes, Buffer); - return read(Handle, Bytes, Buffer); +// printf("URI_file_Read: (Handle=%i, Buffer=%p, Bytes=%i)\n", +// Handle, Buffer, (int)Bytes); + return fread(Buffer, Bytes, 1, Handle); } -size_t URI_file_Write(int Handle, size_t Bytes, void *Buffer) +size_t URI_file_Write(void *Handle, size_t Bytes, const void *Buffer) { - return write(Handle, Bytes, Buffer); + return fwrite(Buffer, Bytes, 1, Handle); } -void URI_file_Close(int Handle) +void URI_file_Close(void *Handle) { - close(Handle); + fclose(Handle); } +off_t URI_file_GetSize(void *Handle) +{ + off_t curpos = ftell(Handle); + off_t ret; + fseek(Handle, 0, SEEK_END); + ret = ftell(Handle); + fseek(Handle, curpos, SEEK_SET); + return ret; +} +