Skip to content

Commit

Permalink
Refactor code from evdns into a new internal "read a file" function.
Browse files Browse the repository at this point in the history
  • Loading branch information
nmathewson committed Jan 9, 2010
1 parent eaaf27f commit 0f7144f
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 0 deletions.
62 changes: 62 additions & 0 deletions evutil.c
Expand Up @@ -67,6 +67,7 @@
#include <sys/timeb.h>
#include <time.h>
#endif
#include <sys/stat.h>

#include "event2/util.h"
#include "util-internal.h"
Expand All @@ -76,6 +77,67 @@
#include "strlcpy-internal.h"
#include "ipv6-internal.h"

/**
Read the contents of 'filename' into a newly allocated NUL-terminated
string. Set *content_out to hold this string, and *len_out to hold its
length (not including the appended NUL). If 'is_binary', open the file in
binary mode.
Returns 0 on success, -1 if the open fails, and -2 for all other failures.
Used internally only; may go away in a future version.
*/
int
evutil_read_file(const char *filename, char **content_out, size_t *len_out,
int is_binary)
{
int fd, r;
struct stat st;
char *mem;
size_t read_so_far=0;
int mode = O_RDONLY;

EVUTIL_ASSERT(content_out);
EVUTIL_ASSERT(len_out);
*content_out = NULL;
*len_out = 0;

#ifdef O_BINARY
if (is_binary)
mode |= O_BINARY;
#endif

fd = open(filename, mode);
if (fd < 0)
return -1;
if (fstat(fd, &st)) {
close(fd);
return -2;
}
mem = mm_malloc(st.st_size + 1);
if (!mem) {
close(fd);
return -2;
}
read_so_far = 0;
while ((r = read(fd, mem+read_so_far, st.st_size - read_so_far)) > 0) {
read_so_far += r;
if (read_so_far >= st.st_size)
break;
EVUTIL_ASSERT(read_so_far < st.st_size);
}
if (r < 0) {
close(fd);
mm_free(mem);
return -2;
}
mem[read_so_far] = 0;

*len_out = read_so_far;
*content_out = mem;
return 0;
}

int
evutil_socketpair(int family, int type, int protocol, evutil_socket_t fd[2])
{
Expand Down
2 changes: 2 additions & 0 deletions util-internal.h
Expand Up @@ -136,6 +136,8 @@ extern const char EVUTIL_TOLOWER_TABLE[];
#define EVUTIL_UPCAST(ptr, type, field) \
((type *)(((char*)(ptr)) - evutil_offsetof(type, field)))

int evutil_read_file(const char *filename, char **content_out, size_t *len_out,
int is_binary);

int evutil_socket_connect(evutil_socket_t *fd_ptr, struct sockaddr *sa, int socklen);

Expand Down

0 comments on commit 0f7144f

Please sign in to comment.