This is guis.c in view mode; [Download] [Up]
/* Copyright (C) 1994 Rami el Charif, W. Schelter This file is part of GNU Common Lisp, herein referred to as GCL GCL is free software; you can redistribute it and/or modify it under the terms of the GNU LIBRARY GENERAL PUBLIC LICENSE as published by the Free Software Foundation; either version 2, or (at your option) any later version. GCL is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with GCL; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #define IN_GUIS #include "config.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef __cplusplus extern "C" { #endif #include <sys/types.h> #include <netinet/in.h> #ifdef PLATFORM_NEXT # include <bsd/netdb.h> # include <libc.h> #else # include <netdb.h> # include <arpa/inet.h> #endif /* #include <sys/types.h> */ #include <sys/time.h> #include <sys/socket.h> #include <unistd.h> #include <fcntl.h> #include <signal.h> #ifdef __cplusplus #ifdef PLATFORM_NEXT extern unsigned long inet_addr( char *cp ); extern char *inet_ntoa ( struct in_addr in ); #endif } #endif #ifdef PLATFORM_LINUX #include <termios.h> #endif #include <errno.h> #ifdef __svr4__ #include <sys/file.h> #endif #ifdef PLATFORM_NEXT /* somehow, this is getting lost... */ #undef bzero #define bzero(b,len) memset(b,0,len) #endif #ifndef TRUE #define TRUE (1) #define FALSE (0) #endif #include "guis.h" FILE *pstreamDebug = stderr; int fDebugSockets; #ifdef PLATFORM_SUNOS static void notice_input( ); #else static void notice_input(); #endif int hdl = -1; void TkX_Wish (); pid_t parent; int debug; #include "comm.c" /* Start up our Graphical User Interface connecting to NETWORK-ADDRESS on PORT to process PID. If fourth argument WAITING causes debugging flags to be turned on and also causes a wait in a loop for WAITING seconds (giving a human debugger time to attach to the forked process). */ int delay; int main(argc, argv) int argc; char *argv[]; { {int i = argc; while (--i > 3) { if (strcmp(argv[i],"-delay")==0) { delay = atoi(argv[i+1]);} if (strcmp(argv[i],"-debug")==0) {debug = 1; fDebugSockets = -1;} } } if (argc >= 4) { pid_t p; parent = atoi(argv[3]); dfprintf(stderr,"guis, parent is : %d\n", parent); #ifndef linux p = fork(); #else p = vfork(); #endif dfprintf(stderr, "guis, vfork returned : %d\n", p); if (p == -1) { dfprintf(stderr, "Error !!! vfork failed %d\n", errno); return -1; } else if (p) { dfprintf(stderr, "guis,vforked child : %d\n", p); _exit(p); /* return p; */ } else { #ifndef SET_SESSION_ID #if defined(__svr4__) || defined(ATT) #define SET_SESSION_ID() setsid() #else #ifdef BSD #define SET_SESSION_ID() (setpgrp(0,0) ? -1 : 0) #endif #endif #endif if (SET_SESSION_ID() == -1) { dfprintf(stderr, "Error !!! setsid failed : %d\n", errno); } dsfd = sock_connect_to_name(argv[1], atoi(argv[2]), 0); if (dsfd) { dfprintf(stderr, "connected to %s %s" , argv[1], argv[2]); /* give chance for someone to attach with gdb and to set waiting to 0 */ while (-- delay >=0) sleep(1); { char *buf = "\0\0"; TkX_Wish(argc, argv); } dfprintf(stderr, "Wish shell done\n"); sock_close_connection(dsfd); return 0; } else { dfprintf(stderr, "Error !!! Can't connect to socket host=%s, port=%s, errno=%d\n" , argv[1], argv[2], errno); fflush(stderr); return -1; } } } else { dfprintf(stderr, "Error !!! Not enough arguments\n"); fflush(stderr); return -1; } } struct connection_state * sock_connect_to_name(host_id, name, async) char *host_id; int name; int async; { struct sockaddr_in addr; int fd, n, rc; fd = socket( PF_INET, SOCK_STREAM, 0 ); addr.sin_family = PF_INET; addr.sin_port = name; addr.sin_addr.s_addr = inet_addr( host_id ); memset( addr.sin_zero, 0, 8 ); n = sizeof addr; rc = connect( fd, (struct sockaddr *)&addr, n ); if (rc != 0) return 0; return setup_connection_state(fd); } void sock_close_connection(sfd) struct connection_state *sfd; { close( sfd->fd ); free(sfd->read_buffer); free(sfd); } #ifdef PLATFORM_SUNOS static void notice_input( int sig, int code, struct sigcontext *s, char *a ) #else static void notice_input( sig ) int sig; #endif { signal( SIGIO, notice_input ); dfprintf(stderr, "\nNoticed input!\n" ); } static int message_id; int sock_write_str2( sfd, type, hdr, hdrsize,text, length ) struct connection_state *sfd; enum mtype type; char *hdr; int hdrsize; char *text; int length; { char buf[0x1000]; char *p = buf; int cb; int m; int n_written; struct message_header *msg; msg = (struct message_header *) buf; if (length == 0) length = strlen(text); m = length + hdrsize; msg->magic1=MAGIC1; msg->magic2=MAGIC2; msg->type = type; msg->flag = 0; STORE_3BYTES(msg->size,m); STORE_3BYTES(msg->msg_id,message_id); message_id++; p = buf + MESSAGE_HEADER_SIZE; bcopy(hdr,p,hdrsize); p+= hdrsize; if (sizeof(buf) >= (length + hdrsize + MESSAGE_HEADER_SIZE)) { bcopy(text,p,length); n_written = write1(sfd,buf,(length + hdrsize + MESSAGE_HEADER_SIZE)); } else { n_written = write1(sfd,buf, hdrsize + MESSAGE_HEADER_SIZE); n_written += write1(sfd, text, length); } if (n_written != (length + hdrsize + MESSAGE_HEADER_SIZE)) {perror("sock_write_str: Did not write full message"); return -1;} return n_written; } #define READ_BUF_STRING_AVAIL 1 #define READ_BUF_DATA_ON_PORT 2 #define DEFAULT_TIMEOUT_FOR_TK_READ (100 * HZ) struct message_header * guiParseMsg1(sfd,buf,bufleng) char *buf; int bufleng; struct connection_state *sfd; { int m; int body_length; int tot; char *p = buf; struct message_header *msg; msg = (struct message_header *) buf; m= read1(sfd,msg,MESSAGE_HEADER_SIZE,DEFAULT_TIMEOUT_FOR_TK_READ); if (m == MESSAGE_HEADER_SIZE) { if ( msg->magic1!=MAGIC1 || msg->magic2!=MAGIC2) { fprintf(stderr,"bad magic..flushing buffers"); while(read1(sfd,buf,bufleng,0) > 0); return 0;} GET_3BYTES(msg->size,body_length); tot = body_length+MESSAGE_HEADER_SIZE; if (tot >= bufleng) {msg = (void *)malloc(tot+1); bcopy(buf,msg,MESSAGE_HEADER_SIZE);} m = read1(sfd,&(msg->body), body_length,DEFAULT_TIMEOUT_FOR_TK_READ); if (m == body_length) { return msg;}} if (m < 0) exit(1); fail: { static bad_read_allowed=4; if (bad_read_allowed-- < 0) exit(1); } dfprintf(stderr,"reading from lisp timed out or not enough read"); return 0; } error(s) char *s; { fprintf(stderr,"%s",s); abort(); } write_timeout_error(s) char *s; { fprintf(stderr,"write timeout: %s",s); abort(); } connection_failure(s) char *s; { fprintf(stderr,"connection_failure:%s",s); abort(); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.