ftp.nice.ch/pub/next/unix/mail/elm2.4/elm.2.4pl17.s.tar.gz#/lib/ldstate.c

This is ldstate.c in view mode; [Download] [Up]

static char rcsid[] = "@(#)$Id: ldstate.c,v 5.3 1992/12/11 01:45:04 syd Exp $";

/*******************************************************************************
 *  The Elm Mail System  -  $Revision: 5.3 $   $State: Exp $
 *
 *			Copyright (c) 1992 USENET Community Trust
 *******************************************************************************
 * Bug reports, patches, comments, suggestions should be sent to:
 *
 *	Syd Weinstein, Elm Coordinator
 *	elm@DSI.COM			dsinc!elm
 *
 *******************************************************************************
 * $Log: ldstate.c,v $
 * Revision 5.3  1992/12/11  01:45:04  syd
 * remove sys/types.h include, it is now included by defs.h
 * and this routine includes defs.h or indirectly includes defs.h
 * From: Syd
 *
 * Revision 5.2  1992/12/07  04:51:34  syd
 * add sys/types.h for time_t declaration
 *
 * Revision 5.1  1992/10/03  22:41:36  syd
 * Initial checkin as of 2.4 Release at PL0
 *
 *
 ******************************************************************************/

#include <stdio.h>
#include "defs.h"

/*
 * Retrieve Elm folder state.
 *
 * The SY_DUMPSTATE option to "system_call()" causes Elm to dump the
 * current folder state before spawning a shell.  This allows programs
 * running as an Elm subprocess (e.g. "readmsg") to obtain information
 * on the folder.  (See the "system_call()" code for additional info
 * on the format of the state file.)
 *
 * This procedure returns -1 on the event of an error (corrupt state
 * file or malloc failed).
 *
 * A zero return does NOT necessarily mean that folder state information
 * was retrieved.  On a zero return, inspect the "folder_name" element.
 * If it was NULL then there was no state file found.  If it is non-NULL
 * then valid folder state information was found and loaded into
 * the (struct folder_state) record.
 */


static char *fgetline(buf, buflen, fp)
char *buf;
unsigned buflen;
FILE *fp;
{
    if (fgets(buf, buflen, fp) == NULL)
	return (char *) NULL;
    buf[strlen(buf)-1] = '\0';
    return buf;
}


int load_folder_state_file(fst)
struct folder_state *fst;
{
    char buf[SLEN], *state_fname;
    int status, i;
    FILE *fp;
    extern long atol();

    /* clear out the folder status record */
    fst->folder_name = NULL;
    fst->num_mssgs = -1;
    fst->idx_list = NULL;
    fst->num_sel = -1;
    fst->sel_list = NULL;

    /* see if we can find a state file */
    if ((state_fname = getenv(FOLDER_STATE_ENV)) == NULL)
	return 0;
    if ((fp = fopen(state_fname, "r")) == NULL)
	return 0;

    /* initialize status to failure */
    status = -1;

    /* retrieve pathname of the folder */
    if (fgetline(buf, sizeof(buf), fp) == NULL || buf[0] != 'F')
	goto done;
    if ((fst->folder_name = malloc(strlen(buf+1) + 1)) == NULL)
	goto done;
    (void) strcpy(fst->folder_name, buf+1);

    /* retrieve number of messages in the folder */
    if (fgetline(buf, sizeof(buf), fp) == NULL || buf[0] != 'N')
	goto done;
    fst->num_mssgs = atoi(buf+1);

    /* allocate space to hold the indices */
    fst->idx_list = (long *) malloc(fst->num_mssgs * sizeof(long));
    if (fst->idx_list == NULL)
	goto done;

    /* load in the indices of the messages */
    for (i = 0 ; i < fst->num_mssgs ; ++i) {
	if (fgetline(buf, sizeof(buf), fp) == NULL || buf[0] != 'I')
	    goto done;
	fst->idx_list[i] = atol(buf+1);
    }

    /* load in the number of messages selected */
    if (fgetline(buf, sizeof(buf), fp) == NULL || buf[0] != 'C')
	goto done;
    fst->num_sel = atoi(buf+1);

    /* it is possible that there are no selections */
    if (fst->num_sel > 0) {

	/* allocate space to hold the list of selected messages */
	fst->sel_list = (int *) malloc(fst->num_sel * sizeof(int));
	if (fst->sel_list == NULL)
	    goto done;

	/* load in the list of selected messages */
	for (i = 0 ; i < fst->num_sel ; ++i) {
	    if (fgetline(buf, sizeof(buf), fp) == NULL || buf[0] != 'S')
		goto done;
	    fst->sel_list[i] = atoi(buf+1);
	}

    }

    /* that should be the end of the file */
    if (fgetline(buf, sizeof(buf), fp) != NULL)
	goto done;

    /* success */
    status = 0;

done:
    (void) fclose(fp);
    return status;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.