[Dovecot] problem with i_stream_next_line()
Hello there,
I have a "subscriptions" file that is *not* ended with a line break (created by another system). When I do a "lsub "" "*"" the last mailbox name is not listed. Debugging a little showed that it looks like i_stream_next_line() is not returning the last line if it doesn't end with a line break.
Is this a bug?
btw, i'm using version 1.1.6.
[]'s
I did the patch below and it worked for me.
diff --git a/dovecot/src/lib/istream.c b/dovecot/src/lib/istream.c
index 4b218b9..b195b4f 100644
--- a/dovecot/src/lib/istream.c
+++ b/dovecot/src/lib/istream.c
@@ -245,6 +245,10 @@ char *i_stream_next_line(struct istream *stream)
}
}
+ if(ret_buf == NULL && i == _stream->pos) {
+ ret_buf = i_stream_next_line_finish(_stream, i);
+ }
+
return ret_buf;
2008/11/4 Giorgenes Gelatti
Hello there,
I have a "subscriptions" file that is *not* ended with a line break (created by another system). When I do a "lsub "" "*"" the last mailbox name is not listed. Debugging a little showed that it looks like i_stream_next_line() is not returning the last line if it doesn't end with a line break.
Is this a bug?
btw, i'm using version 1.1.6.
[]'s
with attachment may be more useful.
tks.
2008/11/4 Giorgenes Gelatti
I did the patch below and it worked for me.
diff --git a/dovecot/src/lib/istream.c b/dovecot/src/lib/istream.c index 4b218b9..b195b4f 100644 --- a/dovecot/src/lib/istream.c +++ b/dovecot/src/lib/istream.c @@ -245,6 +245,10 @@ char *i_stream_next_line(struct istream *stream) } }
+ if(ret_buf == NULL && i == _stream->pos) { + ret_buf = i_stream_next_line_finish(_stream, i); + } + return ret_buf;
2008/11/4 Giorgenes Gelatti
Hello there,
I have a "subscriptions" file that is *not* ended with a line break (created by another system). When I do a "lsub "" "*"" the last mailbox name is not listed. Debugging a little showed that it looks like i_stream_next_line() is not returning the last line if it doesn't end with a line break.
Is this a bug?
btw, i'm using version 1.1.6.
[]'s
It's not a good idea to change the code that way. For example dovecot- uidlist reading relies on i_stream_next_line() not returning a partially written. That's why the API description also says: /* Gets the next line from stream and returns it, or NULL if more data is needed to make a full line. Note that if the stream ends with LF not being the last character, this function doesn't return the last line. */ char *i_stream_next_line(struct istream *stream); I'd think the easiest way would be for you to just add the missing LFs to the subscription files. Or alternatively change the subscription file reading code to also include the last line (with i_stream_get_data() after i_stream_next_line() has returned NULL). On Nov 4, 2008, at 10:36 PM, Giorgenes Gelatti wrote:
I did the patch below and it worked for me.
diff --git a/dovecot/src/lib/istream.c b/dovecot/src/lib/istream.c index 4b218b9..b195b4f 100644 --- a/dovecot/src/lib/istream.c +++ b/dovecot/src/lib/istream.c @@ -245,6 +245,10 @@ char *i_stream_next_line(struct istream *stream) } }
+ if(ret_buf == NULL && i == _stream->pos) { + ret_buf = i_stream_next_line_finish(_stream, i); + } + return ret_buf;
2008/11/4 Giorgenes Gelatti
Hello there,
I have a "subscriptions" file that is *not* ended with a line break (created by another system). When I do a "lsub "" "*"" the last mailbox name is not listed. Debugging a little showed that it looks like i_stream_next_line() is not returning the last line if it doesn't end with a line break.
Is this a bug?
btw, i'm using version 1.1.6.
[]'s
Ok. I've made a new patch in the subscription-file.c to fix my problem.
Attached...
thank you
2008/11/4 Timo Sirainen
It's not a good idea to change the code that way. For example dovecot-uidlist reading relies on i_stream_next_line() not returning a partially written. That's why the API description also says:
/* Gets the next line from stream and returns it, or NULL if more data is needed to make a full line. Note that if the stream ends with LF not being the last character, this function doesn't return the last line. */ char *i_stream_next_line(struct istream *stream);
I'd think the easiest way would be for you to just add the missing LFs to the subscription files. Or alternatively change the subscription file reading code to also include the last line (with i_stream_get_data() after i_stream_next_line() has returned NULL).
On Nov 4, 2008, at 10:36 PM, Giorgenes Gelatti wrote:
I did the patch below and it worked for me.
diff --git a/dovecot/src/lib/istream.c b/dovecot/src/lib/istream.c index 4b218b9..b195b4f 100644 --- a/dovecot/src/lib/istream.c +++ b/dovecot/src/lib/istream.c @@ -245,6 +245,10 @@ char *i_stream_next_line(struct istream *stream) } }
+ if(ret_buf == NULL && i == _stream->pos) { + ret_buf = i_stream_next_line_finish(_stream, i); + } + return ret_buf;
2008/11/4 Giorgenes Gelatti
Hello there,
I have a "subscriptions" file that is *not* ended with a line break (created by another system). When I do a "lsub "" "*"" the last mailbox name is not listed. Debugging a little showed that it looks like i_stream_next_line() is not returning the last line if it doesn't end with a line break.
Is this a bug?
btw, i'm using version 1.1.6.
[]'s
participants (2)
-
Giorgenes Gelatti
-
Timo Sirainen