aboutsummaryrefslogtreecommitdiff
path: root/libsylph/recv.c
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-11-28 05:43:35 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-11-28 05:43:35 +0000
commit928a2cc8708a85a7fbcceb4d77e163835b158934 (patch)
tree57697350a6f0be8c96d4f2181e22312cb6cb1acd /libsylph/recv.c
parent064a7b172123d65c3bafa35d60ce2c550f30b1ec (diff)
reverted linebreak conversion.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@783 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'libsylph/recv.c')
-rw-r--r--libsylph/recv.c47
1 files changed, 36 insertions, 11 deletions
diff --git a/libsylph/recv.c b/libsylph/recv.c
index 55890df5..47222709 100644
--- a/libsylph/recv.c
+++ b/libsylph/recv.c
@@ -166,6 +166,12 @@ gint recv_write(SockInfo *sock, FILE *fp)
}
p = buf;
+
+ if (len > 1 && buf[len - 1] == '\n' && buf[len - 2] == '\r') {
+ buf[len - 2] = '\n';
+ buf[len - 1] = '\0';
+ }
+
if (buf[0] == '.' && buf[1] == '.')
p++;
else if (!strncmp(buf, ">From ", 6))
@@ -185,27 +191,46 @@ gint recv_write(SockInfo *sock, FILE *fp)
gint recv_bytes_write(SockInfo *sock, glong size, FILE *fp)
{
- gchar buf[BUFFSIZE];
- glong count = 0;
+ gchar *buf;
+ gchar *prev, *cur;
if (size == 0)
return 0;
- do {
- gint read_count, to_read;
+ buf = recv_bytes(sock, size);
+ if (!buf)
+ return -2;
- to_read = MIN(sizeof(buf), size - count);
- read_count = sock_read(sock, buf, to_read);
- if (read_count <= 0)
- return -2;
+ /* +------------------+----------------+--------------------------+ *
+ * ^buf ^prev ^cur buf+size-1^ */
+
+ prev = buf;
+ while ((cur = memchr(prev, '\r', size - (prev - buf))) != NULL) {
+ if (cur == buf + size - 1) break;
- if (fp && fwrite(buf, read_count, 1, fp) < 1) {
+ if (fp && (fwrite(prev, sizeof(gchar), cur - prev, fp) == EOF ||
+ fwrite("\n", sizeof(gchar), 1, fp) == EOF)) {
perror("fwrite");
g_warning(_("Can't write to file.\n"));
fp = NULL;
}
- count += read_count;
- } while (count < size);
+
+ if (*(cur + 1) == '\n')
+ prev = cur + 2;
+ else
+ prev = cur + 1;
+
+ if (prev - buf >= size) break;
+ }
+
+ if (prev - buf < size && fp &&
+ fwrite(buf, sizeof(gchar), size - (prev - buf), fp) == EOF) {
+ perror("fwrite");
+ g_warning(_("Can't write to file.\n"));
+ fp = NULL;
+ }
+
+ g_free(buf);
if (!fp) return -1;