Files
koreader/util.c
Tigran Aivazian 6e0f0aef26 Fix a crash in getDiskSizeInfo() and use util.df function
1. When executed in the emulator the viewer will crash if you press
Right on any zip file in the filechooser. This is because the assertion
on "df /mnt/us | tail -1" will fail as "/mnt/us" is normally
non-existent.
2. The proper (faster, reliable, portable) way of obtaining the number
of total and free bytes on a filesystem is by using the statvfs(2)
system call via util.df Lua interface, see util.c.
3. Removed the "used" field in the function's return as unused and
unneeded.
2012-09-24 19:48:12 +01:00

96 lines
2.4 KiB
C

/*
KindlePDFViewer: miscellaneous utility functions for Lua
Copyright (C) 2011 Hans-Werner Hilse <hilse@web.de>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <sys/time.h>
#include <sys/statvfs.h>
#include <unistd.h>
#include "util.h"
static int gettime(lua_State *L) {
struct timeval tv;
gettimeofday(&tv, NULL);
lua_pushinteger(L, tv.tv_sec);
lua_pushinteger(L, tv.tv_usec);
return 2;
}
static int util_sleep(lua_State *L) {
unsigned int seconds = luaL_optint(L, 1, 0);
sleep(seconds);
return 0;
}
static int util_usleep(lua_State *L) {
useconds_t useconds = luaL_optint(L, 1, 0);
usleep(useconds);
return 0;
}
static int util_df(lua_State *L) {
char *path = luaL_checkstring(L, 1);
struct statvfs vfs;
statvfs(path, &vfs);
lua_pushnumber(L, (double)vfs.f_blocks * (double)vfs.f_bsize);
lua_pushnumber(L, (double)vfs.f_bfree * (double)vfs.f_bsize);
return 2;
}
/* Turn UTF-8 char code to Unicode */
static int utf8charcode(lua_State *L) {
size_t len;
const char *utf8char = luaL_checklstring(L, 1, &len);
int c;
if(len == 1) {
c = utf8char[0] & 0x7F; /* should not be needed */
} else if(len == 2) {
c = ((utf8char[0] & 0x1F) << 6) | (utf8char[1] & 0x3F);
} else if(len == 3) {
c = ((utf8char[0] & 0x0F) << 12) | ((utf8char[1] & 0x3F) << 6) | (utf8char[2] & 0x3F);
} else {
// 4, 5, 6 byte cases still missing
return 0;
}
lua_pushinteger(L, c);
return 1;
}
static int isEmulated(lua_State *L) {
#ifdef EMULATE_READER
lua_pushinteger(L, 1);
#else
lua_pushinteger(L, 0);
#endif
return 1;
}
static const struct luaL_Reg util_func[] = {
{"gettime", gettime},
{"sleep", util_sleep},
{"usleep", util_usleep},
{"utf8charcode", utf8charcode},
{"isEmulated", isEmulated},
{"df", util_df},
{NULL, NULL}
};
int luaopen_util(lua_State *L) {
luaL_register(L, "util", util_func);
return 1;
}