diff support/bboards/mmdfII/bboards/getbbent.c @ 0:bce86c4163a3

Initial revision
author kono
date Mon, 18 Apr 2005 23:46:02 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/support/bboards/mmdfII/bboards/getbbent.c	Mon Apr 18 23:46:02 2005 +0900
@@ -0,0 +1,718 @@
+/* getbbent.c - subroutines for accessing the BBoards file */
+
+/* LINTLIBRARY */
+
+#include "bboards.h"
+#ifndef	MMDFONLY
+#include "../h/strings.h"
+#include <sys/types.h>
+#else	MMDFONLY
+#include "util.h"
+#include "mmdf.h"
+#include "strings.h"
+#endif	MMDFONLY
+#include <ctype.h>
+#include <pwd.h>
+#include <grp.h>
+#include <stdio.h>
+#include <sys/stat.h>
+
+
+#ifndef	MMDFONLY
+#define	NOTOK	(-1)
+#define	OK	0
+#endif	not MMDFONLY
+
+
+#define	MaxBBAka	100
+#define	MaxBBLdr	100
+#define	MaxBBDist	100
+
+
+#define	NCOLON	9		/* currently 10 fields per entry */
+
+#define	COLON	':'
+#define	COMMA	','
+#define	NEWLINE	'\n'
+
+
+#define	ARCHIVE	"archive"
+#define	CNTFILE	".cnt"
+#define	DSTFILE	".dist"
+#define	MAPFILE ".map"
+
+/*  */
+
+static int  BBuid = -1;
+
+static unsigned int  BBflags = SB_NULL;
+
+static char BBName[BUFSIZ] = BBOARDS;
+static char BBDir[BUFSIZ] = "";
+static char BBData[BUFSIZ] = "";
+
+static  FILE *BBfile = NULL;
+
+
+static struct bboard    BB;
+static struct bboard   *bb = &BB;
+
+static int  BBload = 1;
+
+static char BBFile[BUFSIZ];
+static char BBArchive[BUFSIZ];
+static char BBInfo[BUFSIZ];
+static char BBMap[BUFSIZ];
+static char *BBAkas[MaxBBAka];
+static char *BBLeaders[MaxBBLdr];
+static char *BBDists[MaxBBDist];
+static char BBAddr[BUFSIZ];
+static char BBRequest[BUFSIZ];
+static char BBDate[BUFSIZ];
+static char BBErrors[BUFSIZ];
+
+#ifdef	MMDFONLY
+extern LLog *logptr;
+#endif	MMDFONLY
+
+char   *bbskip (), *getcpy ();
+
+char   *crypt (), *getpass ();
+struct group  *getgrnam ();
+struct passwd *getpwnam (), *getpwuid ();
+
+/*  */
+
+int     setbbfile (file, f)
+register char  *file;
+register int    f;
+{
+    if (BBuid == -1)
+	return setbbinfo (BBOARDS, file, f);
+
+    (void) strcpy (BBData, file);
+
+    BBflags = SB_NULL;
+    (void) endbbent ();
+
+    return setbbent (f);
+}
+
+/*  */
+
+int	setbbinfo (user, file, f)
+register char  *user,
+               *file;
+register int	f;
+{
+    register struct passwd *pw;
+
+    if ((pw = getpwnam (user)) == NULL) {
+	(void) sprintf (BBErrors, "unknown user: %s", user);
+	return 0;
+    }
+
+    return setpwinfo (pw, file, f);
+}
+
+
+int	setpwinfo (pw, file, f)
+register struct passwd *pw;
+register char  *file;
+register int	f;
+{
+    if (!setpwaux (pw, file))
+	return 0;
+
+    BBflags = SB_NULL;
+    (void) endbbent ();
+
+    return setbbent (f);
+}
+
+/*  */
+
+static int  setbbaux (name, file)
+register char  *name,
+	       *file;
+{
+    register struct passwd *pw;
+
+    if ((pw = getpwnam (name)) == NULL) {
+	(void) sprintf (BBErrors, "unknown user: %s", name);
+	return 0;
+    }
+
+    return setpwaux (pw, file);
+}
+
+
+static int  setpwaux (pw, file)
+register struct passwd *pw;
+register char  *file;
+{
+    (void) strcpy (BBName, pw -> pw_name);
+    BBuid = pw -> pw_uid;
+    (void) strcpy (BBDir, pw -> pw_dir);
+    (void) sprintf (BBData, "%s/%s",
+	    *file != '/' ? BBDir : "",
+	    *file != '/' ? file : file + 1);
+
+    BBflags = SB_NULL;
+
+    return 1;
+}
+
+/*  */
+
+int     setbbent (f)
+register int     f;
+{
+    if (BBfile == NULL) {
+	if (BBuid == -1 && !setbbaux (BBOARDS, BBDB))
+	    return 0;
+
+	if ((BBfile = fopen (BBData, "r")) == NULL) {
+	    (void) sprintf (BBErrors, "unable to open: %s", BBData);
+	    return 0;
+	}
+    }
+    else
+	rewind (BBfile);
+
+    BBflags |= f;
+    return (BBfile != NULL);
+}
+
+
+int     endbbent () {
+    if (BBfile != NULL && !(BBflags & SB_STAY)) {
+	(void) fclose (BBfile);
+	BBfile = NULL;
+    }
+
+    return 1;
+}
+
+
+long    getbbtime () {
+    struct stat st;
+
+    if (BBfile == NULL) {
+	if (BBuid == -1 && !setbbaux (BBOARDS, BBDB))
+	    return 0;
+
+	if (stat (BBData, &st) == NOTOK) {
+	    (void) sprintf (BBErrors, "unable to stat: %s", BBData);
+	    return 0;
+	}
+    }
+    else
+	if (fstat (fileno (BBfile), &st) == NOTOK) {
+	    (void) sprintf (BBErrors, "unable to fstat: %s", BBData);
+	    return 0;
+	}
+
+    return ((long) st.st_mtime);
+}
+
+/*  */
+
+struct bboard  *getbbent () {
+    register int    count;
+    register char  *p,
+                   *q,
+                   *r,
+                   *d,
+                   *f,
+                  **s;
+    static char line[BUFSIZ];
+
+    if (BBfile == NULL && !setbbent (SB_NULL))
+	return NULL;
+
+retry: ;
+    if ((p = fgets (line, sizeof line, BBfile)) == NULL)
+	return NULL;
+
+    for (q = p, count = 0; *q != NULL && *q != NEWLINE; q++)
+	if (*q == COLON)
+	    count++;
+
+    if (count != NCOLON) {
+#ifdef	MMDFONLY
+	if (q = index (p, NEWLINE))
+	    *q = NULL;
+	ll_log (logptr, LLOGTMP, "bad entry in %s: %s", BBData, p);
+#endif	MMDFONLY
+	goto retry;
+    }
+    
+    bb -> bb_name = p;
+    p = q = bbskip (p, COLON);
+    p = bb -> bb_file = bbskip (p, COLON);
+    bb -> bb_archive = bb -> bb_info = bb -> bb_map = "";
+    p = bb -> bb_passwd = bbskip (p, COLON);
+    p = r = bbskip (p, COLON);
+    p = bb -> bb_addr = bbskip (p, COLON);
+    p = bb -> bb_request = bbskip (p, COLON);
+    p = bb -> bb_relay = bbskip (p, COLON);
+    p = d = bbskip (p, COLON);
+    p = f = bbskip (p, COLON);
+    (void) bbskip (p, NEWLINE);
+
+    s = bb -> bb_aka = BBAkas;
+    while (*q) {
+	*s++ = q;
+	q = bbskip (q, COMMA);
+    }
+    *s = NULL;
+
+    s = bb -> bb_leader = BBLeaders;
+    if (*r == NULL) {
+	if (!(BBflags & SB_FAST))
+	    *s++ = BBName;
+    }
+    else
+	while (*r) {
+	    *s++ = r;
+	    r = bbskip (r, COMMA);
+	}
+    *s = NULL;
+
+    s = bb -> bb_dist = BBDists;
+    while (*d) {
+	*s++ = d;
+	d = bbskip (d, COMMA);
+    }
+    *s = NULL;
+
+    if (*f)
+	(void) sscanf (f, "%o", &bb -> bb_flags);
+    else
+	bb -> bb_flags = BB_NULL;
+    bb -> bb_count = bb -> bb_maxima = 0;
+    bb -> bb_date = NULL;
+    bb -> bb_next = bb -> bb_link = bb -> bb_chain = NULL;
+
+    if (BBload)
+	BBread ();
+
+    return bb;
+}
+
+/*  */
+
+struct bboard  *getbbnam (name)
+register char   *name;
+{
+    register struct bboard *b = NULL;
+
+    if (!setbbent (SB_NULL))
+	return NULL;
+    BBload = 0;
+    while ((b = getbbent ()) && strcmp (name, b -> bb_name))
+	continue;
+    BBload = 1;
+    (void) endbbent ();
+
+    if (b != NULL)
+	BBread ();
+
+    return b;
+}
+
+
+struct bboard  *getbbaka (aka)
+register char   *aka;
+{
+    register char **ap;
+    register struct bboard *b = NULL;
+
+    if (!setbbent (SB_NULL))
+	return NULL;
+    BBload = 0;
+    while ((b = getbbent ()) != NULL)
+	for (ap = b -> bb_aka; *ap; ap++)
+	    if (strcmp (aka, *ap) == 0)
+		goto hit;
+hit: ;
+    BBload = 1;
+    (void) endbbent ();
+
+    if (b != NULL)
+	BBread ();
+
+    return b;
+}
+
+/*  */
+
+static int  BBread () {
+    register int    i;
+    register char  *cp,
+                   *dp,
+		   *p,
+		   *r;
+    char    prf[BUFSIZ];
+    static char line[BUFSIZ];
+    register    FILE * info;
+
+    if (BBflags & SB_FAST)
+	return;
+
+    p = index (bb -> bb_request, '@');
+    r = index (bb -> bb_addr, '@');
+    BBRequest[0] = NULL;
+
+    if (*bb -> bb_request == '-')
+	if (p == NULL && r && *r == '@')
+	    (void) sprintf (BBRequest, "%s%s%s",
+		    bb -> bb_name, bb -> bb_request, r);
+	else
+	    (void) sprintf (BBRequest, "%s%s",
+		    bb -> bb_name, bb -> bb_request);
+    else
+	if (p == NULL && r && *r == '@' && *bb -> bb_request)
+	    (void) sprintf (BBRequest, "%s%s", bb -> bb_request, r);
+
+    if (BBRequest[0])
+	bb -> bb_request = BBRequest;
+    else
+	if (*bb -> bb_request == NULL)
+	    bb -> bb_request = *bb -> bb_addr ? bb -> bb_addr
+		: bb -> bb_leader[0];
+
+    if (*bb -> bb_addr == '@') {
+	(void) sprintf (BBAddr, "%s%s", bb -> bb_name, bb -> bb_addr);
+	bb -> bb_addr = BBAddr;
+    }
+    else
+	if (*bb -> bb_addr == NULL)
+	    bb -> bb_addr = bb -> bb_name;
+
+    if (*bb -> bb_file == NULL)
+	return;
+    if (*bb -> bb_file != '/') {
+	(void) sprintf (BBFile, "%s/%s", BBDir, bb -> bb_file);
+	bb -> bb_file = BBFile;
+    }
+
+    if ((cp = rindex (bb -> bb_file, '/')) == NULL || *++cp == NULL)
+	(void) strcpy (prf, ""), cp = bb -> bb_file;
+    else
+	(void) sprintf (prf, "%.*s", cp - bb -> bb_file, bb -> bb_file);
+    if ((dp = index (cp, '.')) == NULL)
+	dp = cp + strlen (cp);
+
+    (void) sprintf (BBArchive, "%s%s/%s", prf, ARCHIVE, cp);
+    bb -> bb_archive = BBArchive;
+    (void) sprintf (BBInfo, "%s.%.*s%s", prf, dp - cp, cp, CNTFILE);
+    bb -> bb_info = BBInfo;
+    (void) sprintf (BBMap, "%s.%.*s%s", prf, dp - cp, cp, MAPFILE);
+    bb -> bb_map = BBMap;
+
+    if ((info = fopen (bb -> bb_info, "r")) == NULL)
+	return;
+
+    if (fgets (line, sizeof line, info) && (i = atoi (line)) > 0)
+	bb -> bb_maxima = (unsigned) i;
+    if (!feof (info) && fgets (line, sizeof line, info)) {
+	(void) strcpy (BBDate, line);
+	if (cp = index (BBDate, NEWLINE))
+	    *cp = NULL;
+	bb -> bb_date = BBDate;
+    }
+
+    (void) fclose (info);
+}
+
+/*  */
+
+int     ldrbb (b)
+register struct bboard  *b;
+{
+    register char  *p,
+                  **q,
+                  **r;
+    static int  uid = 0,
+                gid = 0;
+    static char username[10] = "";
+    register struct passwd *pw;
+    register struct group  *gr;
+
+    if (b == NULL)
+	return 0;
+    if (BBuid == -1 && !setbbaux (BBOARDS, BBDB))
+	return 0;
+
+    if (username[0] == NULL) {
+	if ((pw = getpwuid (uid = getuid ())) == NULL)
+	    return 0;
+	gid = getgid ();
+	(void) strcpy (username, pw -> pw_name);
+    }
+
+    if (uid == BBuid)
+	return 1;
+
+    q = b -> bb_leader;
+    while (p = *q++)
+	if (*p == '=') {
+	    if ((gr = getgrnam (++p)) == NULL)
+		continue;
+	    if (gid == gr -> gr_gid)
+		return 1;
+	    r = gr -> gr_mem;
+	    while (p = *r++)
+		if (strcmp (username, p) == 0)
+		    return 1;
+	}
+	else
+	    if (strcmp (username, p) == 0)
+		return 1;
+
+    return 0;
+}
+
+/*  */
+
+int     ldrchk (b)
+register struct bboard  *b;
+{
+    if (b == NULL)
+	return 0;
+
+    if (*b -> bb_passwd == NULL)
+	return 1;
+
+    if (strcmp (b -> bb_passwd,
+		crypt (getpass ("Password: "), b -> bb_passwd)) == 0)
+	return 1;
+
+    fprintf (stderr, "Sorry\n");
+    return 0;
+}
+
+/*  */
+
+struct bboard  *getbbcpy (bp)
+register struct bboard  *bp;
+{
+    register char **p,
+                  **q;
+    register struct bboard *b;
+
+    if (bp == NULL)
+	return NULL;
+
+    b = (struct bboard *) malloc ((unsigned) sizeof *b);
+    if (b == NULL)
+	return NULL;
+
+    b -> bb_name = getcpy (bp -> bb_name);
+    b -> bb_file = getcpy (bp -> bb_file);
+    b -> bb_archive = getcpy (bp -> bb_archive);
+    b -> bb_info = getcpy (bp -> bb_info);
+    b -> bb_map = getcpy (bp -> bb_map);
+    b -> bb_passwd = getcpy (bp -> bb_passwd);
+    b -> bb_flags = bp -> bb_flags;
+    b -> bb_count = bp -> bb_count;
+    b -> bb_maxima = bp -> bb_maxima;
+    b -> bb_date = getcpy (bp -> bb_date);
+    b -> bb_addr = getcpy (bp -> bb_addr);
+    b -> bb_request = getcpy (bp -> bb_request);
+    b -> bb_relay = getcpy (bp -> bb_relay);
+
+    for (p = bp -> bb_aka; *p; p++)
+	continue;
+    b -> bb_aka =
+	q = (char **) calloc ((unsigned) (p - bp -> bb_aka + 1), sizeof *q);
+    if (q == NULL)
+	return NULL;
+    for (p = bp -> bb_aka; *p; *q++ = getcpy (*p++))
+	continue;
+    *q = NULL;
+
+    for (p = bp -> bb_leader; *p; p++)
+	continue;
+    b -> bb_leader =
+	q = (char **) calloc ((unsigned) (p - bp -> bb_leader + 1), sizeof *q);
+    if (q == NULL)
+	return NULL;
+    for (p = bp -> bb_leader; *p; *q++ = getcpy (*p++))
+	continue;
+    *q = NULL;
+
+    for (p = bp -> bb_dist; *p; p++)
+	continue;
+    b -> bb_dist = 
+	q = (char **) calloc ((unsigned) (p - bp -> bb_dist + 1), sizeof *q);
+    if (q == NULL)
+	return NULL;
+    for (p = bp -> bb_dist; *p; *q++ = getcpy (*p++))
+	continue;
+    *q = NULL;
+
+    b -> bb_next = bp -> bb_next;
+    b -> bb_link = bp -> bb_link;
+    b -> bb_chain = bp -> bb_chain;
+
+    return b;
+}
+
+/*  */
+
+int     getbbdist (bb, action)
+register struct bboard  *bb;
+register int     (*action) ();
+{
+    register int    result;
+    register char **dp;
+
+    BBErrors[0] = NULL;
+    for (dp = bb -> bb_dist; *dp; dp++)
+	if (result = getbbitem (bb, *dp, action))
+	    return result;
+
+    return result;
+}
+
+char    *getbberr () {
+    return (BBErrors[0] ? BBErrors : NULL);
+};
+
+/*  */
+
+static int  getbbitem (bb, item, action)
+register struct bboard  *bb;
+register char   *item;
+register int     (*action) ();
+{
+    register int    result;
+    register char  *cp,
+                   *dp,
+                   *hp,
+                   *np;
+    char    mbox[BUFSIZ],
+            buffer[BUFSIZ],
+            file[BUFSIZ],
+            host[BUFSIZ],
+            prf[BUFSIZ];
+    register FILE *fp;
+
+    switch (*item) {
+	case '*': 
+	    switch (*++item) {
+		case '/': 
+		    hp = item;
+		    break;
+
+		case NULL: 
+		    if ((cp = rindex (bb -> bb_file, '/')) == NULL || *++cp == NULL)
+			(void) strcpy (prf, ""), cp = bb -> bb_file;
+		    else
+			(void) sprintf (prf, "%.*s", cp - bb -> bb_file, bb -> bb_file);
+		    if ((dp = index (cp, '.')) == NULL)
+			dp = cp + strlen (cp);
+		    (void) sprintf (file, "%s.%.*s%s", prf, dp - cp, cp, DSTFILE);
+		    hp = file;
+		    break;
+
+		default: 
+		    (void) sprintf (file, "%s/%s", BBDir, item);
+		    hp = file;
+		    break;
+	    }
+
+	    if ((fp = fopen (hp, "r")) == NULL)
+		return bblose ("unable to read file %s", hp);
+	    while (fgets (buffer, sizeof buffer, fp)) {
+		if (np = index (buffer, '\n'))
+		    *np = NULL;
+		if (result = getbbitem (bb, buffer, action)) {
+		    (void) fclose (fp);
+		    (void) bblose ("error with file %s, item %s", hp, buffer);
+		    return result;
+		}
+	    }
+	    (void) fclose (fp);
+	    return OK;
+
+	default: 
+	    if (hp = rindex (item, '@')) {
+		*hp++ = NULL;
+		(void) strcpy (mbox, item);
+		(void) strcpy (host, hp);
+		*--hp = '@';
+	    }
+	    else {
+		(void) sprintf (mbox, "%s%s", DISTADR, bb -> bb_name);
+		(void) strcpy (host, item);
+	    }
+	    if (result = (*action) (mbox, host))
+		(void) bblose ("action (%s, %s) returned 0%o", mbox, host, result);
+	    return result;
+    }
+}
+
+/*  */
+
+/* VARARGS1 */
+
+static int  bblose (fmt, a, b, c)
+char   *fmt,
+       *a,
+       *b,
+       *c;
+{
+    if (BBErrors[0] == NULL)
+	(void) sprintf (BBErrors, fmt, a, b, c);
+
+    return NOTOK;
+}
+
+/*  */
+
+void	make_lower (s1, s2)
+register char   *s1,
+		*s2;
+{
+    if (s1 == NULL || s2 == NULL)
+	return;
+
+    for (; *s2; s2++)
+	*s1++ = isupper (*s2) ? tolower (*s2) : *s2;
+    *s1 = NULL;
+}
+
+/*  */
+
+static char *bbskip (p, c)
+register char  *p,
+		c;	
+{
+    if (p == NULL)
+	return NULL;
+
+    while (*p && *p != c)
+	p++;
+    if (*p)
+	*p++ = NULL;
+
+    return p;
+}
+
+
+static	char   *getcpy (s)
+register char   *s;
+{
+    register char  *p;
+
+    if (s == NULL)
+	return NULL;
+
+    if (p = malloc ((unsigned) (strlen (s) + 1)))
+	(void) strcpy (p, s);
+    return p;
+}