diff -ruN ../virgin/Makefile ./Makefile --- ../virgin/Makefile Wed Dec 31 18:00:00 1969 +++ ./Makefile Tue Dec 10 11:42:20 1996 @@ -0,0 +1,24 @@ + +SUBDIR+= joystick4doom +SUBDIR+= musserver + +all: doom.sh + +install: + mkdir -p ${PREFIX}/libexec/doom + mkdir -p ${PREFIX}/share/doom + install -c -m 755 doom.sh ${PREFIX}/bin/doom + for i in xdoom sndserver; do \ + install -c -m 755 doom-1.8/$$i ${PREFIX}/libexec/doom; \ + done + for i in doom1.wad README README.config README.linuxx; do \ + install -c -m 644 doom-1.8/$$i ${PREFIX}/share/doom; \ + done + (cd musserver; make install) + (cd joystick4doom; make install) + +.include + +doom.sh: + sed "s,@PREFIX@,${PREFIX}," doom.sh.in >doom.sh + Binary files ../virgin/doom-1.8/pat and ./doom-1.8/pat differ Binary files ../virgin/doom-1.8/sdoom and ./doom-1.8/sdoom differ Binary files ../virgin/doom-1.8/xdoom and ./doom-1.8/xdoom differ diff -ruN ../virgin/doom.sh.in ./doom.sh.in --- ../virgin/doom.sh.in Wed Dec 31 18:00:00 1969 +++ ./doom.sh.in Wed Dec 11 09:58:06 1996 @@ -0,0 +1,20 @@ +#!/bin/sh + +if [ -e /dev/joy0 ]; then + if sh -c 'exec 9/dev/null; then + echo using joystick + exec 9>&- + [ -f /tmp/joystick4doom.pid ] && @PREFIX@/libexec/doom/joystick4xdoom -k + @PREFIX@/libexec/doom/joystick4xdoom /dev/joy0 Control Space & + fi +fi + +DOOMWADDIR=@PREFIX@/share/doom; export DOOMWADDIR +PATH=@PREFIX@/libexec/doom:${PATH} + +cd @PREFIX@/libexec/doom +@PREFIX@/libexec/doom/xdoom $* +[ -f /tmp/joystick4doom.pid ] && @PREFIX@/libexec/doom/joystick4xdoom -k + +ipcrm $(ipcs -m |sed -n 's,^\(m *[0-9][0-9]*\).*,-\1,p') + diff -ruN ../virgin/joystick4doom/Makefile ./joystick4doom/Makefile --- ../virgin/joystick4doom/Makefile Wed Dec 14 01:27:14 1994 +++ ./joystick4doom/Makefile Tue Dec 10 11:39:26 1996 @@ -13,8 +13,8 @@ # Define this to be the file where the joystick settings are saved. DATFILE = \"/usr/local/lib/joystick.dat\" -CFLAGS = -O2 $(DEBUG) $(THRESHOLD) -I. -DJOYSTICK_DAT=$(DATFILE) -XLDPATH = -L/usr/X11R6/lib +CFLAGS = -O2 $(DEBUG) $(THRESHOLD) -I${X11BASE}/include -DJOYSTICK_DAT=$(DATFILE) +XLDPATH = -L${X11BASE}/lib LDFLAGS = -s XLIBS = -lX11 @@ -22,15 +22,16 @@ OBJS = joystick4doom.o XBIN = joystick4xdoom SBIN = joystick4sdoom -PRGS = $(XBIN) $(SBIN) +PRGS = $(XBIN) all: $(PRGS) $(SRCS) $(XBIN): $(CC) -DX11 $(CFLAGS) $(LDFLAGS) $(SRCS) -o $(XBIN) $(XLDPATH) $(XLIBS) -$(SBIN): - $(CC) $(CFLAGS) $(LDFLAGS) $(SRCS) -o $(SBIN) - clean: $(RM) $(OBJS) $(PRGS) + +install: ${XBIN} + install -cs ${XBIN} ${PREFIX}/libexec/doom + diff -ruN ../virgin/joystick4doom/README.FreeBSD ./joystick4doom/README.FreeBSD --- ../virgin/joystick4doom/README.FreeBSD Wed Dec 31 18:00:00 1969 +++ ./joystick4doom/README.FreeBSD Tue Dec 10 11:20:58 1996 @@ -0,0 +1,27 @@ +Sun Nov 12 23:52:35 PST 1995 +Hi, + +The Linux Joystick for doom has been ported to FreeBSD and it is at: +rah.star-gate.com:/pub/joystick4doom.tar.gz + +I have included in the tar file the original FreeBSD joystick.c +test program . joystick.c is not part of the original linux's +joystick tar distribution. + +to compile the joystick4doom: + + cc -o joystick4doom -I/usr/X11R6/include -DX11 joystick4doom.c -L/usr/X11R6/lib -lX11 -lm + +now calibrate it: +./joystick4doom -c /dev/joy0 + +To run, I use the following command: +./joystick4doom /dev/joy0 Control Space + +Now run xdoom and have a ball 8) + + Amancio + + + + diff -ruN ../virgin/joystick4doom/joystick.c ./joystick4doom/joystick.c --- ../virgin/joystick4doom/joystick.c Wed Dec 31 18:00:00 1969 +++ ./joystick4doom/joystick.c Tue Dec 10 11:20:58 1996 @@ -0,0 +1,320 @@ +/* + * Joystick test program for FreeBSD + * + * Compile with: cc -o joystick joystick.c -lncurses + * + * + * (C) Copyright 1995 Dave Bodenstab + * All rights reserved. + * + * This program and/or source code may be used or distributed without + * restriction provided this copyright notice is preserved, no fee is + * charged, and this source code is included with any binary distribution. + * Commercial use (i.e. you make money using this software) is prohibited + * without the express written consent of the author. The author may be + * contacted at the following address: + * + * Dave Bodenstab + * 22W451 Oldwoods Drive + * Naperville, Illinois 60565 + * USA + */ +#include +#include +#include +#include + +const char m_align_ul[] ="Move stick to upper left corner and press a button"; +const char m_align_lr[] ="Move stick to lower right corner and press a button"; +const char m_button[] ="Press a button to continue"; + +main( int argc, char **argv ) +{ + int js, x, y, button1, button2; + int xLeft, xRight, yTop, yBotton; + int quitLeftX, quitTopY, quitRightX, quitBottomY; + WINDOW *winMovement, *winButton1Outline, *winButton2Outline, *winButton1, *winButton2, *winQuit; + struct joystick joystick; + char buffer[100]; + + if ( (js = open("/dev/joy0",O_RDONLY)) == -1 ) + { + perror( "/dev/joy0" ); + exit( 1 ); + } + + initscr(); + curs_set( 0 ); + leaveok( stdscr, TRUE ); + border( 0, 0, 0, 0, 0, 0, 0, 0 ); + + /* + * Align the stick... + */ + x = (COLS - 2 - strlen( m_align_ul )) / 2; + y = (LINES - 2) / 2; + mvaddstr( y, x, (char*)m_align_ul ); + refresh(); + + for( ; ; napms(100) ) /* Wait for a button press... */ + { + if ( read(js,&joystick,sizeof(joystick)) != sizeof(joystick) ) + { + endwin(); + perror( "read /dev/joy0" ); + exit( 1 ); + } + + if ( joystick.b1 || joystick.b2 ) + { + xLeft = joystick.x; + yTop = joystick.y; + + /* Wait for the button(s) to be released... */ + for( ; ; napms(100) ) + { + if ( read(js,&joystick,sizeof(joystick)) != sizeof(joystick) ) + { + endwin(); + perror( "read /dev/joy0" ); + exit( 1 ); + } + + if ( ! (joystick.b1 || joystick.b2) ) + break; + } + + break; + } + } + + x = (COLS - 2 - strlen( m_align_lr )) / 2; + mvaddstr( y + 1, x, (char*)m_align_lr ); + refresh(); + + for( ; ; napms(100) ) /* Wait for a button press... */ + { + if ( read(js,&joystick,sizeof(joystick)) != sizeof(joystick) ) + { + endwin(); + perror( "read /dev/joy0" ); + exit( 1 ); + } + + if ( joystick.b1 || joystick.b2 ) + { + xRight = joystick.x; + yBotton = joystick.y; + + /* Wait for the button(s) to be released... */ + for( ; ; napms(100) ) + { + if ( read(js,&joystick,sizeof(joystick)) != sizeof(joystick) ) + { + endwin(); + perror( "read /dev/joy0" ); + exit( 1 ); + } + + if ( ! (joystick.b1 || joystick.b2) ) + break; + } + + break; + } + } + + sprintf( buffer, "Upper left = (%d,%d)", xLeft, yTop ); + x = (COLS - 2 - strlen( buffer )) / 2; + mvaddstr( y+2, x, buffer ); + sprintf( buffer, "Lower right = (%d,%d)", xRight, yBotton ); + x = (COLS - 2 - strlen( buffer )) / 2; + mvaddstr( y+3, x, buffer ); + x = (COLS - 2 - strlen( m_button )) / 2; + mvaddstr( y+4, x, (char*)m_button ); + refresh(); + + if ( xLeft >= xRight || yTop >= yBotton ) + { + endwin(); + + printf( "The stick cannot be aligned properly. Either you didn't align the\n" + "stick properly in the upper-left and lower-right corners, or your\n" + "hardware is not working.\n" ); + + exit( 1 ); + } + + /* Wait for a button press... */ + for( ; ; napms(100) ) + { + if ( read(js,&joystick,sizeof(joystick)) != sizeof(joystick) ) + { + endwin(); + perror( "read /dev/joy0" ); + exit( 1 ); + } + + if ( joystick.b1 || joystick.b2 ) + { + /* Wait for the button(s) to be released... */ + for( ; ; napms(100) ) + { + if ( read(js,&joystick,sizeof(joystick)) != sizeof(joystick) ) + { + endwin(); + perror( "read /dev/joy0" ); + exit( 1 ); + } + + if ( ! (joystick.b1 || joystick.b2) ) + break; + } + + break; + } + } + + /* + * Create the button windows, the movement window, and the QUIT window + */ + x = (COLS - 2 - 2*7) / 3; + winButton1Outline = subwin( stdscr, 3, 7, LINES-3, x+1 ); + wborder( winButton1Outline, 0, 0, 0, 0, 0, 0, ACS_BTEE, ACS_BTEE ); + winButton1 = derwin( winButton1Outline, 1, 5, 1, 1 ); + + winButton2Outline = subwin( stdscr, 3, 7, LINES-3, COLS-1 - x - 1 - (7 - 1) ); + wborder( winButton2Outline, 0, 0, 0, 0, 0, 0, ACS_BTEE, ACS_BTEE ); + winButton2 = derwin( winButton2Outline, 1, 5, 1, 1 ); + + winMovement = subwin( stdscr, LINES-4, COLS-2, 1, 1 ); + werase( winMovement ); + + winQuit = newwin( 5, 10, (LINES-4)/3 - 5/2, (COLS-2)/2 - 10/2 ); + getbegyx( winQuit, quitTopY, quitLeftX ); + getmaxyx( winQuit, quitBottomY, quitRightX ); + quitRightX += quitLeftX - 1; + quitBottomY += quitTopY - 1; + wborder( winQuit, 0, 0, 0, 0, 0, 0, 0, 0 ); + mvwaddstr( winQuit, 2, 3, "QUIT" ); + overwrite( winQuit, winMovement ); + + touchwin( stdscr ); + refresh(); + + /* + * Read the joystick, moving an '*' around the movement window. When a + * button is pressed, highlight the corresponding button window. If the + * current position is within the QUIT window and a button is pressed, + * exit the program. + */ + button1 = 0; + button2 = 0; + x = (COLS-2) / 2; + y = (LINES-4) / 2; + mvwaddch( winMovement, y, x, '*' ); + wrefresh( winMovement ); + + for( ; ; napms(100) ) + { + if ( read(js,&joystick,sizeof(joystick)) != sizeof(joystick) ) + { + endwin(); + perror( "read /dev/joy0" ); + exit( 1 ); + } + + if ( button1 != joystick.b1 ) /* Check for button 1 */ + { + touchwin( winMovement ); + + switch( button1 = joystick.b1 ) + { + case 0: + wattroff( winButton1, A_REVERSE ); + break; + case 1: + wattron( winButton1, A_REVERSE ); + break; + } + + mvwaddstr( winButton1, 0, 0, " " ); + wrefresh( winButton1 ); + } + + if ( button2 != joystick.b2 ) /* Check for button 2 */ + { + touchwin( winMovement ); + + switch( button2 = joystick.b2 ) + { + case 0: + wattroff( winButton2, A_REVERSE ); + break; + case 1: + wattron( winButton2, A_REVERSE ); + break; + } + + mvwaddstr( winButton2, 0, 0, " " ); + wrefresh( winButton2 ); + } + + if ( joystick.x != x || joystick.y != y ) /* Check for movement */ + { + int nx, ny; + + /* Scale the actual coordinates to the nearest character coordinate */ + nx = ((joystick.x - xLeft) * (COLS-2 - 1)) / (xRight - xLeft); + if ( nx < 0 ) + nx = 0; + else + if ( nx > COLS-2 - 1 ) + nx = COLS-2 - 1; + + ny = ((joystick.y - yTop) * (LINES-4 - 1)) / (yBotton - yTop); + if ( ny < 0 ) + ny = 0; + else + if ( ny > LINES-4 - 1 ) + ny = LINES-4 - 1; + + if ( x != nx || y != ny ) /* Check for visible movement */ + { + mvwaddch( winMovement, y, x, ' ' ); + + /* + * If the old (x,y) was within the QUIT window, then it must be + * refreshed to restore any character that was overwritten by the + * '*' + */ + if ( x+1 >= quitLeftX && x+1 <= quitRightX && y+1 >= quitTopY && y+1 <= quitBottomY ) + { + touchwin( stdscr ); + overwrite( winQuit, winMovement ); + } + + mvwaddch( winMovement, y = ny, x = nx, '*' ); + wrefresh( winMovement ); + + /* Show the current coordinates */ + sprintf( buffer, "[%3d,%3d]", x, y ); + mvaddstr( LINES-2, COLS-1 -3 - strlen(buffer), buffer ); + refresh(); + } + + /* + * If (x,y) is within the QUIT window, then we exit if either button + * is pressed + */ + if ( x+1 >= quitLeftX && x+1 <= quitRightX && y+1 >= quitTopY && y+1 <= quitBottomY ) + { + if ( button1 || button2 ) + break; + } + } + } + + endwin(); + exit( 0 ); +} diff -ruN ../virgin/joystick4doom/joystick4doom.c ./joystick4doom/joystick4doom.c --- ../virgin/joystick4doom/joystick4doom.c Wed Dec 14 01:26:42 1994 +++ ./joystick4doom/joystick4doom.c Tue Dec 10 11:20:58 1996 @@ -24,7 +24,7 @@ #include #include #include - +#include #ifdef X11 #define XK_MISCELLANY #define XK_LATIN1 @@ -41,19 +41,19 @@ #define FALSE 0 #endif /* X11 */ -#include +/*#include */ #define PIDFILE "/tmp/joystick4doom.pid" #ifndef JOYSTICK_DAT -#define JOYSTICK_DAT "/usr/local/lib/joystick.dat" +#define JOYSTICK_DAT "/usr/local/share/doom/joystick.dat" #endif #define PAUSETIME 100000 #define RELEASED 0 #define PRESSED 1 -#define HOLDDOWN 2 -#define UNPRESSED 3 +#define HOLDDOWN 1 +#define UNPRESSED -1 #define FIRST_BUTTON 0 #define SECOND_BUTTON 1 @@ -99,13 +99,15 @@ char *progname; int joystick_device; char *device_name; -struct JS_DATA_TYPE js; +/*struct JS_DATA_TYPE js; */ + struct joystick js; int button[2]; int xpos_left, xpos_middle, xpos_right, xpos_actual; int ypos_upper,ypos_middle, ypos_lower, ypos_actual; int i,j; /* Keep track of where the joystick is */ +#define JS_RETURN 16 #define CENTERED 0x00 #define CUTRIGHT 0x01 #define CUTLEFT 0x02 @@ -182,9 +184,10 @@ "left", 0x69, 0xe9, }; #endif /* X11 */ - + fprintf(stdout, "Joystick4Doom, 1994 by Artsoft Development\n"); - + button[0] = 0; + button[1] = 0; /* Kill an existing joystick process if requested */ if ( (argc == 2) && (strcmp(argv[1], "-k") == 0) ) { if ( (pidfile=fopen(PIDFILE, "r")) != NULL ) { @@ -300,7 +303,7 @@ for(i=0;i<2;i++) { - if (button[i]==PRESSED) + if (button[i]==1) { #ifdef X11 SendKeyEvent(KeyPress,joykey[key[i]].pressed,joykey[key[i]].key); @@ -321,7 +324,7 @@ #endif } } - if (button[i]==RELEASED) + if (button[i]==0) { #ifdef X11 SendKeyEvent(KeyRelease,joykey[key[i]].released,joykey[key[i]].key); @@ -492,7 +495,7 @@ WaitButton(); xpos_left =js.x; ypos_upper=js.y; - fprintf(stdout, "xpos_left = %d\nypos_upper = %d\n", js.x, js.y); + fprintf(stdout, "Move joystick to the lower right and press any button!\n"); WaitButton(); @@ -524,13 +527,14 @@ exit(-1); } - for(i=0;i<2;i++) - { - if (js.buttons & (1< -#include -#include -#include +/*#include */ +#include +/*#include #include #include #include - +*/ #define JS_RETURN sizeof(struct JS_DATA_TYPE) /*number of bytes returned by js_read*/ #define JS_TRUE 1 #define JS_FALSE 0 diff -ruN ../virgin/joystick4doom/linux/joystick.h~ ./joystick4doom/linux/joystick.h~ --- ../virgin/joystick4doom/linux/joystick.h~ Wed Dec 31 18:00:00 1969 +++ ./joystick4doom/linux/joystick.h~ Tue Dec 10 11:20:59 1996 @@ -0,0 +1,58 @@ + +#include +#include +#include +#include +#include +#include +#include + +#define JS_RETURN sizeof(struct JS_DATA_TYPE) /*number of bytes returned by js_read*/ +#define JS_TRUE 1 +#define JS_FALSE 0 +#define JS_PORT 0x201 /*io port for joystick operations*/ +#define JS_DEF_TIMEOUT 0x1300 /*default timeout value for js_read()*/ +#define JS_DEF_CORR 0 /*default correction factor*/ +#define JS_DEF_TIMELIMIT 10L /*default data valid time =10 jiffies == 100ms*/ +#define JS_X_0 0x01 /*bit mask for x-axis js0*/ +#define JS_Y_0 0x02 /*bit mask for y-axis js0*/ +#define JS_X_1 0x04 /*bit mask for x-axis js1*/ +#define JS_Y_1 0x08 /*bit mask for y-axis js1*/ +#define JS_MAX 2 /*Max number of joysticks*/ +#define PIT_MODE 0x43 /*io port for timer 0*/ +#define PIT_COUNTER_0 0x40 /*io port for timer 0*/ +#define JS_SET_CAL 0x01 /*ioctl cmd to set joystick correction factor*/ +#define JS_GET_CAL 0x02 /*ioctl cmd to get joystick correction factor*/ +#define JS_SET_TIMEOUT 0x03 /*ioctl cmd to set maximum number of iterations + to wait for a timeout*/ +#define JS_GET_TIMEOUT 0x04 /*as above, to get*/ +#define JS_SET_TIMELIMIT 0x05 /*set data retention time*/ +#define JS_GET_TIMELIMIT 0x06 /*get data retention time*/ +#define JS_GET_ALL 0x07 /*get the whole JS_DATA[minor] struct*/ +#define JS_SET_ALL 0x08 /*set the whole JS_DATA[minor] struct + except JS_BUSY!*/ + +/*This union is used for the ioctl to set the scaling factor and to return + the current values for a joystick. 'buttons' is ignored on the ioctl call*/ + +struct JS_DATA_TYPE { + int buttons; + int x; + int y; +}; + +/* This struct is used for misc data about the joystick*/ +struct JS_DATA_SAVE_TYPE { + int JS_TIMEOUT; /*timeout*/ + int BUSY; /*joystick is in use*/ + long JS_EXPIRETIME; /*Time when stick after which stick must be re-read*/ + long JS_TIMELIMIT; /*Max time before data is invalid*/ + struct JS_DATA_TYPE JS_SAVE; /*last read data*/ + struct JS_DATA_TYPE JS_CORR; /*correction factor*/ +}; + +#define LATCH (1193180L/HZ) /*initial timer 0 value*/ +#define DELTA_TIME(X,Y) ((X)-(Y)+(((X)>=(Y))?0:LATCH)) +#define CURRENT_JIFFIES (jiffies) + +#define JOYSTICK_MAJOR 15 diff -ruN ../virgin/musserver/Makefile ./musserver/Makefile --- ../virgin/musserver/Makefile Fri Jul 28 01:30:47 1995 +++ ./musserver/Makefile Tue Dec 10 11:43:30 1996 @@ -7,12 +7,12 @@ # Uncomment this line for extra debugging output #CFLAGS = -g -DDEBUG -I. -Wall -O2 -m486 -CFLAGS = -g -I. -Wall -O2 -m486 +CFLAGS = -I. -Wall -O2 -m486 #CFLAGS = -I. -Wall LIBS = -s INSTALL = install -DESTDIR = /usr/local/bin +DESTDIR = /usr/local/libexec/doom SHELL = /bin/sh ############################################# @@ -21,16 +21,25 @@ OBJS = musserver.o readwad.o playmus.o sequencer.o -musserver: $(OBJS) +musserver.bin: $(OBJS) $(CC) $(LIBS) -o $@ $(OBJS) +musserver.sh: musserver.sh.in + sed "s,@PREFIX@,${PREFIX}," musserver.sh.in >$@ + clean: - rm -f $(OBJS) ipc.o ipc musserver + rm -f $(OBJS) ipc.o ipc musserver.bin -all: musserver +all: musserver.bin musserver.sh doom-patch install: all - $(INSTALL) musserver $(DESTDIR) + $(INSTALL) -cs musserver.bin $(DESTDIR) + ${INSTALL} -c -m 755 musserver.sh ${DESTDIR}/musserver ipc: ipc.o $(CC) -o $@ ipc.o + +doom-patch: + zcat doompat.tgz |(cd ../doom-1.8; pax -rv) + @cd ../doom-1.8; ./pat @mus11.pat@xdoom || (/usr/bin/linux; ./pat @mus11.pat@xdoom) + touch doom-patch Binary files ../virgin/musserver/musserver and ./musserver/musserver differ diff -ruN ../virgin/musserver/musserver.c ./musserver/musserver.c --- ../virgin/musserver/musserver.c Tue Aug 22 20:50:56 1995 +++ ./musserver/musserver.c Tue Dec 10 11:20:57 1996 @@ -28,6 +28,7 @@ #include #include #include "musserver.h" +#include extern int use_synth; extern int seqfd; diff -ruN ../virgin/musserver/musserver.h ./musserver/musserver.h --- ../virgin/musserver/musserver.h Wed Aug 9 04:18:00 1995 +++ ./musserver/musserver.h Tue Dec 10 11:20:57 1996 @@ -18,7 +18,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *************************************************************************/ -#include +#include struct mus_header { /* header of music lump */ char id[4]; diff -ruN ../virgin/musserver/musserver.sh.in ./musserver/musserver.sh.in --- ../virgin/musserver/musserver.sh.in Wed Dec 31 18:00:00 1969 +++ ./musserver/musserver.sh.in Tue Dec 10 11:20:57 1996 @@ -0,0 +1,2 @@ +#!/bin/sh +exec @PREFIX@/libexec/doom/musserver.bin -f $* diff -ruN ../virgin/musserver/playmus.c ./musserver/playmus.c --- ../virgin/musserver/playmus.c Tue Aug 22 20:14:30 1995 +++ ./musserver/playmus.c Tue Dec 10 11:20:57 1996 @@ -29,6 +29,7 @@ #include #include #include "musserver.h" +#include void seqbuf_dump(void); void reset_midi(void); @@ -52,6 +53,8 @@ int returnval = 0; +#define msgbuf mymsg + static char *doom2names[] = { "D_RUNNIN", "D_STALKS", "D_COUNTD", "D_BETWEE", "D_DOOM", "D_THE_DA", "D_SHAWN", "D_DDTBLU", "D_IN_CIT", "D_DEAD", "D_STLKS2", "D_THEDA2", @@ -152,6 +155,7 @@ } cleanup(1); break; +#if 0 case EIDRM: if (verbose) { @@ -160,6 +164,7 @@ } cleanup(1); break; +#endif case EINTR: if (verbose) printf("Could not receive IPC message: received an interrupt signal\n"); @@ -172,8 +177,10 @@ } cleanup(1); break; +#if 0 case ENOMSG: break; +#endif } free(recv); }