* (614)451-1883
*/
-static char rcsid[] = "$Id: chat.c,v 1.4 1994/05/30 00:30:37 paulus Exp $";
+static char rcsid[] = "$Id: chat.c,v 1.8 1995/05/19 04:19:29 paulus Exp $";
#include <stdio.h>
#include <fcntl.h>
#define TERMIOS
#endif
-#ifdef sun
-# if defined(SUNOS) && SUNOS >= 41
-# ifndef HDB
-# define HDB
-# endif
-# endif
-#endif
-
#ifdef TERMIO
#include <termio.h>
#endif
#define const
#endif
+#ifndef O_NONBLOCK
+#define O_NONBLOCK FNDELAY
+#endif
+
/*************** Micro getopt() *********************************************/
#define OPTION(c,v) (_O&2&&**v?*(*v)++:!c||_O&4?0:(!(_O&1)&& \
(--c,++v),_O=4,c&&**v=='-'&&v[0][1]?*++*v=='-'\
char *program_name;
-#ifndef LOCK_DIR
-# ifdef __NetBSD__
-# define PIDSTRING
-# define LOCK_DIR "/var/spool/lock"
-# else
-# ifdef HDB
-# define PIDSTRING
-# define LOCK_DIR "/usr/spool/locks"
-# else /* HDB */
-# define LOCK_DIR "/usr/spool/uucp"
-# endif /* HDB */
-# endif
-#endif /* LOCK_DIR */
-
#define MAX_ABORTS 50
#define DEFAULT_CHAT_TIMEOUT 45
void break_sequence __P((void));
void terminate __P((int status));
void do_file __P((char *chat_file));
-void lock __P((void));
-void delay __P((void));
int get_string __P((register char *string));
int put_string __P((register char *s));
int write_char __P((int c));
-int put_char __P((char c));
+int put_char __P((int c));
int get_char __P((void));
void chat_send __P((register char *s));
-char *character __P((char c));
+char *character __P((int c));
void chat_expect __P((register char *s));
char *clean __P((register char *s, int sending));
-void unlock __P((void));
-void lock __P((void));
void break_sequence __P((void));
void terminate __P((int status));
void die __P((void));
}
/*
- * chat [ -v ] [ -t timeout ] [ -l lock-file ] [ -f chat-file ] \
+ * chat [ -v ] [ -t timeout ] [ -f chat-file ] \
* [...[[expect[-say[-expect...]] say expect[-say[-expect]] ...]]]
*
* Perform a UUCP-dialer-like chat script on stdin and stdout.
void usage()
{
fprintf(stderr, "\
-Usage: %s [-v] [-l lock-file] [-t timeout] {-f chat-file || chat-script}\n",
+Usage: %s [-v] [-t timeout] {-f chat-file || chat-script}\n",
program_name);
exit(1);
}
}
/*
- * Unlock and terminate with an error.
+ * Terminate with an error.
*/
void die()
{
- unlock();
terminate(1);
}
const char *msg;
{
syslog(LOG_ERR, "%s", msg);
- unlock();
terminate(1);
}
const char *msg;
{
syslog(LOG_ERR, "%s: %m", msg);
- unlock();
terminate(1);
}
if ((flags = fcntl(0, F_GETFL, 0)) == -1)
sysfatal("Can't get file mode flags on stdin");
else
- if (fcntl(0, F_SETFL, flags | FNDELAY) == -1)
+ if (fcntl(0, F_SETFL, flags | O_NONBLOCK) == -1)
sysfatal("Can't set file mode flags on stdin");
if (verbose)
if ((flags = fcntl(0, F_GETFL, 0)) == -1)
sysfatal("Can't get file mode flags on stdin");
else
- if (fcntl(0, F_SETFL, flags & ~FNDELAY) == -1)
+ if (fcntl(0, F_SETFL, flags & ~O_NONBLOCK) == -1)
sysfatal("Can't set file mode flags on stdin");
}
signal(SIGTERM, sigterm);
signal(SIGHUP, sighup);
- if (lock_file)
- lock();
-
set_tty_parameters();
signal(SIGALRM, sigalrm);
alarm(0);
#endif
) {
syslog(LOG_ERR, "Can't restore terminal parameters: %m");
- unlock();
exit(1);
}
exit(status);
}
-/*
- * Create a lock file for the named lock device
- */
-void lock()
- {
- int fd, pid;
-# ifdef PIDSTRING
- char hdb_lock_buffer[12];
-# endif
-
- lock_file = strcat(strcat(strcpy(malloc(strlen(LOCK_DIR)
- + 1 + strlen(lock_file) + 1),
- LOCK_DIR), "/"), lock_file);
-
- if ((fd = open(lock_file, O_EXCL | O_CREAT | O_RDWR, 0644)) < 0)
- {
- char *s = lock_file;
- lock_file = (char *)0; /* Don't remove someone else's lock file! */
- syslog(LOG_ERR, "Can't get lock file '%s': %m", s);
- die();
- }
-
-# ifdef PIDSTRING
- sprintf(hdb_lock_buffer, "%10d\n", getpid());
- write(fd, hdb_lock_buffer, 11);
-# else
- pid = getpid();
- write(fd, &pid, sizeof pid);
-# endif
-
- close(fd);
- }
-
-/*
- * Remove our lockfile
- */
-void unlock()
- {
- if (lock_file)
- {
- unlink(lock_file);
- lock_file = (char *)0;
- }
- }
-
/*
* 'Clean up' this string.
*/
else
syslog(LOG_INFO, "Failed");
- unlock();
terminate(1);
}
}
}
char *character(c)
-char c;
+int c;
{
static char string[10];
char *meta;
s1 = clean(s, 0);
- if (strlen(s1) > strlen(s) || strlen(s1) > sizeof fail_buffer - 1)
+ if (strlen(s1) > strlen(s)
+ || strlen(s1) + 1 > sizeof(fail_buffer))
{
syslog(LOG_WARNING, "Illegal or too-long ABORT string ('%s')", s);
die();
if ( ! put_string(s))
{
syslog(LOG_INFO, "Failed");
- unlock();
terminate(1);
}
}
if ((status = fcntl(0, F_GETFL, 0)) == -1)
sysfatal("Can't get file mode flags on stdin");
else
- if (fcntl(0, F_SETFL, status & ~FNDELAY) == -1)
+ if (fcntl(0, F_SETFL, status & ~O_NONBLOCK) == -1)
sysfatal("Can't set file mode flags on stdin");
return (-1);
}
int put_char(c)
-char c;
+int c;
{
int status;
+ char ch = c;
- delay();
+ usleep(10000); /* inter-character typing delay (?) */
- status = write(1, &c, 1);
+ status = write(1, &ch, 1);
switch (status)
{
if ((status = fcntl(0, F_GETFL, 0)) == -1)
sysfatal("Can't get file mode flags on stdin");
else
- if (fcntl(0, F_SETFL, status & ~FNDELAY) == -1)
+ if (fcntl(0, F_SETFL, status & ~O_NONBLOCK) == -1)
sysfatal("Can't set file mode flags on stdin");
return (-1);
return (0);
}
-#ifdef ultrix
-#undef NO_USLEEP
+#ifdef NO_USLEEP
#include <sys/types.h>
#include <sys/time.h>
return select( 0, (long *)0, (long *)0, (long *)0, &delay );
}
#endif
-
-/*
- * Delay an amount appropriate for between typed characters.
- */
-void delay()
- {
-# ifdef NO_USLEEP
- register int i;
-
- for (i = 0; i < 30000; ++i) /* ... did we just say appropriate? */
- ;
-# else /* NO_USLEEP */
- usleep(100);
-# endif /* NO_USLEEP */
- }