/****************************************************************************
- * Copyright (c) 1998-2007,2008 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
/*
* Author: Thomas E. Dickey (1998-on)
*
- * $Id: ditto.c,v 1.32 2008/08/04 13:21:41 tom Exp $
+ * $Id: ditto.c,v 1.36 2010/01/30 23:39:09 tom Exp $
*
* The program illustrates how to set up multiple screens from a single
* program.
*/
#include <test.priv.h>
#include <sys/stat.h>
-#include <errno.h>
#ifdef USE_PTHREADS
#include <pthread.h>
#include USE_OPENPTY_HEADER
#endif
+#ifdef HAVE_VFORK_H
+#include <vfork.h>
+#endif
+
#define MAX_FIFO 256
#define THIS_FIFO(n) ((n) % MAX_FIFO)
{
int result = -1;
if (peek->sequence < fifo->sequence) {
- peek->sequence += 1;
result = fifo->data[THIS_FIFO(peek->sequence)];
+ peek->sequence += 1;
}
return result;
}
failed(slave_name);
}
sprintf(s_option, "-S%s/%d", slave_name, aslave);
- if (fork()) {
+ if (vfork()) {
execlp("xterm", "xterm", s_option, "-title", path, (char *) 0);
_exit(0);
}
}
static void
-init_screen(SCREEN *sp GCC_UNUSED, void *arg)
+init_screen(
+#if HAVE_USE_WINDOW
+ SCREEN *sp GCC_UNUSED,
+#endif
+ void *arg)
{
DITTO *target = (DITTO *) arg;
int high, wide;
target->which1 = which1;
target->titles = source;
target->length = length;
+ target->fifo.head = -1;
target->screen = newterm((char *) 0, /* assume $TERM is the same */
target->output,
target->input);
}
static int
-close_screen(SCREEN *sp GCC_UNUSED, void *arg GCC_UNUSED)
+close_screen(
+#if HAVE_USE_WINDOW
+ SCREEN *sp GCC_UNUSED,
+#endif
+ void *arg GCC_UNUSED)
{
+#if HAVE_USE_WINDOW
(void) sp;
+#endif
(void) arg;
return endwin();
}
* Read data from the 'source' screen.
*/
static int
-read_screen(SCREEN *sp GCC_UNUSED, void *arg)
+read_screen(
+#if HAVE_USE_WINDOW
+ SCREEN *sp GCC_UNUSED,
+#endif
+ void *arg)
{
DDATA *data = (DDATA *) arg;
DITTO *ditto = &(data->ditto[data->source]);
* Write all of the data that's in fifos for the 'target' screen.
*/
static int
-write_screen(SCREEN *sp GCC_UNUSED, void *arg GCC_UNUSED)
+write_screen(
+#if HAVE_USE_WINDOW
+ SCREEN *sp GCC_UNUSED,
+#endif
+ void *arg GCC_UNUSED)
{
DDATA *data = (DDATA *) arg;
DITTO *ditto = &(data->ditto[data->target]);