static int l_event_dispatcher_del_event_listener(lua_State * L) { struct event_listener_t * el = (struct event_listener_t *)luaL_checkudata(L, 1, MT_NAME_EVENT_LISTENER); event_base_del_event_listener(runtime_get()->__event_base, el); return 0; }
char * getenv(const char * name) { struct environ_t * environ = &(runtime_get()->__environ); struct environ_t * p; int len; if(!environ) return NULL; len = strlen(name); for(p = environ->next; p != environ; p = p->next) { if(!strncmp(name, p->content, len) && (p->content[len] == '=')) { return p->content + (len + 1); } } return NULL; }
bool_t saveenv(char * file) { struct environ_t * environ = &(runtime_get()->__environ); struct environ_t * p; struct xml * root, * env; char * str; int fd; root = xml_new("environment"); if(!root) return FALSE; for(p = environ->next; p != environ; p = p->next) { env = xml_add_child(root, "env", 0); xml_set_txt(env, p->content); } str = xml_toxml(root); if(!str) { xml_free(root); return FALSE; } fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)); if(fd < 0) { free(str); xml_free(root); return FALSE; } write(fd, str, strlen(str)); close(fd); free(str); xml_free(root); return TRUE; }
int __put_env(char * str, size_t len, int overwrite) { struct environ_t * environ = &(runtime_get()->__environ); struct environ_t * env; struct environ_t * p; if(!environ) return -1; for(p = environ->next; p != environ; p = p->next) { if (!strncmp(p->content, str, len)) { if (!overwrite) { free(str); } else { free(p->content); p->content = str; } return 0; } } env = malloc(sizeof(struct environ_t)); if(!env) return -1; env->content = str; env->prev = environ->prev; env->next = environ; environ->prev->next = env; environ->prev = env; return 0; }
static ssize_t console_input_read(struct console_t * console, unsigned char * buf, size_t count) { struct console_input_data_t * dat = (struct console_input_data_t *)console->priv; struct event_t event; u32_t key; u8_t sym[16]; size_t len; if(pump_event(runtime_get()->__event_base, &event) && (event.type == EVENT_TYPE_KEY_DOWN) && (event.device == dat->input)) { key = event.e.key_down.key; switch(key) { case KEY_BACKSPACE: sym[0] = 0x7f; len = 1; break; case KEY_TAB: sym[0] = 0x9; len = 1; break; case KEY_ENTER: sym[0] = 0xd; len = 1; break; case KEY_UP: sym[0] = '\e'; sym[1] = '['; sym[2] = 'A'; len = 3; break; case KEY_DOWN: sym[0] = '\e'; sym[1] = '['; sym[2] = 'B'; len = 3; break; case KEY_LEFT: sym[0] = '\e'; sym[1] = '['; sym[2] = 'D'; len = 3; break; case KEY_RIGHT: sym[0] = '\e'; sym[1] = '['; sym[2] = 'C'; len = 3; break; case KEY_PAGE_UP: sym[0] = '\e'; sym[1] = '['; sym[2] = '5'; sym[3] = '~'; len = 4; break; case KEY_PAGE_DOWN: sym[0] = '\e'; sym[1] = '['; sym[2] = '6'; sym[3] = '~'; len = 4; break; case KEY_HOME: sym[0] = '\e'; sym[1] = '['; sym[2] = '1'; sym[3] = '~'; len = 4; break; case KEY_END: sym[0] = '\e'; sym[1] = '['; sym[2] = '4'; sym[3] = '~'; len = 4; break; case KEY_VOLUME_UP: case KEY_VOLUME_DOWN: case KEY_MENU: case KEY_BACK: case KEY_POWER: len = 0; break; default: ucs4_to_utf8(&key, 1, (char *)sym, sizeof(sym)); len = strlen((const char *)sym); break; } fifo_put(dat->fifo, sym, len); } return fifo_get(dat->fifo, buf, count); }
static int l_event_dispatcher_run(lua_State * L) { event_base_dispatcher(runtime_get()->__event_base); return 0; }
/* * Internal function returning the address of the thread-specific errno */ volatile int * __runtime_errno_location(void) { return &(runtime_get()->__errno); }