예제 #1
0
int
close(int fd)
{
    struct open_file	*f = &files[fd];
    int			err1 = 0, err2 = 0;

    if ((unsigned)fd >= SOPEN_MAX || f->f_flags == 0) {
	errno = EBADF;
	return (-1);
    }
    if (f->f_rabuf != NULL)
	free(f->f_rabuf);
    if (!(f->f_flags & F_RAW) && f->f_ops)
	err1 = (f->f_ops->fo_close)(f);
    if (!(f->f_flags & F_NODEV) && f->f_dev)
	err2 = (f->f_dev->dv_close)(f);
    if (f->f_devdata != NULL)
	devclose(f);
    f->f_flags = 0;
    if (err1) {
	errno = err1;
	return (-1);
    }
    if (err2) {
	errno = err2;
	return (-1);
    }
    return (0);
}
예제 #2
0
void displaywrite(const char *s, const char *dev){
	void *handle=devopen(dev);
	if(!handle){
		dbgpf("BOOT: Specified display device: %s\n", dev);
		panic("(BOOT) Display device not valid!");
	}
    dputs(handle, (char*)s);
    devclose(handle);
}
예제 #3
0
int
open(const char *fname, int mode)
{
    struct open_file	*f;
    int			fd, i, error, besterror;
    const char		*file;

    if ((fd = o_gethandle()) == -1) {
	errno = EMFILE;
	return(-1);
    }

    f = &files[fd];
    f->f_flags = mode + 1;
    f->f_dev = (struct devsw *)0;
    f->f_ops = (struct fs_ops *)0;
    f->f_offset = 0;
    f->f_devdata = NULL;
    file = (char *)0;
    error = devopen(f, fname, &file);
    if (error ||
	(((f->f_flags & F_NODEV) == 0) && f->f_dev == (struct devsw *)0))
	goto err;

    /* see if we opened a raw device; otherwise, 'file' is the file name. */
    if (file == (char *)0 || *file == '\0') {
	f->f_flags |= F_RAW;
	f->f_rabuf = NULL;
	return (fd);
    }

    /* pass file name to the different filesystem open routines */
    besterror = ENOENT;
    for (i = 0; file_system[i] != NULL; i++) {

	error = ((*file_system[i]).fo_open)(file, f);
	if (error == 0) {
	    
	    f->f_ops = file_system[i];
	    o_rainit(f);
	    return (fd);
	}
	if (error != EINVAL)
	    besterror = error;
    }
    error = besterror;

    if ((f->f_flags & F_NODEV) == 0)
	f->f_dev->dv_close(f);
    if (error)
	devclose(f);

 err:
    f->f_flags = 0;
    errno = error;
    return (-1);
}
예제 #4
0
static void
onsig(				/* fatal signal */
	int  signo
)
{
	static int  gotsig = 0;

	if (gotsig++)			/* two signals and we're gone! */
		_exit(signo);

#if !defined(_WIN32) && !defined(_WIN64)
	alarm(15);			/* allow 15 seconds to clean up */
	signal(SIGALRM, SIG_DFL);	/* make certain we do die */
#endif
	eputs("signal - ");
	eputs(sigerr[signo]);
	eputs("\n");
	devclose();
	quit(3);
}
예제 #5
0
void
doexit(int status) {
    devrestore();                       /* Restore device */
    devclose();                         /* Close device */
    exit(status);                       /* Exit with indicated status */
}
예제 #6
0
int
main(int argc, char *argv[])
{
#define	 check(ol,al)		if (argv[i][ol] || \
				badarg(argc-i-1,argv+i+1,al)) \
				goto badopt
