/* * Read a character from the command window */ int command_read_key() { int key = 0; while (!key) { if (redraw_request) { redraw_all(); redraw_request=0; } key = wgetch(command_win); switch (key) { case 0x1A: key = 0; kill(getpid(), SIGTSTP); break; case KEY_NPAGE: pgdn(""); refresh_command_win (); break; case KEY_PPAGE: pgup(""); refresh_command_win (); break; case ERR: key = 0; break; case KEY_BACKSPACE: key = '\b'; } if ((key < 32 && key != '\b' && key != '\n') || (key > 127)) key = 0; } return key; }
void *rszshm_mk(struct rszshm *r, size_t flen, const char *fname, struct rszshm_scan scan) { long pgsz = sysconf(_SC_PAGE_SIZE); int i, errno_; char *m, *tgt, *p = NULL; if (!r || flen == 0 || scan.len < flen + sizeof(*r->hdr) || !scan.start || scan.len == 0 || scan.hop == 0 || scan.iter == 0 || (fname && strnlen(fname, RSZSHM_PATH_MAX) == RSZSHM_PATH_MAX)) { errno = EINVAL; return NULL; } *r = (typeof(*r)) { -1, 0, "", NULL, NULL }; strcpy(r->fname, fname ? fname : RSZSHM_DFLT_FNAME); flen = pgup(flen + sizeof(*r->hdr), pgsz); scan.len = pgup(scan.len, pgsz); for (i = 1, tgt = scan.start; i <= scan.iter; i++) { m = mmap(tgt, scan.len, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON|MAP_NORESERVE, -1, 0); if (m == MAP_FAILED) return NULL; if (m == tgt) break; munmap(m, scan.len); m = NULL; tgt += (i % 2 == 0 ? 1 : -1) * i * scan.hop; } if (!m) { errno = ENOSPC; return NULL; } if ((p = strstr(r->fname, "XXXXXX/")) != NULL) { p += 6; *p = '\0'; if (!mkdtemp(r->fname)) goto err; *p = '/'; } if ((r->fd = open(r->fname, O_CREAT|O_EXCL|O_RDWR, p ? 0600 : 0666)) == -1) goto err; if (ftruncate(r->fd, flen) == -1) goto err; if (mmap(m, flen, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, r->fd, 0) == MAP_FAILED) goto err; *(r->hdr = (typeof(r->hdr)) m) = (typeof(*r->hdr)) { flen, scan.len, m }; if (msync(m, sizeof(*r->hdr), MS_SYNC) == -1) goto err; r->flen = flen; r->cap = flen - sizeof(*r->hdr); r->dat = m + sizeof(*r->hdr); return r->dat; err: errno_ = errno; if (m && m != MAP_FAILED) munmap(m, scan.len); if (r->fd != -1) { close(r->fd); unlink(r->fname); } if (p) { *p = '\0'; rmdir(r->fname); *p = '/'; } errno = errno_; return NULL; }