This is client.c in view mode; [Download] [Up]
#define I_SYS #define I_GETOPT #include "includes.h" #ifdef USE_VARARGS #include <varargs.h> #else #include <stdarg.h> #endif #include <string.h> #include "client.h" char *term_server = ""; int lcompression = -1; /* defaults. */ int rcompression = -1; int priority = 0; char com_result[200]; char *command_result; /* parse all the options, and then */ /* return the first unused argument. */ int client_options(int argc, char *argv[], char *myopts, Callback callback) { int c; char args[200]; /* make sure we get all the args to pass to getopt */ if (getenv("TERMSERVER")) term_server = getenv("TERMSERVER"); strcpy(args, "t:crp:"); strcat(args, myopts); while ((c = getopt(argc, argv, args))!=EOF) { switch(c) { case 't': term_server = optarg; break; case 'c': /* for compressionion */ lcompression = 1; rcompression = 1; break; case 'r': /* for raw, no compressionion */ lcompression = 0; rcompression = 0; break; case 'p': priority = atoi(optarg); fprintf(stderr, "Changeing priority to %d\n", priority); break; case '?': return -1; break; default: if ( (callback == NULL) || ( callback(c, optarg) == -1 ) ) { fprintf(stderr, "Unrecognized option %s\n", argv[optind]); return -1; } break; } } return optind; } /* Send a command to the Term */ /* process.*/ #ifdef USE_VARARGS int send_command(sock , comm, local , fmt, va_alist) int sock , comm, local; char *fmt; va_dcl { #else int send_command(int sock, int comm, int local, char *fmt, ...) { #endif char buff[200]; va_list v; int i; #ifdef USE_VARARGS va_start(v); #else va_start(v, fmt); #endif /* A command follows.. */ buff[0] = C_SWITCH; /* Is it for the local term? or the */ /* remote term? */ if (local) buff[1] = C_SWITCH - 1; else buff[1] = C_SWITCH - 2; /* Set the command in. */ buff[2] = comm; if (fmt) vsprintf(buff+3, fmt, v); else buff[3] = 0; va_end(v); /* Ok. Buff holds the entire command. */ /* Lets do the damned thing.. */ if (write(sock, buff, strlen(buff)+1) < 0) return -1; /* If the command is C_DUMB, then no */ /* reply will be forthcoming. */ if (comm == C_DUMB) return 1; i = 0; do { read(sock, &com_result[i], 1); } while (com_result[i++]); command_result = &com_result[3]; if (com_result[2] != I_OK) return -1; /* printf("command return was (%d)%s.\n", i, com_result);*/ return 1; } int connect_server(char *server) { char path[200]; char *home; int s; home = getenv("TERMDIR"); if (!home) home = getenv("HOME"); if (!home) home = "/tmp"; if (!server) server = ""; sprintf(path,"%s/.term/socket%s", home, server); /* Try and connect to term. */ s = open_unix(path); if (s < 0) exit(1); if ( lcompression >=0 ) send_command(s, C_COMPRESS, 1, "%d", lcompression); if ( rcompression >=0 ) send_command(s, C_COMPRESS, 0, "%d", rcompression); if (priority) { send_command(s, C_PRIORITY, 1, "%d", priority); send_command(s, C_PRIORITY, 0, "%d", priority); } return s; } /* build_arg: build a string from char ** argv to be passed * to C_EXEC family. * * by: croutons * * Notes: * returns a pointer to malloced space. * takes a null pointer as the end of the array of char*. * assumes null terminated strings. (for using string(3)) * returns NULL on error. * * we assume '\xff' is ok for the new terminator */ char * build_arg( char**arg ) { int i, s; char * f; if ( ! arg ) return NULL; for ( s = i = 0; NULL != arg[i]; i++) s += strlen(arg[i]); s += i + 2; if ( NULL == (f = (char *)malloc( s * sizeof(char) ) ) ) { return NULL; } for ( s = i = 0; NULL != arg[i]; i++ ) { s += strlen(strcpy(&f[s], arg[i])); /* f[s++] = '\xff'; bothers Ultrix MIPS compiler */ f[s++] = '\377'; } f[s] = '\0'; return f; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.