+/*
+ * Test whether buffer contains a header that appears in header list.
+ * Enter: listHdr Header list.
+ * buf Header buffer.
+ * Return: TRUE if header in list.
+ */
+static gboolean addrharvest_check_hdr( GList *listHdr, gchar *buf ) {
+ gboolean retVal;
+ GList *node;
+ gchar *p, *hdr, *nhdr;
+ gint len;
+
+ retVal = FALSE;
+ p = strchr( buf, ':' );
+ if( p ) {
+ len = ( size_t ) ( p - buf );
+ hdr = g_strndup( buf, len );
+ node = listHdr;
+ while( node ) {
+ nhdr = node->data;
+ if( g_strcasecmp( nhdr, hdr ) == 0 ) {
+ retVal = TRUE;
+ break;
+ }
+ node = g_list_next( node );
+ }
+ g_free( hdr );
+ }
+ return retVal;
+}
+
+/*
+ * Read header into a linked list of lines.
+ * Enter: fp File to read.
+ * listHdr List of header lines of interest.
+ * done End of headers or end of file reached.
+ * Return: Linked list of lines.
+ */
+static GSList *addrharvest_get_header( FILE *fp, GList *listHdr, gboolean *done ) {
+ GSList *list;
+ gchar buf[ MSG_BUFFSIZE + 2 ];
+ gint ch;
+ gboolean foundHdr;
+
+ list = NULL;
+
+ /* Read line */
+ if( fgets( buf, MSG_BUFFSIZE, fp ) == NULL ) {
+ *done = TRUE;
+ return list;
+ }
+
+ /* Test for end of headers */
+ if( buf[0] == '\r' || buf[0] == '\n' ) {
+ *done = TRUE;
+ return list;
+ }
+
+ /* Test whether required header */
+ foundHdr = addrharvest_check_hdr( listHdr, buf );
+
+ /* Read all header lines. Only add reqd ones to list */
+ while( TRUE ) {
+ gchar *p;
+
+ if( foundHdr ) {
+ p = g_strdup( buf );
+ list = g_slist_append( list, p );
+ }
+
+ /* Read first character */
+ ch = fgetc( fp );
+ if( ch == ' ' || ch == '\t' ) {
+ /* Continuation character - read into buffer */
+ if( fgets( buf, MSG_BUFFSIZE, fp ) == NULL ) {
+ break;
+ }
+ }
+ else {
+ if( ch == EOF ) {
+ *done = TRUE;
+ }
+ else {
+ /* Push back character for next header */
+ ungetc( ch, fp );
+ }
+ break;
+ }
+ }
+
+ return list;
+}
+