static int generic_server(int sock, struct sockaddr *addr, size_t alen) { int ret; ret = bind(sock, addr, alen); if ( ret < 0 ) return prelude_error_verbose(prelude_error_code_from_errno(errno), "could not bind socket: %s", strerror(errno)); ret = listen(sock, 10); if ( ret < 0 ) return prelude_error_verbose(PRELUDE_ERROR_GENERIC, "listen error: %s", strerror(errno)); return 0; }
int _prelude_load_file(const char *filename, unsigned char **fdata, size_t *outsize) { int ret, fd; struct stat st; unsigned char *dataptr; fd = open(filename, O_RDONLY); if ( fd < 0 ) return prelude_error_from_errno(errno); ret = fstat(fd, &st); if ( ret < 0 ) { close(fd); return prelude_error_from_errno(errno); } if ( st.st_size == 0 ) { close(fd); return prelude_error_verbose(prelude_error_code_from_errno(EINVAL), "could not load '%s': empty file", filename); } *outsize = st.st_size; #if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) dataptr = *fdata = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0); if ( dataptr == MAP_FAILED ) { close(fd); return prelude_error_from_errno(errno); } #else dataptr = *fdata = malloc(st.st_size); if ( ! dataptr ) { close(fd); return prelude_error_from_errno(errno); } _setmode(fd, O_BINARY); do { ssize_t len; len = read(fd, dataptr, st.st_size); if ( len < 0 ) { if ( errno == EINTR ) continue; close(fd); free(*fdata); return prelude_error_from_errno(errno); } dataptr += len; st.st_size -= len; } while ( st.st_size > 0 ); #endif close(fd); return 0; }