int cdb_init(struct cdb *C, int fd) { struct stat sb; uchar_t *map; uchar_t buf[INITBUF_SIZE]; buf_zero(C, sizeof (struct cdb)); /* try to mmap() fd: */ if((fstat(fd, &sb) == 0) && (sb.st_size <= (off_t)0xffffffff)){ map = mmap(0, sb.st_size, PROT_READ, MAP_SHARED, fd, 0); if(map != MAP_FAILED){ C->map = map; C->map_size = sb.st_size; } } C->fd = fd; /* suck in file header: */ if(cdb_read(C, buf, sizeof buf, 0) == -1){ return -1; } /* C->hbase: offset to base of hash table (also eod): */ C->hbase = upak32_unpack(buf); return 0; }
static int nfcconf_lex_engine(nfcconf_parser * parser, BUFHAN * bp) { int this_char; while (1) { switch (this_char = buf_nextch(bp)) { case '#': /* comment till end of line */ buf_eat_till(bp, '#', "\r\n"); nfcconf_parse_token(parser, TOKEN_TYPE_COMMENT, bp->buf); buf_zero(bp); continue; case '\n': nfcconf_parse_token(parser, TOKEN_TYPE_NEWLINE, NULL); continue; case ' ': case '\t': case '\r': /* eat up whitespace */ continue; case ',': case '{': case '}': case '=': case ';': buf_addch(bp, (char) this_char); nfcconf_parse_token(parser, TOKEN_TYPE_PUNCT, bp->buf); buf_zero(bp); continue; case '"': buf_eat_till(bp, (char) this_char, "\"\r\n"); buf_addch(bp, (char) buf_nextch(bp)); nfcconf_parse_token(parser, TOKEN_TYPE_STRING, bp->buf); buf_zero(bp); continue; case EOF: break; default: buf_eat_till(bp, (char) this_char, ";, \t\r\n"); nfcconf_parse_token(parser, TOKEN_TYPE_STRING, bp->buf); buf_zero(bp); continue; } break; } buf_finished(bp); return 1; }
int cdb_clear(struct cdb *C) { int e = 0; if(C->map != 0){ e = munmap(C->map, C->map_size); } buf_zero(C, sizeof (struct cdb)); return e; }
int domsock_create(const char *path, mode_t mode) { struct sockaddr_un sockaddr; mode_t umask_orig; int s; int e, terrno; if(sizeof(sockaddr.sun_path) < (cstr_len(path) + 1)){ errno = ENAMETOOLONG; return -1; } if((s = socket(AF_LOCAL, SOCK_STREAM, 0)) == -1){ return -1; } unlink(path); buf_zero(&sockaddr, sizeof (sockaddr)); sockaddr.sun_family = AF_LOCAL; cstr_copy(sockaddr.sun_path, path); if(bind(s, (const struct sockaddr *)&sockaddr, sizeof(sockaddr)) == -1){ goto FAIL; } if(mode != 0){ umask_orig = umask(0); e = chmod(path, mode); umask(umask_orig); if(e == -1){ goto FAIL; } } /* success: */ return s; FAIL: terrno = errno; unlink(path); close(s); errno = terrno; return -1; }
/* perpd_svdef_clear() ** prepare a clean perpd_svdef object */ void perpd_svdef_clear(struct svdef *svdef) { buf_zero(svdef, sizeof (struct svdef)); return; }