+/* answerback.c version 0.1
+ * Written by John Newbigin <jn@it.swin.edu.au>
+ * GPL Version 2
+ * Compile with 'gcc -Wall -o answerback answerback.c'
+ * */
+#include <stdio.h>
+#include <unistd.h>
+#include <termios.h>
+#include <signal.h>
+#include <string.h>
+int main(int argc, char **argv)
+{
+ char *name = "ANSWERBACK";
+ char code = 5;
+ char buffer[16];
+ int r;
+ sigset_t sig, sigsave;
+ struct termios term, termsave;
+ FILE *fp;
+ if(argc == 2)
+ {
+ name = argv[1];
+ }
+ if((fp = fopen(ctermid(NULL), "r+")) == NULL)
+ {
+ perror("open");
+ return 0;
+ }
+ setbuf(fp, NULL);
+ sigemptyset(&sig);
+ sigaddset(&sig, SIGINT);
+ sigaddset(&sig, SIGTSTP);
+ sigprocmask(SIG_BLOCK, &sig, &sigsave);
+ tcgetattr(fileno(fp), &termsave);
+ term = termsave;
+ term.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL | ICANON);
+ term.c_cc[VMIN] = 0;
+ term.c_cc[VTIME] = 10;
+ tcsetattr(fileno(fp), TCSAFLUSH, &term);
+ write(fileno(fp), &code, 1);
+ memset(buffer, 0, sizeof(buffer));
+ r = read(fileno(fp), buffer, sizeof(buffer) - 1);
+ tcsetattr(fileno(fp), TCSAFLUSH, &termsave);
+ sigprocmask(SIG_SETMASK, &sigsave, NULL);
+ fclose(fp);
+ if(r > 0)
+ {
+ printf("%s='%s'\n", name, buffer);
+ }
+ return 0;
+}