This is trshell.c in view mode; [Download] [Up]
/*
* A client for term.
*/
#define I_SYS
#define I_IOCTL
#define I_TTY
#include "includes.h"
#include "client.h"
#include <signal.h>
int debug = 0;
int term_client_number = -1;
int s;
int simple = 0;
char * pathtail(char*);
static int local_options ( char opt, char *optarg )
{
switch(opt)
{
case 's' :
simple = 1;
break;
default:
return -1;
}
return 0;
}
/* tty clean up and exit */
void quit(int ret)
{
set_block(s);
set_block(0);
set_block(1);
if (!simple && isatty(0))
{
terminal_restore(0);
terminal_restore(1);
}
exit (ret);
}
/* In case of sudden death, do some */
/* minimal clean up. */
void sig_quit(int dummy)
{
quit(1);
}
#ifdef USE_SIGWINCH
void resizer(int foo)
{
#ifdef TIOCGWINSZ
struct winsize ws;
if (ioctl(0, TIOCGWINSZ, &ws) >= 0)
#else /* TIOCGWINSZ */
#ifdef TIOCGSIZE
struct ttysize ts;
if (ioctl(0, TIOCGSIZE, &ts) >= 0)
#endif
#endif
{
int s = connect_server(term_server);
if (!s) return; /* cannot connect for some reason */
#ifdef TIOCGWINSZ
send_command(s, C_RESIZE, 0, "%d %d %d %d %d", term_client_number,
ws.ws_row, ws.ws_col, ws.ws_ypixel, ws.ws_xpixel);
#else /* TIOCGWINSZ */
#ifdef TIOCGSIZE
send_command(s, C_RESIZE, 0, "%d %d %d %d %d", term_client_number,
ts.ts_lines, ts.ts_cols, ts.ts_yyy, ts.ts_xxx);
#endif
#endif
close(s);
}
signal(SIGWINCH, resizer);
}
#endif /* USE_SIGWINCH */
void main(int argc, char *argv[]) {
int s, first;
char * f;
priority = 2;
first = client_options(argc,argv,"s", local_options);
if (first >= argc) simple = 0;
s = connect_server(term_server);
if (s < 0 ) exit(1); /* shouldn't ever happen since connect_server() exits */
if (send_command(s, C_STATS, 1, "%d", -6)<0) {
fprintf(stderr, "FATAL: Failed to get client number.\n");
fprintf(stderr, "Reason given: %s\n", command_result);
exit(1);
}
#ifdef USE_SIGWINCH
term_client_number = atoi(command_result);
if (term_client_number < 0)
fprintf(stderr, "Can't get client number: SIGWINCH not supported.\n");
#endif
if (send_command(s, simple ? C_EXEC : C_PTYEXEC, 0, "%s", f = build_arg(&argv[first]))< 0) {
fprintf(stderr, "FATAL: Failed to exec remote command\n");
fprintf(stderr, "Reason given: %s\n", command_result);
exit(1);
}
free(f);
send_command(s, C_DUMB, 1, 0);
#ifdef USE_SIGWINCH
if (!simple && isatty(0))
resizer(0);
#endif
terminal_save(0);
signal(SIGHUP, sig_quit);
signal(SIGINT, sig_quit);
signal(SIGQUIT, sig_quit);
signal(SIGPIPE, sig_quit);
if (!simple && isatty(0))
{
terminal_raw(0);
terminal_raw(1);
}
set_nonblock(0);
set_nonblock(1);
set_nonblock(s);
do_select_loop(s, 0, 1);
quit (0);
}
/* my function.
* char * pathtail( char * path )
* takes a path and returns a pointer to the last element in it
* assumes path separator is '/'
* assumes '\0' terminated path.
*
* note: returns a pointer to the string that was input.
* note: returns NULL if path == NULL.
*
*
* by croutons. 29 Nov 1992
*/
char * pathtail(char * p)
{
int i;
if ( ! p ) {
return NULL;
}
for (i = 0; p[i] != '\0'; i++);
for (i--; i >= 0 && p[i] != '/'; i--);
return &p[i+1];
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.