ftp.nice.ch/pub/next/tools/defaults/wmdefaults.1.0.N.b.tar.gz#/wmdefaults/wmdefaults.c

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

/*
 * wmdefaults -- examine and modify Workspace Manager defaults
 * Eric P. Scott, San Francisco State University, February 1992
 *
 * Requires NeXT Software Release 2.x
 *
 * >>> beware of 1024 character limits!
 * 
 * cc -O -o wmdefaults -s -object -bsd wmdefaults.c
 */

static char sccsid[]="@(#)wmdefaults.c	1.0 (SFSU) 2/9/92";

#include <stdio.h>
#include <strings.h>
#include <pwd.h>

#define DEFAULTS_MAGIC 0x6902fcae

main(argc, argv)
int argc;
char *argv[];
{
	char *getenv();
	extern char *optarg;
	extern int optind;
	register char *p;
	register int i;
	register struct passwd *pw;
	FILE *f;
	int flags;
	char path[1024];

	flags=0;
	path[0]='\0';
	while ((i=getopt(argc, argv, "f:stu:"))!=EOF) switch (i) {
	case 'f':
		if ((flags&14)!=0) goto usage;
		flags|=8;
		(void)strcpy(path, optarg);
		break;
	case 's':
		flags|=1;
		break;
	case 't':
		if ((flags&10)!=0) goto usage;
		flags|=4;
		(void)strcpy(path, "/usr/template/user");
		break;
	case 'u':
		if ((flags&14)!=0) goto usage;
		flags|=2;
		if (!(pw=getpwnam(optarg))) {
			(void)fprintf(stderr, "%s: unknown user\n", optarg);
			exit(1);
		}
		(void)strcpy(path, pw->pw_dir);
		break;
	default:
		goto usage;
	}
	if (optind!=argc) {
	usage:
		(void)fprintf(stderr,
			"Usage: %s [-u user|-t|-f file] [-s]\n", *argv);
		(void)fputs("\t-u  user's defaults\n\t-t  newuser template\n\
\t-f  arbitrary file (use - for stdin/stdout)\n\
\t-s  install new values from stdin (DANGEROUS!)\n",
			stderr);
		exit(1);
	}
	if ((flags&14)==0&&(p=getenv("HOME"))) (void) strcpy(path, p);
	if ((flags&8)==0) {
		if ((i=strlen(path))==0||path[i-1]!='/') {
			path[i++]='/'; path[i]='\0';
		}
		if (path[0]!='/') {
			(void)fprintf(stderr, "%s: bad path\n", *argv);
			exit(1);
		}
		(void)strcat(path, ".NeXT/defaults.wmd");
	}
	if (!(flags&1)) {
		if (!strcmp(path, "-")) f=stdin;
		else if (!(f=fopen(path, "r"))) {
			perror(path);
			exit(1);
		}
		if (getw(f)!=DEFAULTS_MAGIC) {
			(void)fprintf(stderr, "%s: bad magic number\n", path);
			(void)fclose(f);
			exit(1);
		}
		while ((i=fgetc(f))!=EOF) {
			register int c;
			if (fgetc(f)!=0||fgetc(f)!=0||fgetc(f)!=0) {
			interr:
				(void)fprintf(stderr,
					"%s: internal error\n", *argv);
				(void)fclose(f);
				exit(1);
			}
			while (i>0) {
				if ((c=fgetc(f))==EOF) {
				ueof:
					(void)fprintf(stderr,
						"%s: unexpected EOF\n", *argv);
					(void)fclose(f);
					exit(1);
				}
				putchar(c);
				--i;
			}
			putchar('=');
			if ((i=fgetc(f))==EOF||(c=fgetc(f))==EOF) goto ueof;
			i|=c<<8;
			if (fgetc(f)!=0||fgetc(f)!=0) goto interr;
			putchar('"');
			while (i>0) {
				if ((c=fgetc(f))==EOF) goto ueof;
				if (c=='\\'||c=='"') putchar('\\');
				if (c>=' '&&c<='~') putchar(c);
				else if (c>='\b'&&c<='\r') {
					putchar('\\');
					putchar("btnvfr"[c-'\b']);
				}
				else (void)printf("\\%03o", c&255);
				--i;
			}
			putchar('"'); putchar('\n');
		}
	}
	else {
		char out[1024];

		if ((flags&14)==0&&getenv("Workspace")) (void)fprintf(stderr,
"%s: warning--possible conflict with running Workspace\n", *argv);
		if (!strcmp(path, "-")) f=stdout;
		else if (!(f=fopen(path, "w"))) {
			perror(path);
			exit(1);
		}
		putw(DEFAULTS_MAGIC, f);
		while (fgets(path, sizeof path, stdin)) {
			register char *q;

			if (!(p=index(path, '='))||p[1]!='"') {
			badinp:
				(void)fprintf(stderr,
					"%s: bad input:\n", *argv);
				(void)fputs(path, stderr);
				continue;
			}
			if (p-path>255) goto badinp;
			putc(p-path, f);
			putc('\0', f);
			putc('\0', f);
			putc('\0', f);
			*p='\0'; fputs(path, f); *p='=';
			q=out; *q='\0';
			for (p+=2;;) {
				if (!*p||*p=='\n') goto badinp;
				if (*p=='"') {
					if (p[1]!='\n') goto badinp;
					break;
				}
				if (*p=='\\') {
					switch (*++p) {
					case '"': case '\\':
						break;
					case '0': case '1': case '2': case '3':
					case '4': case '5': case '6': case '7':
						i=*p++-'0';
						if (*p>='0'&&*p<='7') {
							i=i*8+*p++-'0';
							if (*p>='0'&&*p<='7') {
								i=i*8+*p++-'0';
								if (i>0377)
									goto
									badinp;
							}
						}
						*q++=i;
						continue;
					case 'a':
						*q++='\007';
						p++;
						continue;
					case 'b':
						*q++='\b';
						p++;
						continue;
					case 'f':
						*q++='\f';
						p++;
						continue;
					case 'n':
						*q++='\n';
						p++;
						continue;
					case 'r':
						*q++='\r';
						p++;
						continue;
					case 't':
						*q++='\t';
						p++;
						continue;
					case 'v':
						*q++='\013';
						p++;
						continue;
					default:
						goto badinp;
					}
				}
				*q++=*p++;
			}
			putc((q-out)&255, f);
			putc(((q-out)>>8)&255, f);
			putc('\0', f);
			putc('\0', f);
			(void)fwrite(out, 1, q-out, f);
		}
	}
	(void)fclose(f);
	exit(0);
}

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