summaryrefslogtreecommitdiffhomepage
path: root/contrib/lar/larlib.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/lar/larlib.c')
-rw-r--r--contrib/lar/larlib.c540
1 files changed, 0 insertions, 540 deletions
diff --git a/contrib/lar/larlib.c b/contrib/lar/larlib.c
deleted file mode 100644
index aa9280a09..000000000
--- a/contrib/lar/larlib.c
+++ /dev/null
@@ -1,540 +0,0 @@
-/*
- * lar - Lua Archive Library
- *
- * Copyright (C) 2009 Jo-Philipp Wich <xm@subsignal.org>
- *
- * Licensed 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 "lua.h"
-#include "lualib.h"
-#include "lauxlib.h"
-#include "lar.h"
-
-typedef struct {
- int fd;
- char *data;
- size_t length;
-} mmap_handle;
-
-static int larlib_perror( lua_State *L, const char *message )
-{
- lua_pushnil(L);
- lua_pushstring(L, message);
-
- return 2;
-}
-
-int larlib_open( lua_State *L )
-{
- lar_archive *ar, **udata;
- const char *filename = luaL_checkstring( L, 1 );
-
- if( filename != NULL && (ar = lar_open(filename)) != NULL )
- {
- if( (udata = lua_newuserdata(L, sizeof(lar_archive *))) != NULL )
- {
- *udata = ar;
- luaL_getmetatable(L, "lar.archive");
- lua_setmetatable(L, -2);
- }
- else
- {
- return luaL_error(L, "Out of memory");
- }
- }
- else
- {
- return larlib_perror(L, "Archive not found");
- }
-
- return 1;
-}
-
-int larlib_find( lua_State *L )
-{
- const char *filename = luaL_checkstring( L, 1 );
- const char *basepath = luaL_optstring( L, 2, "./" );
- int is_pkg = strstr(filename, "/") ? 0 : 1;
- lar_archive *ar, **udata;
-
- if( ((ar = lar_find_archive(filename, basepath, is_pkg)) != NULL) ||
- ((ar = lar_find_archive(filename, LUA_LDIR, is_pkg)) != NULL) ||
- ((ar = lar_find_archive(filename, LUA_CDIR, is_pkg)) != NULL) )
- {
- if( (udata = lua_newuserdata(L, sizeof(lar_archive *))) != NULL )
- {
- *udata = ar;
- luaL_getmetatable(L, "lar.archive");
- lua_setmetatable(L, -2);
- }
- else
- {
- return luaL_error(L, "Out of memory");
- }
- }
- else
- {
- return larlib_perror(L, "Archive not found");
- }
-
- return 1;
-}
-
-int larlib_md5( lua_State *L )
-{
- int i;
- char md5[16], md5_hex[33];
- const char *data = luaL_checkstring( L, 1 );
- md5_state_t state;
-
- md5_init(&state);
- md5_append(&state, (const md5_byte_t *)data, strlen(data));
- md5_finish(&state, (md5_byte_t *)md5);
-
- for( i = 0; i < 16; i++ )
- sprintf(&md5_hex[i*2], "%02x", (unsigned char)md5[i]);
-
- lua_pushstring(L, md5_hex);
- return 1;
-}
-
-int larlib_md5_file( lua_State *L )
-{
- int i, fd, len;
- char md5[16], md5_hex[33], buffer[1024];
- const char *filename = luaL_checkstring( L, 1 );
- md5_state_t state;
-
- if( (fd = open(filename, O_RDONLY)) != -1 )
- {
- md5_init(&state);
-
- while( (len = read(fd, buffer, 1024)) > 0 )
- md5_append(&state, (const md5_byte_t *)buffer, len);
-
- md5_finish(&state, (md5_byte_t *)md5);
-
- for( i = 0; i < 16; i++ )
- sprintf(&md5_hex[i*2], "%02x", (unsigned char)md5[i]);
-
- close(fd);
- lua_pushstring(L, md5_hex);
- }
- else
- {
- return larlib_perror(L, strerror(errno));
- }
-
- return 1;
-}
-
-static int larlib_mkpath( const char *name, const char *path, char *buffer )
-{
- int nlen = strlen(name);
- int plen = strlen(path);
-
- if( (nlen + plen + 1) <= LAR_FNAME_BUFFER )
- {
- strcpy(buffer, path);
-
- if( buffer[plen-1] != '/' )
- buffer[plen++] = '/';
-
- strcpy(&buffer[plen], name);
- buffer[plen + nlen] = '\0';
-
- return 0;
- }
-
- return 1;
-}
-
-static int larlib__gc( lua_State *L )
-{
- lar_archive **archive = luaL_checkudata( L, 1, "lar.archive" );
-
- if( *archive )
- lar_close(*archive);
-
- *archive = NULL;
- return 0;
-}
-
-
-static int larlib_member__open( lua_State *L, lar_member *mb )
-{
- lar_archive **archive = NULL;
- const char *filename = NULL;
- lar_member **udata;
-
- if( mb == NULL )
- {
- *archive = luaL_checkudata( L, 1, "lar.archive" );
- filename = luaL_checkstring( L, 2 );
- }
-
- if( mb != NULL || (mb = lar_open_member(*archive, filename)) != NULL )
- {
- if( (udata = lua_newuserdata(L, sizeof(lar_member *))) != NULL )
- {
- *udata = mb;
- luaL_getmetatable(L, "lar.member");
- lua_setmetatable(L, -2);
- }
- else
- {
- return luaL_error(L, "Out of memory");
- }
- }
- else
- {
- return larlib_perror(L, "Member not found in archive");
- }
-
- return 1;
-}
-
-int larlib_member_open( lua_State *L )
-{
- return larlib_member__open( L, NULL );
-}
-
-int larlib_member_find( lua_State *L )
-{
- lar_archive **archive = luaL_checkudata( L, 1, "lar.archive" );
- const char *package = luaL_checkstring( L, 2 );
- lar_member *mb, **udata;
-
- if( (mb = lar_find_member(*archive, package)) != NULL )
- {
- if( (udata = lua_newuserdata(L, sizeof(lar_member *))) != NULL )
- {
- *udata = mb;
- luaL_getmetatable(L, "lar.member");
- lua_setmetatable(L, -2);
- }
- else
- {
- return luaL_error(L, "Out of memory");
- }
- }
- else
- {
- return larlib_perror(L, "Member not found in archive");
- }
-
- return 1;
-}
-
-int larlib_member_size( lua_State *L )
-{
- lar_member **member = luaL_checkudata( L, 1, "lar.member" );
- lua_pushnumber(L, (*member)->length);
- return 1;
-}
-
-int larlib_member_type( lua_State *L )
-{
- lar_member **member = luaL_checkudata( L, 1, "lar.member" );
- lua_pushnumber(L, (*member)->type);
- return 1;
-}
-
-int larlib_member_flags( lua_State *L )
-{
- lar_member **member = luaL_checkudata( L, 1, "lar.member" );
- lua_pushnumber(L, (*member)->flags);
- return 1;
-}
-
-int larlib_member_read( lua_State *L )
-{
- lar_member **member = luaL_checkudata( L, 1, "lar.member" );
- int start = luaL_checknumber( L, 2 );
- int length = luaL_optnumber( L, 3, (*member)->length );
- char *stringcopy;
-
- if( (start >= 0) && (start < (*member)->length) && (length > 0) )
- {
- if( (start + length) >= (*member)->length )
- length = (*member)->length - start;
-
- if( (stringcopy = (char *)malloc(length + 1)) != NULL )
- {
- memcpy(stringcopy, &(*member)->data[start], length);
- stringcopy[length] = '\0';
- lua_pushstring(L, stringcopy);
- free(stringcopy);
- }
- else
- {
- return luaL_error(L, "Out of memory");
- }
- }
- else
- {
- return larlib_perror(L, "Invalid argument");
- }
-
- return 1;
-}
-
-int larlib_member_data( lua_State *L )
-{
- lar_member **member = luaL_checkudata( L, 1, "lar.member" );
- lua_pushstring(L, (*member)->data);
- return 1;
-}
-
-int larlib_member_load( lua_State *L )
-{
- lar_member **member = luaL_checkudata( L, 1, "lar.member" );
- int status = luaL_loadbuffer( L, (*member)->data, (*member)->length,
- "=(lar member)" );
-
- if( status )
- {
- lua_pushnil(L);
- lua_insert(L, -2);
- return 2;
- }
-
- return 1;
-}
-
-static int larlib_member__gc( lua_State *L )
-{
- lar_member **member = luaL_checkudata( L, 1, "lar.member" );
-
- if( *member )
- lar_close_member(*member);
-
- *member = NULL;
- return 0;
-}
-
-
-static int larlib_mmfile__open( lua_State *L, const char *filename )
-{
- struct stat s;
- mmap_handle *fh, **udata;
-
- if( filename == NULL )
- filename = (const char *)luaL_checkstring( L, 1 );
-
- if( (fh = (mmap_handle *)malloc(sizeof(mmap_handle))) == NULL )
- return larlib_perror(L, "Out of memory");
-
- if( stat(filename, &s) > -1 && (fh->fd = open(filename, O_RDONLY)) > -1 )
- {
- fh->length = s.st_size;
- fh->data = mmap( 0, s.st_size, PROT_READ, MAP_PRIVATE, fh->fd, 0 );
-
- if( fh->data == MAP_FAILED )
- return larlib_perror(L, "Failed to mmap() file");
-
- if( (udata = lua_newuserdata(L, sizeof(char *))) != NULL )
- {
- *udata = fh;
- luaL_getmetatable(L, "lar.mmfile");
- lua_setmetatable(L, -2);
- }
- else
- {
- return larlib_perror(L, "Out of memory");
- }
- }
- else
- {
- return larlib_perror(L, strerror(errno));
- }
-
- return 1;
-}
-
-int larlib_mmfile_open( lua_State *L )
-{
- return larlib_mmfile__open(L, NULL);
-}
-
-int larlib_mmfile_size( lua_State *L )
-{
- mmap_handle **fh = luaL_checkudata( L, 1, "lar.mmfile" );
- lua_pushnumber(L, (*fh)->length);
- return 1;
-}
-
-int larlib_mmfile_read( lua_State *L )
-{
- mmap_handle **fh = luaL_checkudata( L, 1, "lar.mmfile" );
- int start = luaL_checknumber( L, 2 );
- int length = luaL_optnumber( L, 3, (*fh)->length );
- char *stringcopy;
-
- if( (start >= 0) && (start < (*fh)->length) && (length > 0) )
- {
- if( (start + length) >= (*fh)->length )
- length = (*fh)->length - start;
-
- if( (stringcopy = (char *)malloc(length + 1)) != NULL )
- {
- memcpy(stringcopy, &(*fh)->data[start], length);
- stringcopy[length] = '\0';
- lua_pushstring(L, stringcopy);
- free(stringcopy);
- }
- else
- {
- return luaL_error(L, "Out of memory");
- }
- }
- else
- {
- return larlib_perror(L, "Invalid argument");
- }
-
- return 1;
-}
-
-int larlib_mmfile_data( lua_State *L )
-{
- mmap_handle **fh = luaL_checkudata( L, 1, "lar.mmfile" );
- lua_pushstring(L, (*fh)->data);
- return 1;
-}
-
-int larlib_mmfile_load( lua_State *L )
-{
- mmap_handle **fh = luaL_checkudata( L, 1, "lar.mmfile" );
- int status = luaL_loadbuffer(L, (*fh)->data, (*fh)->length, "=(mmap file)");
-
- if( status )
- {
- lua_pushnil(L);
- lua_insert(L, -2);
- return 2;
- }
-
- return 1;
-}
-
-static int larlib_mmfile__gc( lua_State *L )
-{
- mmap_handle **fh = luaL_checkudata( L, 1, "lar.mmfile" );
-
- if( *fh )
- {
- close((*fh)->fd);
- munmap((*fh)->data, (*fh)->length);
- free(*fh);
- *fh = NULL;
- }
-
- return 0;
-}
-
-
-int larlib_findfile( lua_State *L )
-{
- int i;
- const char *filename = luaL_checkstring( L, 1 );
- const char *basepath = luaL_optstring( L, 2, "./" );
- struct stat s;
- lar_archive *ar;
- lar_member *mb;
- LAR_FNAME(filepath);
-
- const char *searchpath[3] = { basepath, LUA_LDIR, LUA_CDIR };
-
- for( i = 0; i < 3; i++ )
- if( !larlib_mkpath(filename, searchpath[i], filepath) )
- if( stat(filepath, &s) > -1 && (s.st_mode & S_IFREG) )
- return larlib_mmfile__open( L, filepath );
-
- for( i = 0; i < 3; i++ )
- if( (ar = lar_find_archive(filename, searchpath[i], 0)) != NULL )
- if( (mb = lar_open_member(ar, filename)) != NULL )
- return larlib_member__open( L, mb );
-
- return larlib_perror(L, "File not found");
-}
-
-
-static const luaL_reg LAR_REG[] = {
- { "open", larlib_open },
- { "find", larlib_find },
- { "md5", larlib_md5 },
- { "md5_file", larlib_md5_file },
- { "mmap", larlib_mmfile_open },
- { "findfile", larlib_findfile },
- { NULL, NULL }
-};
-
-static const luaL_reg LAR_ARCHIVE_REG[] = {
- { "member", larlib_member_open },
- { "find", larlib_member_find },
- { "__gc", larlib__gc },
- { NULL, NULL }
-};
-
-static const luaL_reg LAR_MEMBER_REG[] = {
- { "size", larlib_member_size },
- { "type", larlib_member_type },
- { "flags", larlib_member_flags },
- { "read", larlib_member_read },
- { "data", larlib_member_data },
- { "load", larlib_member_load },
- { "__gc", larlib_member__gc },
- { NULL, NULL }
-};
-
-static const luaL_reg LAR_MMFILE_REG[] = {
- { "size", larlib_mmfile_size },
- { "read", larlib_mmfile_read },
- { "data", larlib_mmfile_data },
- { "load", larlib_mmfile_load },
- { "__gc", larlib_mmfile__gc },
- { NULL, NULL }
-};
-
-
-LUALIB_API int luaopen_larlib( lua_State *L )
-{
- luaL_newmetatable(L, "lar");
- luaL_register(L, NULL, LAR_REG);
- lua_pushvalue(L, -1);
- lua_setfield(L, -2, "__index");
- lua_setglobal(L, "lar");
-
- luaL_newmetatable(L, "lar.archive");
- luaL_register(L, NULL, LAR_ARCHIVE_REG);
- lua_pushvalue(L, -1);
- lua_setfield(L, -2, "__index");
- lua_setglobal(L, "lar.archive");
-
- luaL_newmetatable(L, "lar.member");
- luaL_register(L, NULL, LAR_MEMBER_REG);
- lua_pushvalue(L, -1);
- lua_setfield(L, -2, "__index");
- lua_setglobal(L, "lar.member");
-
- luaL_newmetatable(L, "lar.mmfile");
- luaL_register(L, NULL, LAR_MMFILE_REG);
- lua_pushvalue(L, -1);
- lua_setfield(L, -2, "__index");
- lua_setglobal(L, "lar.mmfile");
-
- return 1;
-}