void br_fdb_cleanup(struct net_bridge *br) { int i; unsigned long timeout; timeout = __timeout(br); write_lock_bh(&br->hash_lock); for (i=0;i<BR_HASH_SIZE;i++) { struct net_bridge_fdb_entry *f; f = br->hash[i]; while (f != NULL) { struct net_bridge_fdb_entry *g; g = f->next_hash; if (!f->is_static && time_before_eq(f->ageing_timer, timeout)) { __hash_unlink(f); br_fdb_put(f); } f = g; } } write_unlock_bh(&br->hash_lock); }
static __inline__ int has_expired(struct net_bridge *br, struct net_bridge_fdb_entry *fdb) { if (!fdb->is_static && time_before_eq(fdb->ageing_timer, __timeout(br))) return 1; return 0; }
/* * halfdelay -- * Put the terminal into cbreak mode with the specified timeout. * */ int halfdelay(int duration) { if ((duration < 1) || (duration > 255)) return ERR; if (cbreak() == ERR) return ERR; if (__timeout(duration) == ERR) return ERR; _cursesi_screen->half_delay = TRUE; return OK; }
/* * wgetch -- * Read in a character from the window. */ int wgetch(WINDOW *win) { int inp, weset; int c; FILE *infd = _cursesi_screen->infd; #ifdef DEBUG __CTRACE(__CTRACE_INPUT, "wgetch: win(%p)\n", win); #endif if (!(win->flags & __SCROLLOK) && (win->flags & __FULLWIN) && win->curx == win->maxx - 1 && win->cury == win->maxy - 1 && __echoit) return (ERR); if (is_wintouched(win)) wrefresh(win); #ifdef DEBUG __CTRACE(__CTRACE_INPUT, "wgetch: __echoit = %d, " "__rawmode = %d, __nl = %d, flags = %#.4x, delay = %d\n", __echoit, __rawmode, _cursesi_screen->nl, win->flags, win->delay); #endif if (_cursesi_screen->resized) { _cursesi_screen->resized = 0; #ifdef DEBUG __CTRACE(__CTRACE_INPUT, "wgetch returning KEY_RESIZE\n"); #endif return KEY_RESIZE; } if (_cursesi_screen->unget_pos) { #ifdef DEBUG __CTRACE(__CTRACE_INPUT, "wgetch returning char at %d\n", _cursesi_screen->unget_pos); #endif _cursesi_screen->unget_pos--; c = _cursesi_screen->unget_list[_cursesi_screen->unget_pos]; if (__echoit) waddch(win, (chtype) c); return c; } if (__echoit && !__rawmode) { cbreak(); weset = 1; } else weset = 0; __save_termios(); if (win->flags & __KEYPAD) { switch (win->delay) { case -1: inp = inkey (win->flags & __NOTIMEOUT ? 0 : 1, 0); break; case 0: if (__nodelay() == ERR) return ERR; inp = inkey(0, 0); break; default: inp = inkey(win->flags & __NOTIMEOUT ? 0 : 1, win->delay); break; } } else { switch (win->delay) { case -1: if (__delay() == ERR) return ERR; break; case 0: if (__nodelay() == ERR) return ERR; break; default: if (__timeout(win->delay) == ERR) return ERR; break; } c = fgetc(infd); if (feof(infd)) { clearerr(infd); __restore_termios(); return ERR; /* we have timed out */ } if (ferror(infd)) { clearerr(infd); inp = ERR; } else { inp = c; } } #ifdef DEBUG if (inp > 255) /* we have a key symbol - treat it differently */ /* XXXX perhaps __unctrl should be expanded to include * XXXX the keysyms in the table.... */ __CTRACE(__CTRACE_INPUT, "wgetch assembled keysym 0x%x\n", inp); else __CTRACE(__CTRACE_INPUT, "wgetch got '%s'\n", unctrl(inp)); #endif if (win->delay > -1) { if (__delay() == ERR) return ERR; } __restore_termios(); if ((__echoit) && (inp < KEY_MIN)) waddch(win, (chtype) inp); if (weset) nocbreak(); if (_cursesi_screen->nl && inp == 13) inp = 10; return ((inp < 0) || (inp == ERR) ? ERR : inp); }
wchar_t inkey(int to, int delay) { wchar_t k; int c, mapping; keymap_t *current = _cursesi_screen->base_keymap; FILE *infd = _cursesi_screen->infd; k = 0; /* XXX gcc -Wuninitialized */ #ifdef DEBUG __CTRACE(__CTRACE_INPUT, "inkey (%d, %d)\n", to, delay); #endif for (;;) { /* loop until we get a complete key sequence */ reread: if (state == INKEY_NORM) { if (delay && __timeout(delay) == ERR) return ERR; c = fgetc(infd); if (c == EOF) { clearerr(infd); return ERR; } if (delay && (__notimeout() == ERR)) return ERR; k = (wchar_t) c; #ifdef DEBUG __CTRACE(__CTRACE_INPUT, "inkey (state normal) got '%s'\n", unctrl(k)); #endif working = start; inbuf[working] = k; INC_POINTER(working); end = working; state = INKEY_ASSEMBLING; /* go to the assembling * state now */ } else if (state == INKEY_BACKOUT) { k = inbuf[working]; INC_POINTER(working); if (working == end) { /* see if we have run * out of keys in the * backlog */ /* if we have then switch to assembling */ state = INKEY_ASSEMBLING; } } else if (state == INKEY_ASSEMBLING) { /* assembling a key sequence */ if (delay) { if (__timeout(to ? (ESCDELAY / 100) : delay) == ERR) return ERR; } else { if (to && (__timeout(ESCDELAY / 100) == ERR)) return ERR; } c = fgetc(infd); if (ferror(infd)) { clearerr(infd); return ERR; } if ((to || delay) && (__notimeout() == ERR)) return ERR; #ifdef DEBUG __CTRACE(__CTRACE_INPUT, "inkey (state assembling) got '%s'\n", unctrl(k)); #endif if (feof(infd) || c == -1) { /* inter-char timeout, * start backing out */ clearerr(infd); if (start == end) /* no chars in the buffer, restart */ goto reread; k = inbuf[start]; state = INKEY_TIMEOUT; } else { k = (wchar_t) c; inbuf[working] = k; INC_POINTER(working); end = working; } } else { fprintf(stderr, "Inkey state screwed - exiting!!!"); exit(2); } /* * Check key has no special meaning and we have not * timed out and the key has not been disabled */ mapping = current->mapping[k]; if (((state == INKEY_TIMEOUT) || (mapping < 0)) || ((current->key[mapping]->type == KEYMAP_LEAF) && (current->key[mapping]->enable == FALSE))) { /* return the first key we know about */ k = inbuf[start]; INC_POINTER(start); working = start; if (start == end) { /* only one char processed */ state = INKEY_NORM; } else {/* otherwise we must have more than one char * to backout */ state = INKEY_BACKOUT; } return k; } else { /* must be part of a multikey sequence */ /* check for completed key sequence */ if (current->key[current->mapping[k]]->type == KEYMAP_LEAF) { start = working; /* eat the key sequence * in inbuf */ /* check if inbuf empty now */ if (start == end) { /* if it is go back to normal */ state = INKEY_NORM; } else { /* otherwise go to backout state */ state = INKEY_BACKOUT; } /* return the symbol */ return current->key[current->mapping[k]]->value.symbol; } else { /* * Step on to next part of the multi-key * sequence. */ current = current->key[current->mapping[k]]->value.next; } } } }