@@ -354,6 +354,8 @@ response_capability(session *ssn, int tag)
354354 ssn -> capabilities |= CAPABILITY_ENABLE ;
355355 if (xstrcasestr (s , "UTF8=ACCEPT" ))
356356 ssn -> capabilities |= CAPABILITY_UTF8 ;
357+ if (xstrcasestr (s , "NOTIFY" ))
358+ ssn -> capabilities |= CAPABILITY_NOTIFY ;
357359
358360 xfree (s );
359361 }
@@ -892,3 +894,53 @@ response_idle(session *ssn, int tag, char **event)
892894
893895 return STATUS_UNTAGGED ;
894896}
897+
898+
899+ /*
900+ * Process the data that server sent due to IMAP NOTIFY client request.
901+ */
902+ int
903+ response_notify (session * ssn , char * * event )
904+ {
905+ regexp * re ;
906+ ssize_t n ;
907+ int eintr = 0 ;
908+
909+ re = & responses [RESPONSE_UNTAGGED ];
910+
911+ for (;;) {
912+ buffer_reset (& ibuf );
913+
914+ do {
915+ buffer_check (& ibuf , ibuf .len + INPUT_BUF );
916+ n = receive_response (ssn , ibuf .data + ibuf .len ,
917+ get_option_number ("keepalive" ) * 60 , 0 , & eintr );
918+ if (n < 0 ) {
919+ if (eintr )
920+ return STATUS_INTERRUPT ;
921+ else
922+ return STATUS_ERROR ;
923+ }
924+ if (n == 0 )
925+ return STATUS_TIMEOUT ;
926+ ibuf .len += n ;
927+
928+ if (check_bye (ibuf .data ))
929+ return handle_bye (ssn );
930+
931+ } while (regexec (re -> preg , ibuf .data , re -> nmatch , re -> pmatch , 0 ));
932+
933+ verbose ("S (%d): %s" , ssn -> socket , ibuf .data );
934+
935+ if (get_option_boolean ("wakeonany" ))
936+ break ;
937+ if (!strncasecmp (ibuf .data + re -> pmatch [1 ].rm_so ,
938+ "STATUS" , strlen ("STATUS" )))
939+ break ;
940+ }
941+
942+ * event = xstrndup (ibuf .data + re -> pmatch [1 ].rm_so ,
943+ re -> pmatch [1 ].rm_eo - re -> pmatch [1 ].rm_so );
944+
945+ return STATUS_UNTAGGED ;
946+ }
0 commit comments