From dd1c59ed6674c58b2694d8c5275f3db67c691f4a Mon Sep 17 00:00:00 2001 From: Ali Gholami Rudi Date: Sat, 21 Nov 2009 21:49:24 +0330 Subject: [PATCH] util: add xread() and xwrite() --- Makefile | 2 +- mbox.c | 49 +++++++------------------------------------------ util.c | 40 ++++++++++++++++++++++++++++++++++++++++ util.h | 3 +++ 4 files changed, 51 insertions(+), 43 deletions(-) create mode 100644 util.c create mode 100644 util.h diff --git a/Makefile b/Makefile index b36a8f7..0c51424 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ LDFLAGS = -s all: mailx .c.o: $(CC) -c $(CFLAGS) $< -mailx: mailx.o mbox.o sort.o +mailx: mailx.o mbox.o sort.o util.o $(CC) $(LDFLAGS) -o $@ $^ clean: rm -f *.o mailx diff --git a/mbox.c b/mbox.c index e713e87..b87b3b6 100644 --- a/mbox.c +++ b/mbox.c @@ -9,16 +9,10 @@ #include #include #include "mbox.h" +#include "util.h" #define INCSIZE (1 << 21) -static int file_size(int fd) -{ - struct stat stat; - fstat(fd, &stat); - return stat.st_size; -} - static void set_atime(char *filename) { struct stat st; @@ -29,22 +23,6 @@ static void set_atime(char *filename) utime(filename, ×); } -static int read_file(int fd, char *buf, int len, int seek) -{ - int nr = 0; - if (seek) - lseek(fd, seek, SEEK_SET); - while (nr < len) { - int ret = read(fd, buf + nr, len - nr); - if (ret == -1 && (errno == EAGAIN || errno == EINTR)) - continue; - if (ret <= 0) - break; - nr += ret; - } - return nr; -} - static char *mail_start(char *r) { char *s = r; @@ -152,8 +130,9 @@ int mbox_inc(struct mbox *mbox) mbox->size = file_size(fd) + INCSIZE + 1; mbox->mbox = malloc(mbox->size); } - mbox->len += read_file(fd, mbox->mbox + mbox->len, - mbox->size - 1, mbox->len); + if (mbox->len) + lseek(fd, mbox->len, SEEK_SET); + mbox->len += xread(fd, mbox->mbox + mbox->len, mbox->size - 1); mbox->mbox[mbox->len] = '\0'; close(fd); set_atime(mbox->path); @@ -208,20 +187,6 @@ static int mail_changed(struct mail *mail) return mail->orig_stat != mail->stat; } -static int write_fully(int fd, char *buf, int len) -{ - int nw = 0; - while (nw < len) { - int ret = write(fd, buf + nw, len - nw); - if (ret == -1 && (errno == EAGAIN || errno == EINTR)) - continue; - if (ret < 0) - break; - nw += ret; - } - return nw; -} - void mail_write(struct mail *mail, int fd) { char stat[32] = "Status: "; @@ -231,12 +196,12 @@ void mail_write(struct mail *mail, int fd) *s++ = 'O'; *s++ = '\n'; if (!mail->stat_hdr) { - write_fully(fd, mail->head, mail->body - mail->head); + xwrite(fd, mail->head, mail->body - mail->head); write(fd, stat, s - stat); write(fd, mail->body, mail->body_len); } else { char *hdr_end = strchr(mail->stat_hdr, '\n'); - write_fully(fd, mail->head, mail->stat_hdr - mail->head); + xwrite(fd, mail->head, mail->stat_hdr - mail->head); write(fd, stat, s - stat); if (hdr_end) write(fd, hdr_end + 1, @@ -268,7 +233,7 @@ void mbox_write(struct mbox *mbox) i++; if (i < mbox->n) end = mbox->mails[i].head; - write_fully(fd, beg, end - beg); + xwrite(fd, beg, end - beg); if (i < mbox->n) mail_write(&mbox->mails[i++], fd); } diff --git a/util.c b/util.c new file mode 100644 index 0000000..4807092 --- /dev/null +++ b/util.c @@ -0,0 +1,40 @@ +#include +#include +#include +#include +#include "util.h" + +int file_size(int fd) +{ + struct stat stat; + fstat(fd, &stat); + return stat.st_size; +} + +int xread(int fd, char *buf, int len) +{ + int nr = 0; + while (nr < len) { + int ret = read(fd, buf + nr, len - nr); + if (ret == -1 && (errno == EAGAIN || errno == EINTR)) + continue; + if (ret <= 0) + break; + nr += ret; + } + return nr; +} + +int xwrite(int fd, char *buf, int len) +{ + int nw = 0; + while (nw < len) { + int ret = write(fd, buf + nw, len - nw); + if (ret == -1 && (errno == EAGAIN || errno == EINTR)) + continue; + if (ret < 0) + break; + nw += ret; + } + return nw; +} diff --git a/util.h b/util.h new file mode 100644 index 0000000..382b3e9 --- /dev/null +++ b/util.h @@ -0,0 +1,3 @@ +int file_size(int fd); +int xread(int fd, char *buf, int len); +int xwrite(int fd, char *buf, int len); -- 2.11.4.GIT