Good morning Steffen,

HUGE thanks for all your contrusctive & informative messages. I'm grateful for 
the
debugging you did.

Steffen Nurpmeso wrote : 
> Ahem.
> 
> Sorry i was too fast, the patch had a bug, and then from the
> standard point of view an "untagged" response should treated by
> itself.  So i added [1] on all the [master] and [stable] series
> and gave you credit again.
> 
>   [1] 
> https://git.sdaoden.eu/browse?p=s-nail.git;a=commit;h=9352ebfe6e5de589655194fce0d27b1de2f144a8
> 
> So, for the interested, the entire patch is now as below, and
> i say thanks! and Ciao! from Germany.
> 
> diff --git a/THANKS b/THANKS
> index 255977b2a0..27a5b27f4e 100644
> --- a/THANKS
> +++ b/THANKS
> @@ -91,6 +91,7 @@ John P. Linderman         jpl dot jpl at gmail dot com
>  Johannes Löthberg         johannes at kyriasis dot com
>  Daniel Lublin             daniel at lublin dot se
>  Martin Lucina             martin at lucina dot net
> +Madou Mad                 huguelectro at hotmail dot fr
>  Anders Magnusson          ragge at ludd dot ltu dot se
>  Wiesław Magusiak          wiemag at poczta dot onet dot pl
>  Nicholas Marriott         nicholas dot marriott at gmail dot com
> diff --git a/nail.1 b/nail.1
> index 602b30d256..2cb30a82ac 100644
> --- a/nail.1
> +++ b/nail.1
> @@ -15497,7 +15497,10 @@ but other accounts are not affected.
>  .It Va imap-auth-USER@HOST , imap-auth
>  Sets the IMAP authentication method.
>  Supported are the default
> -.Ql login ,
> +.Ql login
> +(called
> +.Ql plain
> +by some servers),
>  \*(IN
>  .Ql oauthbearer
>  (see
> diff --git a/src/mx/net-socket.c b/src/mx/net-socket.c
> index e9d84c2739..16b3cb3869 100644
> --- a/src/mx/net-socket.c
> +++ b/src/mx/net-socket.c
> @@ -752,7 +752,10 @@ mx_socket_write1(struct mx_socket *sop, char const 
> *data, int size,
>  jssl_retry:
>        x = SSL_write(sop->s_tls, data, size);
>        if(x < 0){
> -         if(++errcnt < 3 && (err = su_err_no()) != su_ERR_WOULDBLOCK){
> +         if((err = su_err_no()) == su_ERR_INTR)
> +            goto jssl_retry;
> +
> +         if(++errcnt < 3 && err != su_ERR_WOULDBLOCK){
>              switch(SSL_get_error(sop->s_tls, x)){
>              case SSL_ERROR_WANT_READ:
>              case SSL_ERROR_WANT_WRITE:
> @@ -830,7 +833,10 @@ jssl_retry:
>                 if (sop->s_rsz < 0) {
>                    char o[512];
>  
> -                  if(++errcnt < 3 && (err = su_err_no()) != 
> su_ERR_WOULDBLOCK){
> +                  if((err = su_err_no()) == su_ERR_INTR)
> +                     goto jssl_retry;
> +
> +                  if(++errcnt < 3 && err != su_ERR_WOULDBLOCK){
>                       switch(SSL_get_error(sop->s_tls, sop->s_rsz)){
>                       case SSL_ERROR_WANT_READ:
>                       case SSL_ERROR_WANT_WRITE:
> diff --git a/src/mx/obs-imap.c b/src/mx/obs-imap.c
> index 230599f4ee..2a159a9ba0 100644
> --- a/src/mx/obs-imap.c
> +++ b/src/mx/obs-imap.c
> @@ -203,6 +203,7 @@ static char const *a_imap_path_normalize(struct mailbox 
> *mp, char const *cp,
>  static char *imap_path_quote(struct mailbox *mp, char const *cp);
>  static void       imap_other_get(char *pp);
>  static void       imap_response_get(const char **cp);
> +static void a_imap_res__untagged(const char **cp);
>  static void       imap_response_parse(void);
>  static enum okay  imap_answer(struct mailbox *mp, int errprnt);
>  static enum okay  imap_parse_list(void);
> @@ -881,6 +882,22 @@ imap_response_get(const char **cp)
>     NYD2_OU;
>  }
>  
> +static void
> +a_imap_res__untagged(const char **cp){
> +   NYD2_IN;
> +
> +   if(su_cs_cmp_case_n(*cp, "OK ", 3) == 0){
> +      *cp += 3;
> +      response_status = RESPONSE_OK;
> +   }else if (su_cs_cmp_case_n(*cp, "BYE ", 4) == 0){
> +      *cp += 4;
> +      response_status = RESPONSE_BYE;
> +   }else
> +      response_status = RESPONSE_OTHER;
> +
> +   NYD2_OU;
> +}
> +
>  static void
>  imap_response_parse(void)
>  {
> @@ -905,23 +922,20 @@ imap_response_parse(void)
>           pp++;
>        }
>        break;
> +
>     case '*':
> -      ip++;
> -      pp++;
> -      while (*ip == ' ') {
> -         ip++;
> -         pp++;
> +      for(;;){
> +         ++ip, ++pp;
> +         if(*ip != ' ')
> +            break;
>        }
> -      imap_response_get(&ip);
> +
> +      a_imap_res__untagged(&ip);
>        pp = &parsebuf[ip - imapbuf];
> -      switch (response_status) {
> -      case RESPONSE_BYE:
> -         response_type = RESPONSE_FATAL;
> -         break;
> -      default:
> -         response_type = RESPONSE_DATA;
> -      }
> +      response_type = (response_status == RESPONSE_BYE) ? RESPONSE_FATAL
> +            : RESPONSE_DATA;
>        break;
> +
>     default:
>        responded_tag = parsebuf;
>        while (*pp && *pp != ' ')
> @@ -3294,7 +3308,7 @@ imap_append0(struct mailbox *mp, const char *name, FILE 
> *fp, long offset)
>     mx_fs_linepool_aquire(&buf, &bufsize);
>     cnt = fsize(fp);
>     offs = offset /* BSD will move due to O_APPEND! ftell(fp) */;
> -   time(&tim);
> +   tim = 0;
>     size = 0;
>  
>     for (flag = MNEW, state = _NLSEP;;) {

I'll test your patch this weekend, when I have free time. Thanks for fixing 
IMAP code
despite the fact it needs to be rewritten. I'll let you know.

Have a nice day.

Regards.

Reply via email to