This is convert.c in view mode; [Download] [Up]
/*
** This utility program converts pre-2.0 Dialup IP configuration files
** into 2.0 style. It writes a sample diald.conf and creates the access
** files.
** Copyright (c) 1991 Bolt Beranek and Newman, Inc.
** All rights reserved.
**
** Redistribution and use in source and binary forms are permitted
** provided that: (1) source distributions retain this entire copyright
** notice and comment, and (2) distributions including binaries display
** the following acknowledgement: ``This product includes software
** developed by Bolt Beranek and Newman, Inc. and CREN/CSNET'' in the
** documentation or other materials provided with the distribution and in
** all advertising materials mentioning features or use of this software.
** Neither the name of Bolt Beranek and Newman nor CREN/CSNET may be used
** to endorse or promote products derived from this software without
** specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
** WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#include <stdio.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/dir.h>
#define MAXDEV 10
#define SMBUF 30
#define EQ(a, b) (strcmp((a), (b)) == 0)
#define nexttok() strtok((char *)NULL, SEPARATORS)
static char SEPARATORS[] = " \t";
static char ACCESS_TEMP[] = "temp.access";
static char CONFIG_FILE[] = "diald.conf";
extern char *strtok();
extern char *strchr();
extern char *strrchr();
extern char *strcpy();
extern void exit();
static void
printlist(access, label)
FILE *access;
char *label;
{
int i;
char *p;
fprintf(access, "%s%s\t", label, strlen(label) < 8 ? "\t" : "");
for (i = 0; p = nexttok(); i++)
fprintf(access, "%s%s", i ? " " : "", p);
fprintf(access, "\n");
}
main()
{
DIR *dp;
struct direct *ep;
int bad;
FILE *F;
FILE *access;
FILE *config;
char *word;
char *p;
char buff[256];
char sitename[SMBUF];
int speeds[MAXDEV];
int nspeeds;
char device[SMBUF];
char lines[MAXDEV][SMBUF];
int nlines;
char script[SMBUF];
char tranfile[SMBUF];
int i;
/* Create config file, get ready to scan directory. */
if ((config = fopen(CONFIG_FILE, "w")) == NULL) {
perror("Can't create config file");
exit(1);
}
if ((dp = opendir(".")) == NULL) {
perror("Can't open \".\"");
exit(1);
}
/* Loop over all files in the current directory. */
for (bad = 0; ep = readdir(dp); ) {
/* Is this a config file? */
if ((p = strrchr(ep->d_name, '.')) == NULL || strcmp(p, ".conf") != 0)
continue;
/* Open the access file and the config file. */
if ((access = fopen(ACCESS_TEMP, "w")) == NULL) {
perror("Can't open temporary file");
bad++;
continue;
}
if ((F = fopen(ep->d_name, "r")) == NULL) {
perror(ep->d_name);
bad++;
(void)fclose(access);
continue;
}
/* Loop over all lines in the config file. */
nspeeds = nlines = 0;
device[0] = '\0';
script[0] = '\0';
sitename[0] = '\0';
tranfile[0] = '\0';
while (fgets(buff, sizeof buff, F)) {
if ((p = strchr(buff, '\n')) == NULL) {
fprintf(stderr, "Line too long in %s:\n%s...\n",
ep->d_name, buff);
bad++;
break;
}
*p = '\0';
/* Ignore blank and comment lines. */
if (buff[0] == '#' || (word = strtok(buff, SEPARATORS)) == NULL)
continue;
if (EQ(word, "devices"))
(void)strcpy(device, (p = nexttok()) ? p : "");
else if (EQ(word, "script"))
(void)strcpy(script, (p = nexttok()) ? p : "");
else if (EQ(word, "sitename"))
(void)strcpy(sitename, (p = nexttok()) ? p : "");
else if (EQ(word, "tranfile"))
(void)strcpy(tranfile, (p = nexttok()) ? p : "");
else if (EQ(word, "host"))
;
else if (EQ(word, "badsrcaddresses"))
printlist(access, "disallowfrom");
else if (EQ(word, "gooddstaddresses"))
printlist(access, "allowto");
else if (EQ(word, "protocols")
|| EQ(word, "monday")
|| EQ(word, "tuesday")
|| EQ(word, "wednesday")
|| EQ(word, "thursday")
|| EQ(word, "fridat")
|| EQ(word, "saturday")
|| EQ(word, "sunday")
|| EQ(word, "weekdays")
|| EQ(word, "weekends"))
printlist(access, word);
else if (EQ(word, "speeds")) {
for (nspeeds = 0; nspeeds < MAXDEV && (p = nexttok()); nspeeds++)
speeds[nspeeds] = atoi(p);
if (nspeeds >= MAXDEV) {
fprintf(stderr, "Too many speeds\n");
bad++;
}
}
else if (EQ(word, "lines")) {
for (nlines = 0; nlines < MAXDEV && (p = nexttok()); nlines++)
(void)strcpy(lines[nlines], p);
if (nlines >= MAXDEV) {
fprintf(stderr, "Too many lines\n");
bad++;
}
}
else
fprintf(stderr,
"Warning, don't know keyword \"%s\" in \"%s\"\n",
word, ep->d_name);
}
(void)fclose(access);
(void)fclose(F);
/* Verify data. */
if (device[0] == '\0') {
fprintf(stderr, "No device in \"%s\"\n", ep->d_name);
bad++;
continue;
}
if (script[0] == '\0') {
fprintf(stderr, "No script in \"%s\"\n", ep->d_name);
bad++;
continue;
}
if (sitename[0] == '\0') {
fprintf(stderr, "No sitename in \"%s\"\n", ep->d_name);
bad++;
continue;
}
if (nlines != nspeeds) {
fprintf(stderr, "Lines and speeds don't match in \"%s\"\n",
ep->d_name);
bad++;
continue;
}
/* Write out the config entry. */
fprintf(config, "##\n##\n");
fprintf(config, "%s:%s:", device, sitename);
for (i = 0; i < nlines; i++)
fprintf(config, "%s%s#%d", i ? " " : "", lines[i], speeds[i]);
fprintf(config, ":%s:%s:%s.access\n", script, tranfile, device);
/* Close the files, rename the temporary file to the working one. */
(void)sprintf(buff, "%s.access", device);
(void)rename(ACCESS_TEMP, buff);
}
(void)unlink(ACCESS_TEMP);
(void)fclose(config);
(void)closedir(dp);
exit(bad ? 1 : 0);
/* NOTREACHED */
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.