diff options
-rw-r--r-- | GNUmakefile | 61 | ||||
-rw-r--r-- | Makefile | 24 | ||||
-rw-r--r-- | amtterm.c | 214 | ||||
-rw-r--r-- | mk/.cvsignore | 2 | ||||
-rw-r--r-- | mk/Autoconf.mk | 150 | ||||
-rw-r--r-- | mk/Compile.mk | 88 | ||||
-rw-r--r-- | mk/Maintainer.mk | 12 | ||||
-rw-r--r-- | mk/Variables.mk | 48 |
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 - @@ -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 + |