summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--GNUmakefile61
-rw-r--r--Makefile24
-rw-r--r--amtterm.c214
-rw-r--r--mk/.cvsignore2
-rw-r--r--mk/Autoconf.mk150
-rw-r--r--mk/Compile.mk88
-rw-r--r--mk/Maintainer.mk12
-rw-r--r--mk/Variables.mk48
8 files changed, 386 insertions, 213 deletions
diff --git a/GNUmakefile b/GNUmakefile
new file mode 100644
index 0000000..aec0067
--- /dev/null
+++ b/GNUmakefile
@@ -0,0 +1,61 @@
+# config
+srcdir = .
+VPATH = $(srcdir)
+-include Make.config
+include $(srcdir)/mk/Variables.mk
+
+CFLAGS += -Wall -Wno-pointer-sign
+CFLAGS += -DVERSION='"$(VERSION)"'
+
+TARGETS := amtterm
+
+all: build
+
+#################################################################
+# poor man's autoconf ;-)
+
+include mk/Autoconf.mk
+
+define make-config
+LIB := $(LIB)
+HAVE_GTK := $(call ac_pkg_config,gtk+-x11-2.0)
+HAVE_VTE := $(call ac_pkg_config,vte)
+endef
+
+#################################################################
+
+# build gamt?
+ifeq ($(HAVE_GTK)$(HAVE_VTE),yesyes)
+ TARGETS += gamt
+ gamt : CFLAGS += -Wno-strict-prototypes
+ gamt : pkglst += gtk+-x11-2.0 vte
+endif
+
+CFLAGS += $(shell test "$(pkglst)" != "" && pkg-config --cflags $(pkglst))
+LDLIBS += $(shell test "$(pkglst)" != "" && pkg-config --libs $(pkglst))
+
+#################################################################
+
+build: $(TARGETS)
+
+install: build
+ mkdir -p $(DESTDIR)$(bindir)
+ install -s $(TARGETS) $(DESTDIR)$(bindir)
+
+clean:
+ rm -f *.o *~
+ rm -f $(TARGETS)
+
+distclean: clean
+ rm -f Make.config
+
+#################################################################
+
+amtterm: amtterm.o redir.o tcp.o
+gamt: gamt.o
+
+#################################################################
+
+include mk/Compile.mk
+include mk/Maintainer.mk
+-include $(depfiles)
diff --git a/Makefile b/Makefile
deleted file mode 100644
index fa6675e..0000000
--- a/Makefile
+++ /dev/null
@@ -1,24 +0,0 @@
-
-DESTDIR ?=
-prefix ?= /usr
-bindir ?= $(prefix)/bin
-
-CC ?= gcc
-CFLAGS ?= -Os -g
-CFLAGS += -Wall -Wno-pointer-sign
-CFLAGS += -DVERSION='"$(shell cat VERSION)"'
-
-TARGETS := amtterm
-
-all: $(TARGETS)
-
-install: $(TARGETS)
- mkdir -p $(DESTDIR)$(bindir)
- install -s $(TARGETS) $(DESTDIR)$(bindir)
-
-clean:
- rm -f *.o *~
- rm -f $(TARGETS)
-
-amtterm: amtterm.o tcp.o
-
diff --git a/amtterm.c b/amtterm.c
index cfaeca2..f49cd33 100644
--- a/amtterm.c
+++ b/amtterm.c
@@ -8,209 +8,38 @@
#include <signal.h>
#include <sys/ioctl.h>
-#include "RedirectionConstants.h"
#include "tcp.h"
+#include "redir.h"
#define APPNAME "amtterm"
#define BUFSIZE 512
-struct redir {
- int sock;
- int connected;
- int verbose;
- int closed;
- unsigned char type[4];
- unsigned char user[16];
- unsigned char pass[16];
-};
-
/* ------------------------------------------------------------------ */
-static int redir_start(struct redir *r)
-{
- unsigned char request[START_REDIRECTION_SESSION_LENGTH] = {
- START_REDIRECTION_SESSION, 0, 0, 0, 0, 0, 0, 0
- };
-
- memcpy(request+4, r->type, 4);
- return write(r->sock, request, sizeof(request));
-}
-
-static int redir_stop(struct redir *r)
-{
- unsigned char request[END_REDIRECTION_SESSION_LENGTH] = {
- END_REDIRECTION_SESSION, 0, 0, 0
- };
-
- return write(r->sock, request, sizeof(request));
-}
-
-static int redir_auth(struct redir *r)
-{
- int ulen = strlen(r->user);
- int plen = strlen(r->pass);
- int len = 11+ulen+plen;
- int rc;
- unsigned char *request = malloc(len);
-
- memset(request, 0, len);
- request[0] = AUTHENTICATE_SESSION;
- request[4] = 0x01;
- request[5] = ulen+plen+2;
- request[9] = ulen;
- memcpy(request + 10, r->user, ulen);
- request[10 + ulen] = plen;
- memcpy(request + 11 + ulen, r->pass, plen);
- rc = write(r->sock, request, len);
- free(request);
- return rc;
-}
-
-static int redir_sol_start(struct redir *r)
+static int recv_tty(void *cb_data, unsigned char *buf, int len)
{
- unsigned char request[START_SOL_REDIRECTION_LENGTH] = {
- START_SOL_REDIRECTION, 0, 0, 0,
- 0, 0, 0, 0,
- MAX_TRANSMIT_BUFFER & 0xff,
- MAX_TRANSMIT_BUFFER >> 8,
- TRANSMIT_BUFFER_TIMEOUT & 0xff,
- TRANSMIT_BUFFER_TIMEOUT >> 8,
- TRANSMIT_OVERFLOW_TIMEOUT & 0xff, TRANSMIT_OVERFLOW_TIMEOUT >> 8,
- HOST_SESSION_RX_TIMEOUT & 0xff,
- HOST_SESSION_RX_TIMEOUT >> 8,
- HOST_FIFO_RX_FLUSH_TIMEOUT & 0xff,
- HOST_FIFO_RX_FLUSH_TIMEOUT >> 8,
- HEARTBEAT_INTERVAL & 0xff,
- HEARTBEAT_INTERVAL >> 8,
- 0, 0, 0, 0
- };
+// struct redir *r = cb_data;
- return write(r->sock, request, sizeof(request));
+ return write(0, buf, len);
}
-static int redir_sol_stop(struct redir *r)
+static void state_tty(void *cb_data, enum redir_state old, enum redir_state new)
{
- unsigned char request[END_SOL_REDIRECTION_LENGTH] = {
- END_SOL_REDIRECTION, 0, 0, 0,
- 0, 0, 0, 0,
- };
-
- return write(r->sock, request, sizeof(request));
-}
-
-static int redir_sol_send(struct redir *r, unsigned char *buf, int blen)
-{
- int len = 10+blen;
- int rc;
- unsigned char *request = malloc(len);
-
- memset(request, 0, len);
- request[0] = SOL_DATA_TO_HOST;
- request[8] = blen & 0xff;
- request[9] = blen >> 8;
- memcpy(request + 10, buf, blen);
- rc = write(r->sock, request, len);
- free(request);
- return rc;
-}
-
-static int redir_sol_recv(struct redir *r, unsigned char *buf, int blen)
-{
- unsigned char msg[64];
- int count, len;
-
- len = buf[8] + (buf[9] << 8);
- count = blen - 10;
- write(0, buf + 10, count);
- len -= count;
- while (len) {
- count = sizeof(msg);
- if (count > len)
- count = len;
- count = read(r->sock, msg, count);
- switch (count) {
- case -1:
- perror("read(sock)");
- return -1;
- case 0:
- fprintf(stderr, "EOF from socket\n");
- return -1;
- default:
- write(0, msg, count);
- len -= count;
- }
- }
- return 0;
-}
-
-/* ------------------------------------------------------------------ */
+ struct redir *r = cb_data;
-static int redir_data(struct redir *r)
-{
- unsigned char request[64];
- int rc;
+ if (!r->verbose)
+ return;
- rc = read(r->sock, request, sizeof(request));
- if (rc < 4)
- return -1;
- switch (request[0]) {
- case START_REDIRECTION_SESSION_REPLY:
- if (rc != START_REDIRECTION_SESSION_REPLY_LENGTH) {
- fprintf(stderr,"START_REDIRECTION_SESSION_REPLY: got %d, expected %d bytes\n",
- rc, START_REDIRECTION_SESSION_REPLY_LENGTH);
- return -1;
- }
- if (request[1] != STATUS_SUCCESS) {
- fprintf(stderr, "redirection session start failed\n");
- return -1;
- }
- if (r->verbose)
- fprintf(stderr, "redirection session start ok\n");
- return redir_auth(r);
- case AUTHENTICATE_SESSION_REPLY:
- if (request[1] != STATUS_SUCCESS) {
- fprintf(stderr, "session authentication failed\n");
- return -1;
- }
- if (r->verbose)
- fprintf(stderr, "session authentication ok\n");
- return redir_sol_start(r);
- case START_SOL_REDIRECTION_REPLY:
- if (request[1] != STATUS_SUCCESS) {
- fprintf(stderr, "serial-over-lan redirection failed\n");
- return -1;
- }
- if (r->verbose) {
- fprintf(stderr, "serial-over-lan redirection ok\n");
- fprintf(stderr, "connected now, use ^] to escape\n");
- }
- r->connected = 1;
- return 0;
- case SOL_HEARTBEAT:
- case SOL_KEEP_ALIVE_PING:
- case IDER_HEARTBEAT:
- case IDER_KEEP_ALIVE_PING:
- if (rc != HEARTBEAT_LENGTH) {
- fprintf(stderr,"HEARTBEAT: got %d, expected %d bytes\n",
- rc, HEARTBEAT_LENGTH);
- return -1;
- }
- if (HEARTBEAT_LENGTH != write(r->sock, request, HEARTBEAT_LENGTH)) {
- perror("write(sock)");
- return -1;
- }
- return 0;
- case SOL_DATA_FROM_HOST:
- return redir_sol_recv(r, request, rc);
- case END_SOL_REDIRECTION_REPLY:
- redir_stop(r);
- r->closed = 1;
+ fprintf(stderr, APPNAME " state: %s -> %s\n",
+ redir_strstate(old), redir_strstate(new));
+ switch (new) {
+ case REDIR_CONN_SOL:
+ fprintf(stderr, "serial-over-lan redirection ok\n");
+ fprintf(stderr, "connected now, use ^] to escape\n");
break;
default:
- fprintf(stderr, "%s: unknown request 0x%02x\n", __FUNCTION__, request[0]);
- return -1;
+ break;
}
- return 0;
}
static int redir_loop(struct redir *r)
@@ -220,9 +49,13 @@ static int redir_loop(struct redir *r)
int rc;
fd_set set;
- for(;!r->closed;) {
+ for(;;) {
+ if (r->state == REDIR_CLOSED ||
+ r->state == REDIR_ERROR)
+ break;
+
FD_ZERO(&set);
- if (r->connected)
+ if (r->state == REDIR_CONN_SOL)
FD_SET(0,&set);
FD_SET(r->sock,&set);
tv.tv_sec = HEARTBEAT_INTERVAL * 4 / 1000;
@@ -251,7 +84,6 @@ static int redir_loop(struct redir *r)
if (r->verbose)
fprintf(stderr, "\n" APPNAME ": saw ^], exiting\n");
redir_sol_stop(r);
- r->connected = 0;
}
if (-1 == redir_sol_send(r, buf, rc))
return -1;
@@ -344,6 +176,10 @@ int main(int argc, char *argv[])
memcpy(r.type, "SOL ", 4);
strcpy(r.user, "admin");
+ r.cb_data = &r;
+ r.cb_recv = recv_tty;
+ r.cb_state = state_tty;
+
if (NULL != (h = getenv("AMT_PASSWORD")))
snprintf(r.pass, sizeof(r.pass), "%s", h);
diff --git a/mk/.cvsignore b/mk/.cvsignore
new file mode 100644
index 0000000..47a3449
--- /dev/null
+++ b/mk/.cvsignore
@@ -0,0 +1,2 @@
+*.dep
+*.tmp
diff --git a/mk/Autoconf.mk b/mk/Autoconf.mk
new file mode 100644
index 0000000..65cd915
--- /dev/null
+++ b/mk/Autoconf.mk
@@ -0,0 +1,150 @@
+#
+# simple autoconf system for GNU make
+#
+# (c) 2002-2006 Gerd Hoffmann <kraxel@suse.de>
+#
+# credits for creating this one go to the autotools people because
+# they managed it to annoy lots of developers and users (including
+# me) with version incompatibilities.
+#
+# This file is public domain. No warranty. If it breaks you keep
+# both pieces.
+#
+########################################################################
+
+# verbose yes/no
+verbose ?= no
+
+# some stuff used by the tests
+ifneq ($(verbose),no)
+ # verbose (for debug)
+ ac_init = echo "checking $(1) ... " >&2; rc=no
+ ac_b_cmd = echo "run: $(1)" >&2; $(1) >/dev/null && rc=yes
+ ac_s_cmd = echo "run: $(1)" >&2; rc=`$(1)`
+ ac_fini = echo "... result is $${rc}" >&2; echo >&2; echo "$${rc}"
+else
+ # normal
+ ac_init = echo -n "checking $(1) ... " >&2; rc=no
+ ac_b_cmd = $(1) >/dev/null 2>&1 && rc=yes
+ ac_s_cmd = rc=`$(1) 2>/dev/null`
+ ac_fini = echo "$${rc}" >&2; echo "$${rc}"
+endif
+
+# some helpers to build cflags and related variables
+ac_def_cflags_1 = $(if $(filter yes,$($(1))),-D$(1))
+ac_lib_cflags = $(foreach lib,$(1),$(call ac_def_cflags_1,HAVE_LIB$(lib)))
+ac_inc_cflags = $(foreach inc,$(1),$(call ac_def_cflags_1,HAVE_$(inc)))
+ac_lib_mkvar_1 = $(if $(filter yes,$(HAVE_LIB$(1))),$($(1)_$(2)))
+ac_lib_mkvar = $(foreach lib,$(1),$(call ac_lib_mkvar_1,$(lib),$(2)))
+
+
+########################################################################
+# the tests ...
+
+# get uname
+ac_uname = $(shell \
+ $(call ac_init,for system);\
+ $(call ac_s_cmd,uname -s | tr 'A-Z' 'a-z');\
+ $(call ac_fini))
+
+# check for some header file
+# args: header file
+ac_header = $(shell \
+ $(call ac_init,for $(1));\
+ $(call ac_b_cmd,echo '\#include <$(1)>' |\
+ $(CC) $(CFLAGS) -E -);\
+ $(call ac_fini))
+
+# check for some function
+# args: function [, additional libs ]
+ac_func = $(shell \
+ $(call ac_init,for $(1));\
+ echo 'void $(1)(void); int main(void) {$(1)();return 0;}' \
+ > __actest.c;\
+ $(call ac_b_cmd,$(CC) $(CFLAGS) $(LDFLAGS) -o \
+ __actest __actest.c $(2));\
+ rm -f __actest __actest.c;\
+ $(call ac_fini))
+
+# check for some library
+# args: function, library [, additional libs ]
+ac_lib = $(shell \
+ $(call ac_init,for $(1) in $(2));\
+ echo 'void $(1)(void); int main(void) {$(1)();return 0;}' \
+ > __actest.c;\
+ $(call ac_b_cmd,$(CC) $(CFLAGS) $(LDFLAGS) -o \
+ __actest __actest.c -l$(2) $(3));\
+ rm -f __actest __actest.c;\
+ $(call ac_fini))
+
+# check if some compiler flag works
+# args: compiler flag
+ac_cflag = $(shell \
+ $(call ac_init,if $(CC) supports $(1));\
+ echo 'int main() {return 0;}' > __actest.c;\
+ $(call ac_b_cmd,$(CC) $(CFLAGS) $(1) $(LDFLAGS) -o \
+ __actest __actest.c);\
+ rm -f __actest __actest.c;\
+ $(call ac_fini))
+
+# check for some binary
+# args: binary name
+ac_binary = $(shell \
+ $(call ac_init,for $(1));\
+ $(call ac_s_cmd,which $(1));\
+ bin="$$rc";rc="no";\
+ $(call ac_b_cmd,test -x "$$$$bin");\
+ $(call ac_fini))
+
+# check if lib64 is used
+ac_lib64 = $(shell \
+ $(call ac_init,for libdir name);\
+ $(call ac_s_cmd,$(CC) -print-search-dirs | grep -q lib64 &&\
+ echo "lib64" || echo "lib");\
+ $(call ac_fini))
+
+# check for x11 ressource dir prefix
+ac_resdir = $(shell \
+ $(call ac_init,for X11 app-defaults prefix);\
+ $(call ac_s_cmd, for dir in \
+ /etc/X11/app-defaults \
+ /usr/X11R6/lib/X11/app-defaults \
+ /usr/share/X11/app-defaults \
+ /usr/lib/X11/app-defaults \
+ ; do test -d "$$dir" || continue;\
+ dirname "$$dir"; break; done);\
+ $(call ac_fini))
+
+# check if package is installed, via pkg-config
+# args: pkg name
+ac_pkg_config = $(shell \
+ $(call ac_init,for $(1) (using pkg-config));\
+ $(call ac_b_cmd, pkg-config $(1));\
+ $(call ac_fini))
+
+
+########################################################################
+# build Make.config
+
+define newline
+
+
+endef
+make-config-q = $(subst $(newline),\n,$(make-config))
+
+ifeq ($(filter config,$(MAKECMDGOALS)),config)
+.PHONY: Make.config
+ LIB := $(call ac_lib64)
+else
+ LIB ?= $(call ac_lib64)
+ LIB := $(LIB)
+endif
+.PHONY: config
+config: Make.config
+ @true
+
+Make.config: $(srcdir)/GNUmakefile
+ @echo -e "$(make-config-q)" > $@
+ @echo
+ @echo "Make.config written, edit if needed"
+ @echo
diff --git a/mk/Compile.mk b/mk/Compile.mk
new file mode 100644
index 0000000..da14d58
--- /dev/null
+++ b/mk/Compile.mk
@@ -0,0 +1,88 @@
+#
+# some rules to compile stuff ...
+#
+# (c) 2002-2006 Gerd Hoffmann <kraxel@suse.de>
+#
+# main features:
+# * autodependencies via "cpp -MD"
+# * fancy, non-verbose output
+#
+# This file is public domain. No warranty. If it breaks you keep
+# both pieces.
+#
+########################################################################
+
+# verbose yes/no
+verbose ?= no
+
+# dependency files
+tmpdep = mk/$(subst /,_,$*).tmp
+depfile = mk/$(subst /,_,$*).dep
+depfiles = mk/*.dep
+
+compile_c = $(CC) $(CFLAGS) -Wp,-MD,$(tmpdep) -c -o $@ $<
+compile_cc = $(CXX) $(CXXFLAGS) -Wp,-MD,$(tmpdep) -c -o $@ $<
+fixup_deps = sed -e "s|.*\.o:|$@:|" < $(tmpdep) > $(depfile) && rm -f $(tmpdep)
+cc_makedirs = mkdir -p $(dir $@) $(dir $(depfile))
+
+link_app = $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
+link_so = $(CC) $(LDFLAGS) -shared -Wl,-soname,$(@F) -o $@ $^ $(LDLIBS)
+ar_lib = rm -f $@ && ar -r $@ $^ && ranlib $@
+
+moc_h = $(MOC) $< -o $@
+msgfmt_po = msgfmt -o $@ $<
+
+# non-verbose output
+ifeq ($(verbose),no)
+ echo_compile_c = echo " CC " $@
+ echo_compile_cc = echo " CXX " $@
+ echo_link_app = echo " LD " $@
+ echo_link_so = echo " LD " $@
+ echo_ar_lib = echo " AR " $@
+ echo_moc_h = echo " MOC " $@
+ echo_msgfmt_po = echo " MSGFMT " $@
+else
+ echo_compile_c = echo $(compile_c)
+ echo_compile_cc = echo $(compile_cc)
+ echo_link_app = echo $(link_app)
+ echo_link_so = echo $(link_so)
+ echo_ar_lib = echo $(ar_lib)
+ echo_moc_h = echo $(moc_h)
+ echo_msgfmt_po = echo $(msgfmt_po)
+endif
+
+%.o: %.c
+ @$(cc_makedirs)
+ @$(echo_compile_c)
+ @$(compile_c)
+ @$(fixup_deps)
+
+%.o: %.cc
+ @$(cc_makedirs)
+ @$(echo_compile_cc)
+ @$(compile_cc)
+ @$(fixup_deps)
+
+%.o: %.cpp
+ @$(cc_makedirs)
+ @$(echo_compile_cc)
+ @$(compile_cc)
+ @$(fixup_deps)
+
+
+%.so: %.o
+ @$(echo_link_so)
+ @$(link_so)
+
+%: %.o
+ @$(echo_link_app)
+ @$(link_app)
+
+%.moc : %.h
+ @$(echo_moc_h)
+ @$(moc_h)
+
+%.mo : %.po
+ @$(echo_msgfmt_po)
+ @$(msgfmt_po)
+
diff --git a/mk/Maintainer.mk b/mk/Maintainer.mk
new file mode 100644
index 0000000..62f02d6
--- /dev/null
+++ b/mk/Maintainer.mk
@@ -0,0 +1,12 @@
+# just some maintainer stuff for me ...
+########################################################################
+
+make-sync-dir = $(HOME)/projects/gnu-makefiles
+
+.PHONY: sync
+sync:: distclean
+ test -d $(make-sync-dir)
+ rm -f $(srcdir)/INSTALL $(srcdir)/mk/*.mk
+ cp -v $(make-sync-dir)/INSTALL $(srcdir)/.
+ cp -v $(make-sync-dir)/*.mk $(srcdir)/mk
+ chmod 444 $(srcdir)/INSTALL $(srcdir)/mk/*.mk
diff --git a/mk/Variables.mk b/mk/Variables.mk
new file mode 100644
index 0000000..69486f3
--- /dev/null
+++ b/mk/Variables.mk
@@ -0,0 +1,48 @@
+# common variables ...
+########################################################################
+
+# directories
+DESTDIR =
+srcdir ?= .
+prefix ?= /usr/local
+bindir = $(DESTDIR)$(prefix)/bin
+mandir = $(DESTDIR)$(prefix)/share/man
+locdir = $(DESTDIR)$(prefix)/share/locale
+
+# package + version
+empty :=
+space := $(empty) $(empty)
+ifneq ($(wildcard $(srcdir)/VERSION),)
+ VERSION := $(shell cat $(srcdir)/VERSION)
+else
+ VERSION := 42
+endif
+
+# programs
+CC ?= gcc
+CXX ?= g++
+MOC ?= $(if $(QTDIR),$(QTDIR)/bin/moc,moc)
+INSTALL ?= install
+INSTALL_BINARY := $(INSTALL) -s
+INSTALL_SCRIPT := $(INSTALL)
+INSTALL_DATA := $(INSTALL) -m 644
+INSTALL_DIR := $(INSTALL) -d
+
+# cflags
+CFLAGS ?= -g -O2
+CXXFLAGS ?= $(CFLAGS)
+CFLAGS += -Wall -Wmissing-prototypes -Wstrict-prototypes \
+ -Wpointer-arith -Wunused
+CXXFLAGS += -Wall -Wpointer-arith -Wunused
+
+# add /usr/local to the search path if something is in there ...
+ifneq ($(wildcard /usr/local/include/*.h),)
+ CFLAGS += -I/usr/local/include
+ LDFLAGS += -L/usr/local/$(LIB)
+endif
+
+# fixup include path for $(srcdir) != "."
+ifneq ($(srcdir),.)
+ CFLAGS += -I. -I$(srcdir)
+endif
+