/* $Header: /afs/athena.mit.edu/astaff/project/layerdev/src/xlayer/RCS/config.c,v 1.6 94/07/16 14:33:47 brlewis Exp $ */

#include <stdio.h>
#include <strings.h>
#include <ctype.h>
#include "layer.h"


static char *config_file = "/dev/null";
static char *config_str = NULL;
int quotenewlines;


/* Allocate a copy of the string and return it */

char *strsave(s)
char *s;
{
    char *ret;
    ret = (char *) malloc(strlen(s) + 1);
    strcpy(ret, s);
    return(ret);
}


char *get_config(name)
char *name;
{
    char buf[2048], *p;
    static char retbuf[256];
    FILE *in, *popen();

    if (!config_str) {
	if (config_file && *config_file)
	  sprintf(buf, "%s status subproc config=\"%s\" syspack=\"%s\"",
		  layer_athena, config_file, srvd_dir);
	else
	  sprintf(buf, "%s status subproc syspack=\"%s\"",
		  layer_athena, srvd_dir);
	in = popen(buf, "r");
	if (in) {
	    p = buf;
	    while (fgets(p, sizeof(buf) - (p - buf), in))
	      p = buf + strlen(buf);
	    pclose(in);
	}
	config_str = strsave(buf);
    }

    for (p = config_str; p && *p; p = strchr(p, '\n')) {
	if (p && *p == '\n') p++;
	if (!strncmp(p, name, strlen(name))) {
	    strncpy(retbuf, p + strlen(name) + 2, sizeof(retbuf));
	    if (p = strchr(retbuf, '\n')) *p = 0;
	    return(retbuf);
	}
    }
    return(NULL);
}


set_config(file)
char *file;
{
    config_file = file;
}


clear_config()
{
    free(config_str);
    config_str = NULL;
}


char *sp_version;
struct spsubset *sp_subsets[MAX_SUBSETS];


/* Read info from syspack */

int read_syspack(file)
char *file;
{
    char buf[BUFSIZ], name[64];
    char *p;
    int line, ss, i, j;
    FILE *f;

    if ((f = fopen(file, "r")) == NULL) {
	fprintf(stderr, "Unable to open file %s for input.\n", file);
	return(-1);
    }

    line = ss = 0;
    while (fgets(buf, sizeof(buf), f)) {
	line++;
	p = buf;
	while (*p && isspace(*p)) p++;
	if (!*p || *p == '#') continue;
	if (!strncmp(p, "version:", 8)) {
	    p += 8;
	    while (*p && isspace(*p)) p++;
	    p[strlen(p)-1] = 0;
	    sp_version = strsave(p);
	} else if (!strncmp(p, "subset:", 7)) {
	    p += 7;
	    while (*p && isspace(*p)) p++;
	    p[strlen(p)-1] = 0;
	    sp_subsets[ss] = (struct spsubset *)malloc(sizeof(struct spsubset));
	    memset(sp_subsets[ss], 0, sizeof(struct spsubset));
	    sp_subsets[ss]->name = strsave(p);
	    strcpy(name, p);
	    name[3] = 0;
	    strcat(name, "box");
	    sp_subsets[ss]->box = strsave(name);
	    sp_subsets[ss]->state = 0;
	    sp_subsets[++ss] = NULL;
	} else if (!strncmp(p, "size:", 5)) {
	    p += 5;
	    while (*p && isspace(*p)) p++;
	    sp_subsets[ss-1]->remotesize = atoi(p);
	    while (*p && !isspace(*p)) p++;
	    while (*p && isspace(*p)) p++;
	    sp_subsets[ss-1]->localsize = atoi(p);
	} else if (!strncmp(p, "localonly:", 10)) {
	    sp_subsets[ss-1]->flags |= F_LOCALONLY;
	} else if (!strncmp(p, "disabled:", 9)) {
	    sp_subsets[ss-1]->flags |= F_DISABLED;
	} else if (!strncmp(p, "desc:", 5)) {
	    p += 5;
	    while (*p && isspace(*p)) p++;
	    i = strlen(p);
	    if (quotenewlines && p[i-1] == '\n')
	      p[i-1] = 0;
	    if (sp_subsets[ss-1]->desc == NULL) {
		sp_subsets[ss-1]->desc = (char *) malloc(2000);
		strcpy(sp_subsets[ss-1]->desc, p);
	    } else {
		if (quotenewlines)
		  strcat(sp_subsets[ss-1]->desc, "\\n");
		strcat(sp_subsets[ss-1]->desc, p);
	    }
	} else if (!strncmp(p, "depends:", 8)) {
	    p += 8;
	    j = 0;
	    while (*p) {
		while (*p && isspace(*p)) p++;
		for (i = 0; i < ss; i++) {
		    if (!strncmp(sp_subsets[i]->name, p,
				 strlen(sp_subsets[i]->name))) {
			sp_subsets[ss-1]->depends[j++] = sp_subsets[i];
			break;
		    }
		}
		sp_subsets[ss-1]->depends[j] = NULL;
		while (*p && !isspace(*p)) p++;
	    }
	} else {
	    fprintf(stderr, "%s: syntax error on line %d of config file %s\n",
		    whoami, line, file);
	    exit(2);
	}
    }
    fclose(f);

    if (f = fopen("/srvd/.rvdinfo", "r")) {
	if (fscanf(f, "%s %s %s Version %s %s", buf, buf, buf, name, buf) == 5)
	  sp_version = strsave(name);
	fclose(f);
    }
    return(0);
}