#define	 check_bool(olen,var)		switch (argv[i][olen]) { \
				case '\0': var = !var; break; \
				case 'y': case 'Y': case 't': case 'T': \
				case '+': case '1': var = 1; break; \
				case 'n': case 'N': case 'f': case 'F': \
				case '-': case '0': var = 0; break; \
				default: goto badopt; }
	char  *octnm = NULL;
	char  *err;
	int  rval;
	int  i;
					/* global program name */
	progname = argv[0] = fixargv0(argv[0]);
					/* set our defaults */
	shadthresh = .1;
	shadcert = .25;
	directrelay = 0;
	vspretest = 128;
	srcsizerat = 0.;
	specthresh = .3;
	specjitter = 1.;
	maxdepth = 6;
	minweight = 1e-2;
	ambacc = 0.3;
	ambres = 32;
	ambdiv = 256;
	ambssamp = 64;
					/* option city */
	for (i = 1; i < argc; i++) {
						/* expand arguments */
		while ((rval = expandarg(&argc, &argv, i)) > 0)
			;
		if (rval < 0) {
			sprintf(errmsg, "cannot expand '%s'", argv[i]);
			error(SYSTEM, errmsg);
		}
		if (argv[i] == NULL || argv[i][0] != '-')
			break;			/* break from options */
		if (!strcmp(argv[i], "-version")) {
			puts(VersionID);
			quit(0);
		}
		if (!strcmp(argv[i], "-defaults") ||
				!strcmp(argv[i], "-help")) {
			printdefaults();
			quit(0);
		}
		if (!strcmp(argv[i], "-devices")) {
			printdevices();
			quit(0);
		}
		rval = getrenderopt(argc-i, argv+i);
		if (rval >= 0) {
			i += rval;
			continue;
		}
		rval = getviewopt(&ourview, argc-i, argv+i);
		if (rval >= 0) {
			i += rval;
			continue;
		}
		switch (argv[i][1]) {
		case 'n':				/* # processes */
			check(2,"i");
			nproc = atoi(argv[++i]);
			if (nproc <= 0)
				error(USER, "bad number of processes");
			break;
		case 'v':				/* view file */
			if (argv[i][2] != 'f')
				goto badopt;
			check(3,"s");
			rval = viewfile(argv[++i], &ourview, NULL);
			if (rval < 0) {
				sprintf(errmsg,
				"cannot open view file \"%s\"",
						argv[i]);
				error(SYSTEM, errmsg);
			} else if (rval == 0) {
				sprintf(errmsg,
					"bad view file \"%s\"",
						argv[i]);
				error(USER, errmsg);
			}
			break;
		case 'b':				/* grayscale */
			check_bool(2,greyscale);
			break;
		case 'p':				/* pixel */
			switch (argv[i][2]) {
			case 's':				/* sample */
				check(3,"i");
				psample = atoi(argv[++i]);
				break;
			case 't':				/* threshold */
				check(3,"f");
				maxdiff = atof(argv[++i]);
				break;
			case 'e':				/* exposure */
				check(3,"f");
				exposure = atof(argv[++i]);
				if (argv[i][0] == '+' || argv[i][0] == '-')
					exposure = pow(2.0, exposure);
				break;
			default:
				goto badopt;
			}
			break;
		case 'w':				/* warnings */
			rval = erract[WARNING].pf != NULL;
			check_bool(2,rval);
			if (rval) erract[WARNING].pf = wputs;
			else erract[WARNING].pf = NULL;
			break;
		case 'e':				/* error file */
			check(2,"s");
			errfile = argv[++i];
			break;
		case 'o':				/* output device */
			check(2,"s");
			dvcname = argv[++i];
			break;
		case 'R':				/* render input file */
			check(2,"s");
			strcpy(rifname, argv[++i]);
			break;
		default:
			goto badopt;
		}
	}
	err = setview(&ourview);	/* set viewing parameters */
	if (err != NULL)
		error(USER, err);
						/* set up signal handling */
	sigdie(SIGINT, "Interrupt");
	sigdie(SIGTERM, "Terminate");
#if !defined(_WIN32) && !defined(_WIN64)
	sigdie(SIGHUP, "Hangup");
	sigdie(SIGPIPE, "Broken pipe");
	sigdie(SIGALRM, "Alarm clock");
#endif
					/* open error file */
	if (errfile != NULL) {
		if (freopen(errfile, "a", stderr) == NULL)
			quit(2);
		fprintf(stderr, "**************\n*** PID %5d: ",
				getpid());
		printargs(argc, argv, stderr);
		putc('\n', stderr);
		fflush(stderr);
	}
#ifdef	NICE
	nice(NICE);			/* lower priority */
#endif
					/* get octree */
	if (i == argc)
		octnm = NULL;
	else if (i == argc-1)
		octnm = argv[i];
	else
		goto badopt;
	if (octnm == NULL)
		error(USER, "missing octree argument");
					/* set up output & start process(es) */
	SET_FILE_BINARY(stdout);
	
	ray_init(octnm);		/* also calls ray_init_pmap() */
	
/* temporary shortcut, until winrview is refactored into a "device" */
#ifndef WIN_RVIEW
	rview();			/* run interactive viewer */


	devclose();			/* close output device */
#endif

	/* PMAP: free photon maps */
	ray_done_pmap();
	
#ifdef WIN_RVIEW
	return 1;
#endif
	quit(0);

badopt:
	sprintf(errmsg, "command line error at '%s'", argv[i]);
	error(USER, errmsg);
	return 1; /* pro forma return */

#undef	check
#undef	check_bool
}