--- ray/src/hd/rholo4.c 1998/01/04 18:37:11 3.17 +++ ray/src/hd/rholo4.c 1998/10/22 08:47:40 3.21 @@ -1,4 +1,4 @@ -/* Copyright (c) 1997 Silicon Graphics, Inc. */ +/* Copyright (c) 1998 Silicon Graphics, Inc. */ #ifndef lint static char SCCSid[] = "$SunId$ SGI"; @@ -16,6 +16,10 @@ static char SCCSid[] = "$SunId$ SGI"; #define HDSUF ".hdi" #endif +#ifndef FNONBLK +#define FNONBLK O_NONBLOCK +#endif + static int inp_flags; static int dpd[3]; static FILE *dpout; @@ -56,6 +60,12 @@ char *dname; /* check if outside */ if (vdef(OBSTRUCTIONS) && vbool(OBSTRUCTIONS)) disp_result(DS_OUTSECT, 0, NULL); + /* send eye separation if specified */ + if (vdef(EYESEP)) { + char fbuf[32]; + sprintf(fbuf, "%.9e", vflt(EYESEP)); + disp_result(DS_EYESEP, strlen(fbuf)+1, fbuf); + } /* write out hologram grids */ for (i = 0; hdlist[i] != NULL; i++) disp_result(DS_ADDHOLO, sizeof(HDGRID), (char *)hdlist[i]); @@ -99,10 +109,12 @@ int block; return(2); /* acceptable failure */ } if (msg.nbytes) { /* get the message body */ + if (msg.nbytes < 0) + error(INTERNAL, "anti-message from display process"); buf = (char *)malloc(msg.nbytes); if (buf == NULL) error(SYSTEM, "out of memory in disp_check"); - if (fcntl(dpd[0], F_SETFL, inp_flags=0) < 0) + if (inp_flags != 0 && fcntl(dpd[0], F_SETFL, inp_flags=0) < 0) goto fcntlerr; if (readbuf(dpd[0], buf, msg.nbytes) != msg.nbytes) goto readerr; @@ -116,12 +128,17 @@ int block; case DR_NEWSET: /* new calculation set */ if (msg.nbytes % sizeof(PACKHEAD)) error(INTERNAL, "bad DR_NEWSET from display process"); - disp_result(DS_STARTIMM, 0, NULL); + if (msg.nbytes) + disp_result(DS_STARTIMM, 0, NULL); bundle_set(BS_NEW, (PACKHEAD *)buf, msg.nbytes/sizeof(PACKHEAD)); - disp_result(DS_ENDIMM, 0, NULL); - disp_flush(); + if (msg.nbytes) { + disp_result(DS_ENDIMM, 0, NULL); + disp_flush(); + } break; case DR_ADDSET: /* add to calculation set */ + if (!msg.nbytes) + break; if (msg.nbytes % sizeof(PACKHEAD)) error(INTERNAL, "bad DR_ADDSET from display process"); disp_result(DS_STARTIMM, 0, NULL); @@ -130,6 +147,8 @@ int block; disp_flush(); break; case DR_ADJSET: /* adjust calculation set members */ + if (!msg.nbytes) + break; if (msg.nbytes % sizeof(PACKHEAD)) error(INTERNAL, "bad DR_ADJSET from display process"); disp_result(DS_STARTIMM, 0, NULL); @@ -138,6 +157,8 @@ int block; disp_flush(); break; case DR_DELSET: /* delete from calculation set */ + if (!msg.nbytes) + break; if (msg.nbytes % sizeof(PACKHEAD)) error(INTERNAL, "bad DR_DELSET from display process"); bundle_set(BS_DEL, (PACKHEAD *)buf, msg.nbytes/sizeof(PACKHEAD)); @@ -214,7 +235,11 @@ int type, nbytes; char *p; { MSGHEAD msg; - + /* consistency checks */ +#ifdef DEBUG + if (nbytes < 0 || nbytes > 0 & p == NULL) + error(CONSISTENCY, "bad buffer handed to disp_result"); +#endif if (dpout == NULL) return; msg.type = type;