add ipxripd router daemon

This commit is contained in:
Mario Fetka
2026-04-29 21:31:52 +02:00
parent 6bf0f3ba5d
commit a97961011c
37 changed files with 20785 additions and 3 deletions

1198
Makefile Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
ACLOCAL_AMFLAGS = -I m4
SUBDIRS = po
SUBDIRS = po ipxripd
AM_CFLAGS = -Wall -Wextra

View File

@@ -416,7 +416,7 @@ top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
ACLOCAL_AMFLAGS = -I m4
SUBDIRS = po
SUBDIRS = po ipxripd
AM_CFLAGS = -Wall -Wextra
ipx_configure_SOURCES = \
src/nls.h \

104
config.h Normal file
View File

@@ -0,0 +1,104 @@
/* config.h. Generated from config.h.in by configure. */
/* config.h.in. Generated from configure.ac by autoheader. */
/* Define to 1 if translation of program messages to the user's native
language is requested. */
#define ENABLE_NLS 1
/* Define to 1 if you have the 'bindtextdomain' function. */
#define HAVE_BINDTEXTDOMAIN 1
/* Define to 1 if you have the Mac OS X function
CFLocaleCopyPreferredLanguages in the CoreFoundation framework. */
/* #undef HAVE_CFLOCALECOPYPREFERREDLANGUAGES */
/* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in
the CoreFoundation framework. */
/* #undef HAVE_CFPREFERENCESCOPYAPPVALUE */
/* Define if the GNU dcgettext() function is already present or preinstalled.
*/
#define HAVE_DCGETTEXT 1
/* Define to 1 if you have the 'gettext' function. */
#define HAVE_GETTEXT 1
/* Define if you have the iconv() function and it works. */
/* #undef HAVE_ICONV */
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
/* Define to 1 if you have the <libintl.h> header file. */
#define HAVE_LIBINTL_H 1
/* Define to 1 if you have the <netipx/ipx.h> header file. */
#define HAVE_NETIPX_IPX_H 1
/* Define to 1 if you have the <net/if.h> header file. */
#define HAVE_NET_IF_H 1
/* Define to 1 if you have the <net/route.h> header file. */
#define HAVE_NET_ROUTE_H 1
/* Define to 1 if you have the <stdint.h> header file. */
#define HAVE_STDINT_H 1
/* Define to 1 if you have the <stdio.h> header file. */
#define HAVE_STDIO_H 1
/* Define to 1 if you have the <stdlib.h> header file. */
#define HAVE_STDLIB_H 1
/* Define to 1 if you have the <strings.h> header file. */
#define HAVE_STRINGS_H 1
/* Define to 1 if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define to 1 if you have the <sys/socket.h> header file. */
#define HAVE_SYS_SOCKET_H 1
/* Define to 1 if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define to 1 if you have the 'textdomain' function. */
#define HAVE_TEXTDOMAIN 1
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
/* Define location of message catalogs */
#define LOCALEDIR "${datarootdir}/locale"
/* Name of package */
#define PACKAGE "ipx-utils"
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "mario.fetka@disconnected-by-peer.at"
/* Define to the full name of this package. */
#define PACKAGE_NAME "ipx-utils"
/* Define to the full name and version of this package. */
#define PACKAGE_STRING "ipx-utils 1.4"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "ipx-utils"
/* Define to the home page for this package. */
#define PACKAGE_URL ""
/* Define to the version of this package. */
#define PACKAGE_VERSION "1.4"
/* Define to 1 if all of the C89 standard headers exist (not just the ones
required in a freestanding environment). This macro is provided for
backward compatibility; new code need not use it. */
#define STDC_HEADERS 1
/* Version number of package */
#define VERSION "1.4"

103
config.h.in~ Normal file
View File

@@ -0,0 +1,103 @@
/* config.h.in. Generated from configure.ac by autoheader. */
/* Define to 1 if translation of program messages to the user's native
language is requested. */
#undef ENABLE_NLS
/* Define to 1 if you have the 'bindtextdomain' function. */
#undef HAVE_BINDTEXTDOMAIN
/* Define to 1 if you have the Mac OS X function
CFLocaleCopyPreferredLanguages in the CoreFoundation framework. */
#undef HAVE_CFLOCALECOPYPREFERREDLANGUAGES
/* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in
the CoreFoundation framework. */
#undef HAVE_CFPREFERENCESCOPYAPPVALUE
/* Define if the GNU dcgettext() function is already present or preinstalled.
*/
#undef HAVE_DCGETTEXT
/* Define to 1 if you have the 'gettext' function. */
#undef HAVE_GETTEXT
/* Define if you have the iconv() function and it works. */
#undef HAVE_ICONV
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
/* Define to 1 if you have the <libintl.h> header file. */
#undef HAVE_LIBINTL_H
/* Define to 1 if you have the <netipx/ipx.h> header file. */
#undef HAVE_NETIPX_IPX_H
/* Define to 1 if you have the <net/if.h> header file. */
#undef HAVE_NET_IF_H
/* Define to 1 if you have the <net/route.h> header file. */
#undef HAVE_NET_ROUTE_H
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
/* Define to 1 if you have the <stdio.h> header file. */
#undef HAVE_STDIO_H
/* Define to 1 if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H
/* Define to 1 if you have the <strings.h> header file. */
#undef HAVE_STRINGS_H
/* Define to 1 if you have the <string.h> header file. */
#undef HAVE_STRING_H
/* Define to 1 if you have the <sys/socket.h> header file. */
#undef HAVE_SYS_SOCKET_H
/* Define to 1 if you have the <sys/stat.h> header file. */
#undef HAVE_SYS_STAT_H
/* Define to 1 if you have the <sys/types.h> header file. */
#undef HAVE_SYS_TYPES_H
/* Define to 1 if you have the 'textdomain' function. */
#undef HAVE_TEXTDOMAIN
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
/* Define location of message catalogs */
#undef LOCALEDIR
/* Name of package */
#undef PACKAGE
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
/* Define to the full name of this package. */
#undef PACKAGE_NAME
/* Define to the full name and version of this package. */
#undef PACKAGE_STRING
/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME
/* Define to the home page for this package. */
#undef PACKAGE_URL
/* Define to the version of this package. */
#undef PACKAGE_VERSION
/* Define to 1 if all of the C89 standard headers exist (not just the ones
required in a freestanding environment). This macro is provided for
backward compatibility; new code need not use it. */
#undef STDC_HEADERS
/* Version number of package */
#undef VERSION

745
config.log Normal file
View File

@@ -0,0 +1,745 @@
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by ipx-utils configure 1.4, which was
generated by GNU Autoconf 2.72. Invocation command line was
$ ./configure --prefix=/usr
## --------- ##
## Platform. ##
## --------- ##
hostname = tiulk
uname -m = x86_64
uname -r = 7.0.2-gentoo-dist
uname -s = Linux
uname -v = #1 SMP PREEMPT_DYNAMIC Mon Apr 27 19:01:22 -00 2026
/usr/bin/uname -p = 11th Gen Intel(R) Core(TM) i9-11950H @ 2.60GHz
/bin/uname -X = unknown
/bin/arch = x86_64
/usr/bin/arch -k = unknown
/usr/convex/getsysinfo = unknown
/usr/bin/hostinfo = unknown
/bin/machine = unknown
/usr/bin/oslevel = unknown
/bin/universe = unknown
PATH: /home/mario/bin/
PATH: /home/mario/.cargo/bin/
PATH: /usr/tqt3/bin/
PATH: /usr/local/sbin/
PATH: /usr/local/bin/
PATH: /usr/bin/
PATH: /opt/bin/
PATH: /opt/calypsi/6502/bin/
PATH: /opt/calypsi/65816/bin/
PATH: /opt/calypsi/68000/bin/
PATH: /opt/wdc/bin/
PATH: /usr/lib/llvm/22/bin/
PATH: /usr/lib/llvm/21/bin/
PATH: /usr/lib/llvm/20/bin/
PATH: /usr/trinity/14/bin/
PATH: /opt/android-sdk/cmdline-tools/latest/bin/
PATH: /etc/eselect/wine/bin/
PATH: /opt/cuda/bin/
PATH: /usr/lib64/opencascade/bin/
## ----------- ##
## Core tests. ##
## ----------- ##
configure:2057: loading site script /usr/share/config.site
| # Copyright 2023 Gentoo Authors
| # Distributed under the terms of the GNU General Public License v2
|
| for script in "/usr/share/config.site.d"/*.conf; do
| test -f "${script}" || continue
| test -r "${script}" || continue
| echo "${0##*/}: loading site script ${script}"
| . "${script}" || break
| done
| unset script
configure:2434: looking for aux files: config.guess config.sub compile config.rpath missing install-sh
configure:2447: trying ./
configure:2476: ./config.guess found
configure:2476: ./config.sub found
configure:2476: ./compile found
configure:2476: ./config.rpath found
configure:2476: ./missing found
configure:2458: ./install-sh found
configure:2611: checking for a BSD-compatible install
configure:2685: result: /usr/bin/install -c
configure:2696: checking whether sleep supports fractional seconds
configure:2712: result: yes
configure:2715: checking filesystem timestamp resolution
configure:2850: result: 0.01
configure:2855: checking whether build environment is sane
configure:2900: result: yes
configure:3071: checking for a race-free mkdir -p
configure:3114: result: /usr/bin/mkdir -p
configure:3121: checking for gawk
configure:3142: found /usr/bin/gawk
configure:3154: result: gawk
configure:3165: checking whether make sets $(MAKE)
configure:3189: result: yes
configure:3215: checking whether make supports nested variables
configure:3234: result: yes
configure:3248: checking xargs -n works
configure:3264: result: yes
configure:3349: checking whether UID '1000' is supported by ustar format
configure:3355: result: yes
configure:3362: checking whether GID '1000' is supported by ustar format
configure:3368: result: yes
configure:3376: checking how to create a ustar tar archive
configure:3387: tar --version
tar (GNU tar) 1.35
Copyright (C) 2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by John Gilmore and Jay Fenlason.
configure:3390: $? = 0
configure:3430: tardir=conftest.dir && eval tar --format=ustar -chf - "$tardir" >conftest.tar
configure:3433: $? = 0
configure:3437: tar -xf - <conftest.tar
configure:3440: $? = 0
configure:3442: cat conftest.dir/file
GrepMe
configure:3445: $? = 0
configure:3460: result: gnutar
configure:3486: checking for a sed that does not truncate output
configure:3558: result: /usr/bin/sed
configure:3564: checking whether NLS is requested
configure:3575: result: yes
configure:3615: checking for msgfmt
configure: trying /usr/bin/msgfmt...
0 translated messages.
configure:3649: result: /usr/bin/msgfmt
configure:3658: checking for gmsgfmt
configure:3681: found /usr/bin/gmsgfmt
configure:3695: result: /usr/bin/gmsgfmt
configure:3740: checking for xgettext
configure: trying /usr/bin/xgettext...
/usr/bin/xgettext: warning: file '/dev/null' extension '' is unknown; will try C
configure:3774: result: /usr/bin/xgettext
configure:3819: checking for msgmerge
configure: trying /usr/bin/msgmerge...
configure:3852: result: /usr/bin/msgmerge
configure:3906: checking whether make supports the include directive
configure:3921: make -f confmf.GNU && cat confinc.out
this is the am__doit target
configure:3924: $? = 0
configure:3943: result: yes (GNU style)
configure:4020: checking for gcc
configure:4041: found /usr/bin/gcc
configure:4053: result: gcc
configure:4412: checking for C compiler version
configure:4421: gcc --version >&5
gcc (Gentoo Hardened 15.2.1_p20260214 p5) 15.2.1 20260214
Copyright (C) 2025 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
configure:4432: $? = 0
configure:4421: gcc -v >&5
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-pc-linux-gnu/15/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-pc-linux-gnu
Configured with: /var/tmp/portage/sys-devel/gcc-15.2.1_p20260214/work/gcc-15-20260214/configure --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --prefix=/usr --bindir=/usr/x86_64-pc-linux-gnu/gcc-bin/15 --includedir=/usr/lib/gcc/x86_64-pc-linux-gnu/15/include --datadir=/usr/share/gcc-data/x86_64-pc-linux-gnu/15 --mandir=/usr/share/gcc-data/x86_64-pc-linux-gnu/15/man --infodir=/usr/share/gcc-data/x86_64-pc-linux-gnu/15/info --with-gxx-include-dir=/usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15 --disable-silent-rules --disable-dependency-tracking --with-python-dir=/share/gcc-data/x86_64-pc-linux-gnu/15/python --enable-objc-gc --enable-languages=c,c++,go,objc,obj-c++,fortran,ada --enable-obsolete --enable-secureplt --disable-werror --with-system-zlib --enable-nls --without-included-gettext --disable-libunwind-exceptions --enable-checking=release --with-bugurl=https://bugs.gentoo.org/ --with-pkgversion='Gentoo Hardened 15.2.1_p20260214 p5' --with-gcc-major-version-only --enable-libstdcxx-time --enable-lto --disable-libstdcxx-pch --enable-linker-build-id --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-multilib --with-multilib-list=m32,m64 --disable-fixed-point --enable-targets=all --enable-offload-defaulted --enable-offload-targets=nvptx-none --enable-libgomp --disable-libssp --enable-libada --enable-cet --disable-systemtap --disable-valgrind-annotations --disable-vtable-verify --disable-libvtv --with-zstd --with-isl --disable-isl-version-check --enable-default-pie --enable-host-pie --enable-host-bind-now --enable-default-ssp --disable-fixincludes --with-gxx-libcxx-include-dir=/usr/include/c++/v1 --with-build-config=bootstrap-cet
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 15.2.1 20260214 (Gentoo Hardened 15.2.1_p20260214 p5)
... rest of stderr output deleted ...
configure:4432: $? = 0
configure:4421: gcc -V >&5
gcc: error: unrecognized command-line option '-V'
gcc: fatal error: no input files
compilation terminated.
configure:4432: $? = 1
configure:4421: gcc -qversion >&5
gcc: error: unrecognized command-line option '-qversion'; did you mean '--version'?
gcc: fatal error: no input files
compilation terminated.
configure:4432: $? = 1
configure:4421: gcc -version >&5
gcc: error: unrecognized command-line option '-version'
gcc: fatal error: no input files
compilation terminated.
configure:4432: $? = 1
configure:4452: checking whether the C compiler works
configure:4474: gcc conftest.c >&5
configure:4478: $? = 0
configure:4529: result: yes
configure:4533: checking for C compiler default output file name
configure:4535: result: a.out
configure:4541: checking for suffix of executables
configure:4548: gcc -o conftest conftest.c >&5
configure:4552: $? = 0
configure:4576: result:
configure:4600: checking whether we are cross compiling
configure:4608: gcc -o conftest conftest.c >&5
configure:4612: $? = 0
configure:4619: ./conftest
configure:4623: $? = 0
configure:4638: result: no
configure:4644: checking for suffix of object files
configure:4667: gcc -c conftest.c >&5
configure:4671: $? = 0
configure:4695: result: o
configure:4699: checking whether the compiler supports GNU C
configure:4719: gcc -c conftest.c >&5
configure:4719: $? = 0
configure:4731: result: yes
configure:4742: checking whether gcc accepts -g
configure:4763: gcc -c -g conftest.c >&5
configure:4763: $? = 0
configure:4810: result: yes
configure:4830: checking for gcc option to enable C11 features
configure:4845: gcc -c -g -O2 conftest.c >&5
configure:4845: $? = 0
configure:4864: result: none needed
configure:4988: checking whether gcc understands -c and -o together
configure:5011: gcc -c conftest.c -o conftest2.o
configure:5014: $? = 0
configure:5011: gcc -c conftest.c -o conftest2.o
configure:5014: $? = 0
configure:5030: result: yes
configure:5049: checking dependency style of gcc
configure:5162: result: gcc3
configure:5183: checking build system type
configure:5199: result: x86_64-pc-linux-gnu
configure:5219: checking host system type
configure:5234: result: x86_64-pc-linux-gnu
configure:5283: checking for ld used by gcc
configure:5413: result: /usr/x86_64-pc-linux-gnu/bin/ld
configure:5420: checking if the linker (/usr/x86_64-pc-linux-gnu/bin/ld) is GNU ld
configure:5437: result: yes
configure:5445: checking for shared library run path origin
configure:5460: result: done
configure:5483: checking 32-bit host C ABI
configure:5550: gcc -c -g -O2 conftest.c >&5
configure:5550: $? = 0
configure:5756: result: no
configure:5766: checking how to run the C preprocessor
configure:5792: gcc -E conftest.c
configure:5792: $? = 0
configure:5808: gcc -E conftest.c
conftest.c:11:10: fatal error: ac_nonexistent.h: No such file or directory
11 | #include <ac_nonexistent.h>
| ^~~~~~~~~~~~~~~~~~
compilation terminated.
configure:5808: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "ipx-utils"
| #define PACKAGE_TARNAME "ipx-utils"
| #define PACKAGE_VERSION "1.4"
| #define PACKAGE_STRING "ipx-utils 1.4"
| #define PACKAGE_BUGREPORT "mario.fetka@disconnected-by-peer.at"
| #define PACKAGE_URL ""
| #define PACKAGE "ipx-utils"
| #define VERSION "1.4"
| /* end confdefs.h. */
| #include <ac_nonexistent.h>
configure:5837: result: gcc -E
configure:5851: gcc -E conftest.c
configure:5851: $? = 0
configure:5867: gcc -E conftest.c
conftest.c:11:10: fatal error: ac_nonexistent.h: No such file or directory
11 | #include <ac_nonexistent.h>
| ^~~~~~~~~~~~~~~~~~
compilation terminated.
configure:5867: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "ipx-utils"
| #define PACKAGE_TARNAME "ipx-utils"
| #define PACKAGE_VERSION "1.4"
| #define PACKAGE_STRING "ipx-utils 1.4"
| #define PACKAGE_BUGREPORT "mario.fetka@disconnected-by-peer.at"
| #define PACKAGE_URL ""
| #define PACKAGE "ipx-utils"
| #define VERSION "1.4"
| /* end confdefs.h. */
| #include <ac_nonexistent.h>
configure:5900: checking for egrep -e
configure:6030: result: /usr/bin/grep -E
configure:6038: checking for ELF binary format
configure:6064: result: yes
configure:6113: checking for the common suffixes of directories in the library search path
configure:6183: result: lib,lib,lib64
configure:6701: checking for CFPreferencesCopyAppValue
configure:6720: gcc -o conftest -g -O2 conftest.c -Wl,-framework -Wl,CoreFoundation >&5
conftest.c:11:10: fatal error: CoreFoundation/CFPreferences.h: No such file or directory
11 | #include <CoreFoundation/CFPreferences.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
configure:6720: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "ipx-utils"
| #define PACKAGE_TARNAME "ipx-utils"
| #define PACKAGE_VERSION "1.4"
| #define PACKAGE_STRING "ipx-utils 1.4"
| #define PACKAGE_BUGREPORT "mario.fetka@disconnected-by-peer.at"
| #define PACKAGE_URL ""
| #define PACKAGE "ipx-utils"
| #define VERSION "1.4"
| /* end confdefs.h. */
| #include <CoreFoundation/CFPreferences.h>
| int
| main (void)
| {
| CFPreferencesCopyAppValue(NULL, NULL)
| ;
| return 0;
| }
configure:6732: result: no
configure:6739: checking for CFLocaleCopyPreferredLanguages
configure:6758: gcc -o conftest -g -O2 conftest.c -Wl,-framework -Wl,CoreFoundation >&5
conftest.c:11:10: fatal error: CoreFoundation/CFLocale.h: No such file or directory
11 | #include <CoreFoundation/CFLocale.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
configure:6758: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "ipx-utils"
| #define PACKAGE_TARNAME "ipx-utils"
| #define PACKAGE_VERSION "1.4"
| #define PACKAGE_STRING "ipx-utils 1.4"
| #define PACKAGE_BUGREPORT "mario.fetka@disconnected-by-peer.at"
| #define PACKAGE_URL ""
| #define PACKAGE "ipx-utils"
| #define VERSION "1.4"
| /* end confdefs.h. */
| #include <CoreFoundation/CFLocale.h>
| int
| main (void)
| {
| CFLocaleCopyPreferredLanguages();
| ;
| return 0;
| }
configure:6770: result: no
configure:6820: checking for GNU gettext in libc
configure:6850: gcc -o conftest -g -O2 conftest.c >&5
configure:6850: $? = 0
configure:6862: result: yes
configure:7758: checking whether to use NLS
configure:7760: result: yes
configure:7763: checking where the gettext function comes from
configure:7774: result: libc
configure:7887: checking for gcc
configure:7920: result: gcc
configure:8279: checking for C compiler version
configure:8288: gcc --version >&5
gcc (Gentoo Hardened 15.2.1_p20260214 p5) 15.2.1 20260214
Copyright (C) 2025 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
configure:8299: $? = 0
configure:8288: gcc -v >&5
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-pc-linux-gnu/15/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-pc-linux-gnu
Configured with: /var/tmp/portage/sys-devel/gcc-15.2.1_p20260214/work/gcc-15-20260214/configure --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --prefix=/usr --bindir=/usr/x86_64-pc-linux-gnu/gcc-bin/15 --includedir=/usr/lib/gcc/x86_64-pc-linux-gnu/15/include --datadir=/usr/share/gcc-data/x86_64-pc-linux-gnu/15 --mandir=/usr/share/gcc-data/x86_64-pc-linux-gnu/15/man --infodir=/usr/share/gcc-data/x86_64-pc-linux-gnu/15/info --with-gxx-include-dir=/usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15 --disable-silent-rules --disable-dependency-tracking --with-python-dir=/share/gcc-data/x86_64-pc-linux-gnu/15/python --enable-objc-gc --enable-languages=c,c++,go,objc,obj-c++,fortran,ada --enable-obsolete --enable-secureplt --disable-werror --with-system-zlib --enable-nls --without-included-gettext --disable-libunwind-exceptions --enable-checking=release --with-bugurl=https://bugs.gentoo.org/ --with-pkgversion='Gentoo Hardened 15.2.1_p20260214 p5' --with-gcc-major-version-only --enable-libstdcxx-time --enable-lto --disable-libstdcxx-pch --enable-linker-build-id --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-multilib --with-multilib-list=m32,m64 --disable-fixed-point --enable-targets=all --enable-offload-defaulted --enable-offload-targets=nvptx-none --enable-libgomp --disable-libssp --enable-libada --enable-cet --disable-systemtap --disable-valgrind-annotations --disable-vtable-verify --disable-libvtv --with-zstd --with-isl --disable-isl-version-check --enable-default-pie --enable-host-pie --enable-host-bind-now --enable-default-ssp --disable-fixincludes --with-gxx-libcxx-include-dir=/usr/include/c++/v1 --with-build-config=bootstrap-cet
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 15.2.1 20260214 (Gentoo Hardened 15.2.1_p20260214 p5)
... rest of stderr output deleted ...
configure:8299: $? = 0
configure:8288: gcc -V >&5
gcc: error: unrecognized command-line option '-V'
gcc: fatal error: no input files
compilation terminated.
configure:8299: $? = 1
configure:8288: gcc -qversion >&5
gcc: error: unrecognized command-line option '-qversion'; did you mean '--version'?
gcc: fatal error: no input files
compilation terminated.
configure:8299: $? = 1
configure:8288: gcc -version >&5
gcc: error: unrecognized command-line option '-version'
gcc: fatal error: no input files
compilation terminated.
configure:8299: $? = 1
configure:8303: checking whether the compiler supports GNU C
configure:8335: result: yes
configure:8346: checking whether gcc accepts -g
configure:8414: result: yes
configure:8434: checking for gcc option to enable C11 features
configure:8468: result: none needed
configure:8592: checking whether gcc understands -c and -o together
configure:8634: result: yes
configure:8653: checking dependency style of gcc
configure:8766: result: gcc3
configure:8786: checking for stdio.h
configure:8786: gcc -c -g -O2 conftest.c >&5
configure:8786: $? = 0
configure:8786: result: yes
configure:8786: checking for stdlib.h
configure:8786: gcc -c -g -O2 conftest.c >&5
configure:8786: $? = 0
configure:8786: result: yes
configure:8786: checking for string.h
configure:8786: gcc -c -g -O2 conftest.c >&5
configure:8786: $? = 0
configure:8786: result: yes
configure:8786: checking for inttypes.h
configure:8786: gcc -c -g -O2 conftest.c >&5
configure:8786: $? = 0
configure:8786: result: yes
configure:8786: checking for stdint.h
configure:8786: gcc -c -g -O2 conftest.c >&5
configure:8786: $? = 0
configure:8786: result: yes
configure:8786: checking for strings.h
configure:8786: gcc -c -g -O2 conftest.c >&5
configure:8786: $? = 0
configure:8786: result: yes
configure:8786: checking for sys/stat.h
configure:8786: gcc -c -g -O2 conftest.c >&5
configure:8786: $? = 0
configure:8786: result: yes
configure:8786: checking for sys/types.h
configure:8786: gcc -c -g -O2 conftest.c >&5
configure:8786: $? = 0
configure:8786: result: yes
configure:8786: checking for unistd.h
configure:8786: gcc -c -g -O2 conftest.c >&5
configure:8786: $? = 0
configure:8786: result: yes
configure:8811: checking for libintl.h
configure:8811: gcc -c -g -O2 conftest.c >&5
configure:8811: $? = 0
configure:8811: result: yes
configure:8817: checking for sys/socket.h
configure:8817: gcc -c -g -O2 conftest.c >&5
configure:8817: $? = 0
configure:8817: result: yes
configure:8823: checking for net/if.h
configure:8823: gcc -c -g -O2 conftest.c >&5
configure:8823: $? = 0
configure:8823: result: yes
configure:8829: checking for net/route.h
configure:8829: gcc -c -g -O2 conftest.c >&5
configure:8829: $? = 0
configure:8829: result: yes
configure:8835: checking for netipx/ipx.h
configure:8835: gcc -c -g -O2 conftest.c >&5
configure:8835: $? = 0
configure:8835: result: yes
configure:8842: checking for library containing gettext
configure:8878: gcc -o conftest -g -O2 conftest.c >&5
conftest.c:39:6: warning: conflicting types for built-in function 'gettext'; expected 'char *(const char *)' [-Wbuiltin-declaration-mismatch]
39 | char gettext (void);
| ^~~~~~~
configure:8878: $? = 0
configure:8900: result: none required
configure:8909: checking for gettext
configure:8909: gcc -o conftest -g -O2 conftest.c >&5
conftest.c:45:6: warning: conflicting types for built-in function 'gettext'; expected 'char *(const char *)' [-Wbuiltin-declaration-mismatch]
45 | char gettext (void);
| ^~~~~~~
configure:8909: $? = 0
configure:8909: result: yes
configure:8915: checking for bindtextdomain
configure:8915: gcc -o conftest -g -O2 conftest.c >&5
configure:8915: $? = 0
configure:8915: result: yes
configure:8921: checking for textdomain
configure:8921: gcc -o conftest -g -O2 conftest.c >&5
configure:8921: $? = 0
configure:8921: result: yes
configure:9044: checking that generated files are newer than configure
configure:9050: result: done
configure:9089: creating ./config.status
## ---------------------- ##
## Running config.status. ##
## ---------------------- ##
This file was extended by ipx-utils config.status 1.4, which was
generated by GNU Autoconf 2.72. Invocation command line was
CONFIG_FILES =
CONFIG_HEADERS =
CONFIG_LINKS =
CONFIG_COMMANDS =
$ ./config.status
on tiulk
config.status:899: creating Makefile
config.status:899: creating ipxripd/Makefile
config.status:899: creating po/Makefile.in
config.status:899: creating config.h
config.status:1080: config.h is unchanged
config.status:1128: executing po-directories commands
config.status:1128: executing depfiles commands
config.status:1314: cd . && sed -e '/# am--include-marker/d' Makefile | make -f - am--depfiles
make: Nothing to be done for 'am--depfiles'.
config.status:1321: $? = 0
config.status:1314: cd ipxripd && sed -e '/# am--include-marker/d' Makefile | make -f - am--depfiles
make: Nothing to be done for 'am--depfiles'.
config.status:1321: $? = 0
## ---------------- ##
## Cache variables. ##
## ---------------- ##
ac_cv_build=x86_64-pc-linux-gnu
ac_cv_c_compiler_gnu=yes
ac_cv_env_CC_set=
ac_cv_env_CC_value=
ac_cv_env_CFLAGS_set=
ac_cv_env_CFLAGS_value=
ac_cv_env_CPPFLAGS_set=
ac_cv_env_CPPFLAGS_value=
ac_cv_env_CPP_set=
ac_cv_env_CPP_value=
ac_cv_env_LDFLAGS_set=
ac_cv_env_LDFLAGS_value=
ac_cv_env_LIBS_set=
ac_cv_env_LIBS_value=
ac_cv_env_build_alias_set=
ac_cv_env_build_alias_value=
ac_cv_env_host_alias_set=
ac_cv_env_host_alias_value=
ac_cv_env_target_alias_set=
ac_cv_env_target_alias_value=
ac_cv_func_bindtextdomain=yes
ac_cv_func_gettext=yes
ac_cv_func_textdomain=yes
ac_cv_header_inttypes_h=yes
ac_cv_header_libintl_h=yes
ac_cv_header_net_if_h=yes
ac_cv_header_net_route_h=yes
ac_cv_header_netipx_ipx_h=yes
ac_cv_header_stdint_h=yes
ac_cv_header_stdio_h=yes
ac_cv_header_stdlib_h=yes
ac_cv_header_string_h=yes
ac_cv_header_strings_h=yes
ac_cv_header_sys_socket_h=yes
ac_cv_header_sys_stat_h=yes
ac_cv_header_sys_types_h=yes
ac_cv_header_unistd_h=yes
ac_cv_host=x86_64-pc-linux-gnu
ac_cv_objext=o
ac_cv_path_EGREP_TRADITIONAL='/usr/bin/grep -E'
ac_cv_path_GMSGFMT=/usr/bin/gmsgfmt
ac_cv_path_MSGFMT=/usr/bin/msgfmt
ac_cv_path_MSGMERGE=/usr/bin/msgmerge
ac_cv_path_SED=/usr/bin/sed
ac_cv_path_XGETTEXT=/usr/bin/xgettext
ac_cv_path_install='/usr/bin/install -c'
ac_cv_path_mkdir=/usr/bin/mkdir
ac_cv_prog_AWK=gawk
ac_cv_prog_CPP='gcc -E'
ac_cv_prog_ac_ct_CC=gcc
ac_cv_prog_cc_c11=
ac_cv_prog_cc_g=yes
ac_cv_prog_cc_stdc=
ac_cv_prog_make_make_set=yes
ac_cv_search_gettext='none required'
acl_cv_hardcode_direct=no
acl_cv_hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
acl_cv_hardcode_libdir_separator=
acl_cv_hardcode_minus_L=no
acl_cv_libdirstems=lib,lib,lib64
acl_cv_libext=a
acl_cv_libname_spec='lib$name'
acl_cv_library_names_spec='$libname$shrext'
acl_cv_path_LD=/usr/x86_64-pc-linux-gnu/bin/ld
acl_cv_prog_gnu_ld=yes
acl_cv_rpath=done
acl_cv_shlibext=so
acl_cv_wl=-Wl,
am_cv_CC_dependencies_compiler_type=gcc3
am_cv_filesystem_timestamp_resolution=0.01
am_cv_make_support_nested_variables=yes
am_cv_prog_cc_c_o=yes
am_cv_prog_tar_ustar=gnutar
am_cv_sleep_fractional_seconds=yes
am_cv_xargs_n_works=yes
gl_cv_elf=yes
gl_cv_host_cpu_c_abi_32bit=no
gt_cv_func_CFLocaleCopyPreferredLanguages=no
gt_cv_func_CFPreferencesCopyAppValue=no
gt_cv_func_gnugettext1_libc=yes
## ----------------- ##
## Output variables. ##
## ----------------- ##
ACLOCAL='${SHELL} '\''/home/mario/mars/ipx-utils/missing'\'' aclocal-1.18'
AMDEPBACKSLASH='\'
AMDEP_FALSE='#'
AMDEP_TRUE=''
AMTAR='$${TAR-tar}'
AM_BACKSLASH='\'
AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
AM_DEFAULT_VERBOSITY='1'
AM_V='$(V)'
AUTOCONF='${SHELL} '\''/home/mario/mars/ipx-utils/missing'\'' autoconf'
AUTOHEADER='${SHELL} '\''/home/mario/mars/ipx-utils/missing'\'' autoheader'
AUTOMAKE='${SHELL} '\''/home/mario/mars/ipx-utils/missing'\'' automake-1.18'
AWK='gawk'
CC='gcc'
CCDEPMODE='depmode=gcc3'
CFLAGS='-g -O2'
CPP='gcc -E'
CPPFLAGS=''
CSCOPE='cscope'
CTAGS='ctags'
CYGPATH_W='echo'
DEFS='-DHAVE_CONFIG_H'
DEPDIR='.deps'
ECHO_C=''
ECHO_N='-n'
ECHO_T=''
ETAGS='etags'
EXEEXT=''
GETTEXT_MACRO_VERSION='0.20'
GMSGFMT='/usr/bin/gmsgfmt'
GMSGFMT_015='/usr/bin/gmsgfmt'
INSTALL_DATA='${INSTALL} -m 644'
INSTALL_PROGRAM='${INSTALL}'
INSTALL_SCRIPT='${INSTALL}'
INSTALL_STRIP_PROGRAM='$(install_sh) -c -s'
INTLLIBS=''
INTL_MACOSX_LIBS=''
LDFLAGS=''
LIBICONV='-liconv'
LIBINTL=''
LIBOBJS=''
LIBS=''
LTLIBICONV='-liconv'
LTLIBINTL=''
LTLIBOBJS=''
MAKEINFO='${SHELL} '\''/home/mario/mars/ipx-utils/missing'\'' makeinfo'
MKDIR_P='/usr/bin/mkdir -p'
MSGFMT='/usr/bin/msgfmt'
MSGMERGE='/usr/bin/msgmerge'
MSGMERGE_FOR_MSGFMT_OPTION='--for-msgfmt'
OBJEXT='o'
PACKAGE='ipx-utils'
PACKAGE_BUGREPORT='mario.fetka@disconnected-by-peer.at'
PACKAGE_NAME='ipx-utils'
PACKAGE_STRING='ipx-utils 1.4'
PACKAGE_TARNAME='ipx-utils'
PACKAGE_URL=''
PACKAGE_VERSION='1.4'
PATH_SEPARATOR=':'
POSUB='po'
SED='/usr/bin/sed'
SET_MAKE=''
SHELL='/bin/sh'
STRIP=''
USE_NLS='yes'
VERSION='1.4'
XGETTEXT='/usr/bin/xgettext'
XGETTEXT_015='/usr/bin/xgettext'
XGETTEXT_EXTRA_OPTIONS=''
ac_ct_CC='gcc'
am__EXEEXT_FALSE=''
am__EXEEXT_TRUE='#'
am__fastdepCC_FALSE='#'
am__fastdepCC_TRUE=''
am__include='include'
am__isrc=''
am__leading_dot='.'
am__nodep='_no'
am__quote=''
am__rm_f_notfound=''
am__tar='tar --format=ustar -chf - "$$tardir"'
am__untar='tar -xf -'
am__xargs_n='xargs -n'
bindir='${exec_prefix}/bin'
build='x86_64-pc-linux-gnu'
build_alias=''
build_cpu='x86_64'
build_os='linux-gnu'
build_vendor='pc'
datadir='${datarootdir}'
datarootdir='${prefix}/share'
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
dvidir='${docdir}'
exec_prefix='${prefix}'
host='x86_64-pc-linux-gnu'
host_alias=''
host_cpu='x86_64'
host_os='linux-gnu'
host_vendor='pc'
htmldir='${docdir}'
includedir='${prefix}/include'
infodir='${datarootdir}/info'
install_sh='${SHELL} /home/mario/mars/ipx-utils/install-sh'
libdir='${exec_prefix}/lib'
libexecdir='${exec_prefix}/libexec'
localedir='${datarootdir}/locale'
localstatedir='${prefix}/var'
mandir='${datarootdir}/man'
mkdir_p='$(MKDIR_P)'
oldincludedir='/usr/include'
pdfdir='${docdir}'
prefix='/usr'
program_transform_name='s,x,x,'
psdir='${docdir}'
runstatedir='${localstatedir}/run'
sbindir='${exec_prefix}/sbin'
sharedstatedir='${prefix}/com'
sysconfdir='${prefix}/etc'
target_alias=''
## ----------- ##
## confdefs.h. ##
## ----------- ##
/* confdefs.h */
#define PACKAGE_NAME "ipx-utils"
#define PACKAGE_TARNAME "ipx-utils"
#define PACKAGE_VERSION "1.4"
#define PACKAGE_STRING "ipx-utils 1.4"
#define PACKAGE_BUGREPORT "mario.fetka@disconnected-by-peer.at"
#define PACKAGE_URL ""
#define PACKAGE "ipx-utils"
#define VERSION "1.4"
#define ENABLE_NLS 1
#define HAVE_GETTEXT 1
#define HAVE_DCGETTEXT 1
#define HAVE_STDIO_H 1
#define HAVE_STDLIB_H 1
#define HAVE_STRING_H 1
#define HAVE_INTTYPES_H 1
#define HAVE_STDINT_H 1
#define HAVE_STRINGS_H 1
#define HAVE_SYS_STAT_H 1
#define HAVE_SYS_TYPES_H 1
#define HAVE_UNISTD_H 1
#define STDC_HEADERS 1
#define HAVE_LIBINTL_H 1
#define HAVE_SYS_SOCKET_H 1
#define HAVE_NET_IF_H 1
#define HAVE_NET_ROUTE_H 1
#define HAVE_NETIPX_IPX_H 1
#define HAVE_GETTEXT 1
#define HAVE_BINDTEXTDOMAIN 1
#define HAVE_TEXTDOMAIN 1
#define LOCALEDIR "${datarootdir}/locale"
configure: exit 0

1347
config.status Executable file

File diff suppressed because it is too large Load Diff

3
configure vendored
View File

@@ -8930,7 +8930,7 @@ fi
printf "%s\n" "#define LOCALEDIR \"${datadir}/locale\"" >>confdefs.h
ac_config_files="$ac_config_files Makefile po/Makefile.in"
ac_config_files="$ac_config_files Makefile ipxripd/Makefile po/Makefile.in"
cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure
@@ -9681,6 +9681,7 @@ do
"po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;;
"depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
"Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
"ipxripd/Makefile") CONFIG_FILES="$CONFIG_FILES ipxripd/Makefile" ;;
"po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
*) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;;

View File

@@ -17,6 +17,7 @@ AC_DEFINE_UNQUOTED([LOCALEDIR], ["${datadir}/locale"], [Define location of messa
AC_CONFIG_FILES([
Makefile
ipxripd/Makefile
po/Makefile.in
])
AC_OUTPUT

10526
configure~ Executable file

File diff suppressed because it is too large Load Diff

339
ipxripd/COPYING Normal file
View File

@@ -0,0 +1,339 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
675 Mass Ave, Cambridge, MA 02139, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) 19yy <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) 19yy name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.

780
ipxripd/Makefile Normal file
View File

@@ -0,0 +1,780 @@
# Makefile.in generated by automake 1.18.1 from Makefile.am.
# ipxripd/Makefile. Generated from Makefile.in by configure.
# Copyright (C) 1994-2025 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
am__is_gnu_make = { \
if test -z '$(MAKELEVEL)'; then \
false; \
elif test -n '$(MAKE_HOST)'; then \
true; \
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
true; \
else \
false; \
fi; \
}
am__make_running_with_option = \
case $${target_option-} in \
?) ;; \
*) echo "am__make_running_with_option: internal error: invalid" \
"target option '$${target_option-}' specified" >&2; \
exit 1;; \
esac; \
has_opt=no; \
sane_makeflags=$$MAKEFLAGS; \
if $(am__is_gnu_make); then \
sane_makeflags=$$MFLAGS; \
else \
case $$MAKEFLAGS in \
*\\[\ \ ]*) \
bs=\\; \
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
esac; \
fi; \
skip_next=no; \
strip_trailopt () \
{ \
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
}; \
for flg in $$sane_makeflags; do \
test $$skip_next = yes && { skip_next=no; continue; }; \
case $$flg in \
*=*|--*) continue;; \
-*I) strip_trailopt 'I'; skip_next=yes;; \
-*I?*) strip_trailopt 'I';; \
-*O) strip_trailopt 'O'; skip_next=yes;; \
-*O?*) strip_trailopt 'O';; \
-*l) strip_trailopt 'l'; skip_next=yes;; \
-*l?*) strip_trailopt 'l';; \
-[dEDm]) skip_next=yes;; \
-[JT]) skip_next=yes;; \
esac; \
case $$flg in \
*$$target_option*) has_opt=yes; break;; \
esac; \
done; \
test $$has_opt = yes
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
am__rm_f = rm -f $(am__rm_f_notfound)
am__rm_rf = rm -rf $(am__rm_f_notfound)
pkgdatadir = $(datadir)/ipx-utils
pkgincludedir = $(includedir)/ipx-utils
pkglibdir = $(libdir)/ipx-utils
pkglibexecdir = $(libexecdir)/ipx-utils
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = x86_64-pc-linux-gnu
host_triplet = x86_64-pc-linux-gnu
sbin_PROGRAMS = ipxd$(EXEEXT)
subdir = ipxripd
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
$(top_srcdir)/m4/host-cpu-c-abi.m4 $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \
$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
$(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
$(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man5dir)" \
"$(DESTDIR)$(man8dir)"
PROGRAMS = $(sbin_PROGRAMS)
am_ipxd_OBJECTS = ipxd.$(OBJEXT) ipxripd.$(OBJEXT) ipxsapd.$(OBJEXT) \
ipxsap.$(OBJEXT) ipxrip.$(OBJEXT) ipxkern.$(OBJEXT) \
ipxutil.$(OBJEXT)
ipxd_OBJECTS = $(am_ipxd_OBJECTS)
ipxd_LDADD = $(LDADD)
AM_V_P = $(am__v_P_$(V))
am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY))
am__v_P_0 = false
am__v_P_1 = :
AM_V_GEN = $(am__v_GEN_$(V))
am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
am__v_GEN_0 = @echo " GEN " $@;
am__v_GEN_1 =
AM_V_at = $(am__v_at_$(V))
am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
am__v_at_0 = @
am__v_at_1 =
DEFAULT_INCLUDES = -I. -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__maybe_remake_depfiles = depfiles
am__depfiles_remade = ./$(DEPDIR)/ipxd.Po ./$(DEPDIR)/ipxkern.Po \
./$(DEPDIR)/ipxrip.Po ./$(DEPDIR)/ipxripd.Po \
./$(DEPDIR)/ipxsap.Po ./$(DEPDIR)/ipxsapd.Po \
./$(DEPDIR)/ipxutil.Po
am__mv = mv -f
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_$(V))
am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
am__v_CC_0 = @echo " CC " $@;
am__v_CC_1 =
CCLD = $(CC)
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_$(V))
am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
am__v_CCLD_0 = @echo " CCLD " $@;
am__v_CCLD_1 =
SOURCES = $(ipxd_SOURCES)
DIST_SOURCES = $(ipxd_SOURCES)
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
*) (install-info --version) >/dev/null 2>&1;; \
esac
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
*) f=$$p;; \
esac;
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
am__install_max = 40
am__nobase_strip_setup = \
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
am__nobase_strip = \
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
am__nobase_list = $(am__nobase_strip_setup); \
for p in $$list; do echo "$$p $$p"; done | \
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
if (++n[$$2] == $(am__install_max)) \
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
END { for (dir in files) print dir, files[dir] }'
am__base_list = \
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
am__uninstall_files_from_dir = { \
{ test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
$(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \
}
man5dir = $(mandir)/man5
man8dir = $(mandir)/man8
NROFF = nroff
MANS = $(man5_MANS) $(man8_MANS)
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
# Read a list of newline-separated strings from the standard input,
# and print each of them once, without duplicates. Input order is
# *not* preserved.
am__uniquify_input = $(AWK) '\
BEGIN { nonempty = 0; } \
{ items[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in items) print i; }; } \
'
# Make sure the list of sources is unique. This is necessary because,
# e.g., the same source file might be shared among _SOURCES variables
# for different programs/libraries.
am__define_uniq_tagged_files = \
list='$(am__tagged_files)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | $(am__uniquify_input)`
am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp COPYING \
README
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = ${SHELL} '/home/mario/mars/ipx-utils/missing' aclocal-1.18
AMTAR = $${TAR-tar}
AM_DEFAULT_VERBOSITY = 1
AUTOCONF = ${SHELL} '/home/mario/mars/ipx-utils/missing' autoconf
AUTOHEADER = ${SHELL} '/home/mario/mars/ipx-utils/missing' autoheader
AUTOMAKE = ${SHELL} '/home/mario/mars/ipx-utils/missing' automake-1.18
AWK = gawk
CC = gcc
CCDEPMODE = depmode=gcc3
CFLAGS = -g -O2
CPP = gcc -E
CPPFLAGS =
CSCOPE = cscope
CTAGS = ctags
CYGPATH_W = echo
DEFS = -DHAVE_CONFIG_H
DEPDIR = .deps
ECHO_C =
ECHO_N = -n
ECHO_T =
ETAGS = etags
EXEEXT =
GETTEXT_MACRO_VERSION = 0.20
GMSGFMT = /usr/bin/gmsgfmt
GMSGFMT_015 = /usr/bin/gmsgfmt
INSTALL = /usr/bin/install -c
INSTALL_DATA = ${INSTALL} -m 644
INSTALL_PROGRAM = ${INSTALL}
INSTALL_SCRIPT = ${INSTALL}
INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
INTLLIBS =
INTL_MACOSX_LIBS =
LDFLAGS =
LIBICONV = -liconv
LIBINTL =
LIBOBJS =
LIBS =
LTLIBICONV = -liconv
LTLIBINTL =
LTLIBOBJS =
MAKEINFO = ${SHELL} '/home/mario/mars/ipx-utils/missing' makeinfo
MKDIR_P = /usr/bin/mkdir -p
MSGFMT = /usr/bin/msgfmt
MSGMERGE = /usr/bin/msgmerge
MSGMERGE_FOR_MSGFMT_OPTION = --for-msgfmt
OBJEXT = o
PACKAGE = ipx-utils
PACKAGE_BUGREPORT = mario.fetka@disconnected-by-peer.at
PACKAGE_NAME = ipx-utils
PACKAGE_STRING = ipx-utils 1.4
PACKAGE_TARNAME = ipx-utils
PACKAGE_URL =
PACKAGE_VERSION = 1.4
PATH_SEPARATOR = :
POSUB = po
SED = /usr/bin/sed
SET_MAKE =
SHELL = /bin/sh
STRIP =
USE_NLS = yes
VERSION = 1.4
XGETTEXT = /usr/bin/xgettext
XGETTEXT_015 = /usr/bin/xgettext
XGETTEXT_EXTRA_OPTIONS =
abs_builddir = /home/mario/mars/ipx-utils/ipxripd
abs_srcdir = /home/mario/mars/ipx-utils/ipxripd
abs_top_builddir = /home/mario/mars/ipx-utils
abs_top_srcdir = /home/mario/mars/ipx-utils
ac_ct_CC = gcc
am__include = include
am__leading_dot = .
am__quote =
am__rm_f_notfound =
am__tar = tar --format=ustar -chf - "$$tardir"
am__untar = tar -xf -
am__xargs_n = xargs -n
bindir = ${exec_prefix}/bin
build = x86_64-pc-linux-gnu
build_alias =
build_cpu = x86_64
build_os = linux-gnu
build_vendor = pc
builddir = .
datadir = ${datarootdir}
datarootdir = ${prefix}/share
docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
dvidir = ${docdir}
exec_prefix = ${prefix}
host = x86_64-pc-linux-gnu
host_alias =
host_cpu = x86_64
host_os = linux-gnu
host_vendor = pc
htmldir = ${docdir}
includedir = ${prefix}/include
infodir = ${datarootdir}/info
install_sh = ${SHELL} /home/mario/mars/ipx-utils/install-sh
libdir = ${exec_prefix}/lib
libexecdir = ${exec_prefix}/libexec
localedir = ${datarootdir}/locale
localstatedir = ${prefix}/var
mandir = ${datarootdir}/man
mkdir_p = $(MKDIR_P)
oldincludedir = /usr/include
pdfdir = ${docdir}
prefix = /usr
program_transform_name = s,x,x,
psdir = ${docdir}
runstatedir = ${localstatedir}/run
sbindir = ${exec_prefix}/sbin
sharedstatedir = ${prefix}/com
srcdir = .
sysconfdir = ${prefix}/etc
target_alias =
top_build_prefix = ../
top_builddir = ..
top_srcdir = ..
AM_CFLAGS = -Wall -Wextra
ipxd_SOURCES = \
ipxd.c \
ipxd.h \
ipxripd.c \
ipxripd.h \
ipxsapd.c \
ipxsapd.h \
ipxsap.c \
ipxsap.h \
ipxrip.c \
ipxrip.h \
ipxkern.c \
ipxkern.h \
ipxutil.c \
ipxutil.h
man8_MANS = ipxd.8
man5_MANS = ipx_ticks.5
EXTRA_DIST = \
README \
COPYING \
ipxripd-0.7.lsm \
ipx_ticks
all: all-am
.SUFFIXES:
.SUFFIXES: .c .o .obj
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
&& { if test -f $@; then exit 0; else break; fi; }; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ipxripd/Makefile'; \
$(am__cd) $(top_srcdir) && \
$(AUTOMAKE) --foreign ipxripd/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(top_srcdir)/configure: $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
install-sbinPROGRAMS: $(sbin_PROGRAMS)
@$(NORMAL_INSTALL)
@list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \
if test -n "$$list"; then \
echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \
$(MKDIR_P) "$(DESTDIR)$(sbindir)" || exit 1; \
fi; \
for p in $$list; do echo "$$p $$p"; done | \
sed 's/$(EXEEXT)$$//' | \
while read p p1; do if test -f $$p \
; then echo "$$p"; echo "$$p"; else :; fi; \
done | \
sed -e 'p;s,.*/,,;n;h' \
-e 's|.*|.|' \
-e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
sed 'N;N;N;s,\n, ,g' | \
$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
{ d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
if ($$2 == $$4) files[d] = files[d] " " $$1; \
else { print "f", $$3 "/" $$4, $$1; } } \
END { for (d in files) print "f", d, files[d] }' | \
while read type dir files; do \
if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
test -z "$$files" || { \
echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \
$(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \
} \
; done
uninstall-sbinPROGRAMS:
@$(NORMAL_UNINSTALL)
@list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \
files=`for p in $$list; do echo "$$p"; done | \
sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
-e 's/$$/$(EXEEXT)/' \
`; \
test -n "$$list" || exit 0; \
echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \
cd "$(DESTDIR)$(sbindir)" && $(am__rm_f) $$files
clean-sbinPROGRAMS:
-$(am__rm_f) $(sbin_PROGRAMS)
ipxd$(EXEEXT): $(ipxd_OBJECTS) $(ipxd_DEPENDENCIES) $(EXTRA_ipxd_DEPENDENCIES)
@rm -f ipxd$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(ipxd_OBJECTS) $(ipxd_LDADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
distclean-compile:
-rm -f *.tab.c
include ./$(DEPDIR)/ipxd.Po # am--include-marker
include ./$(DEPDIR)/ipxkern.Po # am--include-marker
include ./$(DEPDIR)/ipxrip.Po # am--include-marker
include ./$(DEPDIR)/ipxripd.Po # am--include-marker
include ./$(DEPDIR)/ipxsap.Po # am--include-marker
include ./$(DEPDIR)/ipxsapd.Po # am--include-marker
include ./$(DEPDIR)/ipxutil.Po # am--include-marker
$(am__depfiles_remade):
@$(MKDIR_P) $(@D)
@: >>$@
am--depfiles: $(am__depfiles_remade)
.c.o:
$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
$(am__mv) $$depbase.Tpo $$depbase.Po
# $(AM_V_CC)source='$<' object='$@' libtool=no \
# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
# $(AM_V_CC_no)$(COMPILE) -c -o $@ $<
.c.obj:
$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
$(am__mv) $$depbase.Tpo $$depbase.Po
# $(AM_V_CC)source='$<' object='$@' libtool=no \
# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
# $(AM_V_CC_no)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
install-man5: $(man5_MANS)
@$(NORMAL_INSTALL)
@list1='$(man5_MANS)'; \
list2=''; \
test -n "$(man5dir)" \
&& test -n "`echo $$list1$$list2`" \
|| exit 0; \
echo " $(MKDIR_P) '$(DESTDIR)$(man5dir)'"; \
$(MKDIR_P) "$(DESTDIR)$(man5dir)" || exit 1; \
{ for i in $$list1; do echo "$$i"; done; \
if test -n "$$list2"; then \
for i in $$list2; do echo "$$i"; done \
| sed -n '/\.5[a-z]*$$/p'; \
fi; \
} | while read p; do \
if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
echo "$$d$$p"; echo "$$p"; \
done | \
sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
sed 'N;N;s,\n, ,g' | { \
list=; while read file base inst; do \
if test "$$base" = "$$inst"; then list="$$list $$file"; else \
echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \
$(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst" || exit $$?; \
fi; \
done; \
for i in $$list; do echo "$$i"; done | $(am__base_list) | \
while read files; do \
test -z "$$files" || { \
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man5dir)'"; \
$(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \
done; }
uninstall-man5:
@$(NORMAL_UNINSTALL)
@list='$(man5_MANS)'; test -n "$(man5dir)" || exit 0; \
files=`{ for i in $$list; do echo "$$i"; done; \
} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
dir='$(DESTDIR)$(man5dir)'; $(am__uninstall_files_from_dir)
install-man8: $(man8_MANS)
@$(NORMAL_INSTALL)
@list1='$(man8_MANS)'; \
list2=''; \
test -n "$(man8dir)" \
&& test -n "`echo $$list1$$list2`" \
|| exit 0; \
echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \
$(MKDIR_P) "$(DESTDIR)$(man8dir)" || exit 1; \
{ for i in $$list1; do echo "$$i"; done; \
if test -n "$$list2"; then \
for i in $$list2; do echo "$$i"; done \
| sed -n '/\.8[a-z]*$$/p'; \
fi; \
} | while read p; do \
if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
echo "$$d$$p"; echo "$$p"; \
done | \
sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
sed 'N;N;s,\n, ,g' | { \
list=; while read file base inst; do \
if test "$$base" = "$$inst"; then list="$$list $$file"; else \
echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \
$(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst" || exit $$?; \
fi; \
done; \
for i in $$list; do echo "$$i"; done | $(am__base_list) | \
while read files; do \
test -z "$$files" || { \
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man8dir)'"; \
$(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \
done; }
uninstall-man8:
@$(NORMAL_UNINSTALL)
@list='$(man8_MANS)'; test -n "$(man8dir)" || exit 0; \
files=`{ for i in $$list; do echo "$$i"; done; \
} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir)
ID: $(am__tagged_files)
$(am__define_uniq_tagged_files); mkid -fID $$unique
tags: tags-am
TAGS: tags
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
set x; \
here=`pwd`; \
$(am__define_uniq_tagged_files); \
shift; \
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
if test $$# -gt 0; then \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
"$$@" $$unique; \
else \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$unique; \
fi; \
fi
ctags: ctags-am
CTAGS: ctags
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
$(am__define_uniq_tagged_files); \
test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
cscopelist: cscopelist-am
cscopelist-am: $(am__tagged_files)
list='$(am__tagged_files)'; \
case "$(srcdir)" in \
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
*) sdir=$(subdir)/$(srcdir) ;; \
esac; \
for i in $$list; do \
if test -f "$$i"; then \
echo "$(subdir)/$$i"; \
else \
echo "$$sdir/$$i"; \
fi; \
done >> $(top_builddir)/cscope.files
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(BUILT_SOURCES)
$(MAKE) $(AM_MAKEFLAGS) distdir-am
distdir-am: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
list='$(DISTFILES)'; \
dist_files=`for file in $$list; do echo $$file; done | \
sed -e "s|^$$srcdirstrip/||;t" \
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
case $$dist_files in \
*/*) $(MKDIR_P) `echo "$$dist_files" | \
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
sort -u` ;; \
esac; \
for file in $$dist_files; do \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
if test -d $$d/$$file; then \
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
if test -d "$(distdir)/$$file"; then \
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
test -f "$(distdir)/$$file" \
|| cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
check-am: all-am
check: check-am
all-am: Makefile $(PROGRAMS) $(MANS)
installdirs:
for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)"; do \
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
done
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-am
install-strip:
if test -z '$(STRIP)'; then \
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
install; \
else \
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
clean-generic:
distclean-generic:
-$(am__rm_f) $(CONFIG_CLEAN_FILES)
-test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am
distclean: distclean-am
-rm -f ./$(DEPDIR)/ipxd.Po
-rm -f ./$(DEPDIR)/ipxkern.Po
-rm -f ./$(DEPDIR)/ipxrip.Po
-rm -f ./$(DEPDIR)/ipxripd.Po
-rm -f ./$(DEPDIR)/ipxsap.Po
-rm -f ./$(DEPDIR)/ipxsapd.Po
-rm -f ./$(DEPDIR)/ipxutil.Po
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
distclean-tags
dvi: dvi-am
dvi-am:
html: html-am
html-am:
info: info-am
info-am:
install-data-am: install-man
install-dvi: install-dvi-am
install-dvi-am:
install-exec-am: install-sbinPROGRAMS
install-html: install-html-am
install-html-am:
install-info: install-info-am
install-info-am:
install-man: install-man5 install-man8
install-pdf: install-pdf-am
install-pdf-am:
install-ps: install-ps-am
install-ps-am:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -f ./$(DEPDIR)/ipxd.Po
-rm -f ./$(DEPDIR)/ipxkern.Po
-rm -f ./$(DEPDIR)/ipxrip.Po
-rm -f ./$(DEPDIR)/ipxripd.Po
-rm -f ./$(DEPDIR)/ipxsap.Po
-rm -f ./$(DEPDIR)/ipxsapd.Po
-rm -f ./$(DEPDIR)/ipxutil.Po
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-compile mostlyclean-generic
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-man uninstall-sbinPROGRAMS
uninstall-man: uninstall-man5 uninstall-man8
.MAKE: install-am install-strip
.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
clean-generic clean-sbinPROGRAMS cscopelist-am ctags ctags-am \
distclean distclean-compile distclean-generic distclean-tags \
distdir dvi dvi-am html html-am info info-am install \
install-am install-data install-data-am install-dvi \
install-dvi-am install-exec install-exec-am install-html \
install-html-am install-info install-info-am install-man \
install-man5 install-man8 install-pdf install-pdf-am \
install-ps install-ps-am install-sbinPROGRAMS install-strip \
installcheck installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
uninstall-am uninstall-man uninstall-man5 uninstall-man8 \
uninstall-sbinPROGRAMS
.PRECIOUS: Makefile
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
# Tell GNU make to disable its built-in pattern rules.
%:: %,v
%:: RCS/%,v
%:: RCS/%
%:: s.%
%:: SCCS/s.%

28
ipxripd/Makefile.am Normal file
View File

@@ -0,0 +1,28 @@
AM_CFLAGS = -Wall -Wextra
sbin_PROGRAMS = ipxd
ipxd_SOURCES = \
ipxd.c \
ipxd.h \
ipxripd.c \
ipxripd.h \
ipxsapd.c \
ipxsapd.h \
ipxsap.c \
ipxsap.h \
ipxrip.c \
ipxrip.h \
ipxkern.c \
ipxkern.h \
ipxutil.c \
ipxutil.h
man8_MANS = ipxd.8
man5_MANS = ipx_ticks.5
EXTRA_DIST = \
README \
COPYING \
ipxripd-0.7.lsm \
ipx_ticks

780
ipxripd/Makefile.in Normal file
View File

@@ -0,0 +1,780 @@
# Makefile.in generated by automake 1.18.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2025 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
VPATH = @srcdir@
am__is_gnu_make = { \
if test -z '$(MAKELEVEL)'; then \
false; \
elif test -n '$(MAKE_HOST)'; then \
true; \
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
true; \
else \
false; \
fi; \
}
am__make_running_with_option = \
case $${target_option-} in \
?) ;; \
*) echo "am__make_running_with_option: internal error: invalid" \
"target option '$${target_option-}' specified" >&2; \
exit 1;; \
esac; \
has_opt=no; \
sane_makeflags=$$MAKEFLAGS; \
if $(am__is_gnu_make); then \
sane_makeflags=$$MFLAGS; \
else \
case $$MAKEFLAGS in \
*\\[\ \ ]*) \
bs=\\; \
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
esac; \
fi; \
skip_next=no; \
strip_trailopt () \
{ \
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
}; \
for flg in $$sane_makeflags; do \
test $$skip_next = yes && { skip_next=no; continue; }; \
case $$flg in \
*=*|--*) continue;; \
-*I) strip_trailopt 'I'; skip_next=yes;; \
-*I?*) strip_trailopt 'I';; \
-*O) strip_trailopt 'O'; skip_next=yes;; \
-*O?*) strip_trailopt 'O';; \
-*l) strip_trailopt 'l'; skip_next=yes;; \
-*l?*) strip_trailopt 'l';; \
-[dEDm]) skip_next=yes;; \
-[JT]) skip_next=yes;; \
esac; \
case $$flg in \
*$$target_option*) has_opt=yes; break;; \
esac; \
done; \
test $$has_opt = yes
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
am__rm_f = rm -f $(am__rm_f_notfound)
am__rm_rf = rm -rf $(am__rm_f_notfound)
pkgdatadir = $(datadir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkglibexecdir = $(libexecdir)/@PACKAGE@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
sbin_PROGRAMS = ipxd$(EXEEXT)
subdir = ipxripd
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
$(top_srcdir)/m4/host-cpu-c-abi.m4 $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \
$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
$(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
$(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man5dir)" \
"$(DESTDIR)$(man8dir)"
PROGRAMS = $(sbin_PROGRAMS)
am_ipxd_OBJECTS = ipxd.$(OBJEXT) ipxripd.$(OBJEXT) ipxsapd.$(OBJEXT) \
ipxsap.$(OBJEXT) ipxrip.$(OBJEXT) ipxkern.$(OBJEXT) \
ipxutil.$(OBJEXT)
ipxd_OBJECTS = $(am_ipxd_OBJECTS)
ipxd_LDADD = $(LDADD)
AM_V_P = $(am__v_P_@AM_V@)
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
am__v_P_0 = false
am__v_P_1 = :
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
am__v_GEN_0 = @echo " GEN " $@;
am__v_GEN_1 =
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
am__v_at_1 =
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__maybe_remake_depfiles = depfiles
am__depfiles_remade = ./$(DEPDIR)/ipxd.Po ./$(DEPDIR)/ipxkern.Po \
./$(DEPDIR)/ipxrip.Po ./$(DEPDIR)/ipxripd.Po \
./$(DEPDIR)/ipxsap.Po ./$(DEPDIR)/ipxsapd.Po \
./$(DEPDIR)/ipxutil.Po
am__mv = mv -f
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
am__v_CC_0 = @echo " CC " $@;
am__v_CC_1 =
CCLD = $(CC)
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
am__v_CCLD_0 = @echo " CCLD " $@;
am__v_CCLD_1 =
SOURCES = $(ipxd_SOURCES)
DIST_SOURCES = $(ipxd_SOURCES)
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
*) (install-info --version) >/dev/null 2>&1;; \
esac
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
*) f=$$p;; \
esac;
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
am__install_max = 40
am__nobase_strip_setup = \
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
am__nobase_strip = \
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
am__nobase_list = $(am__nobase_strip_setup); \
for p in $$list; do echo "$$p $$p"; done | \
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
if (++n[$$2] == $(am__install_max)) \
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
END { for (dir in files) print dir, files[dir] }'
am__base_list = \
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
am__uninstall_files_from_dir = { \
{ test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
$(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \
}
man5dir = $(mandir)/man5
man8dir = $(mandir)/man8
NROFF = nroff
MANS = $(man5_MANS) $(man8_MANS)
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
# Read a list of newline-separated strings from the standard input,
# and print each of them once, without duplicates. Input order is
# *not* preserved.
am__uniquify_input = $(AWK) '\
BEGIN { nonempty = 0; } \
{ items[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in items) print i; }; } \
'
# Make sure the list of sources is unique. This is necessary because,
# e.g., the same source file might be shared among _SOURCES variables
# for different programs/libraries.
am__define_uniq_tagged_files = \
list='$(am__tagged_files)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | $(am__uniquify_input)`
am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp COPYING \
README
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CSCOPE = @CSCOPE@
CTAGS = @CTAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
ETAGS = @ETAGS@
EXEEXT = @EXEEXT@
GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
GMSGFMT = @GMSGFMT@
GMSGFMT_015 = @GMSGFMT_015@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
INTLLIBS = @INTLLIBS@
INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
LDFLAGS = @LDFLAGS@
LIBICONV = @LIBICONV@
LIBINTL = @LIBINTL@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
MAKEINFO = @MAKEINFO@
MKDIR_P = @MKDIR_P@
MSGFMT = @MSGFMT@
MSGMERGE = @MSGMERGE@
MSGMERGE_FOR_MSGFMT_OPTION = @MSGMERGE_FOR_MSGFMT_OPTION@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
POSUB = @POSUB@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
USE_NLS = @USE_NLS@
VERSION = @VERSION@
XGETTEXT = @XGETTEXT@
XGETTEXT_015 = @XGETTEXT_015@
XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@
ac_ct_CC = @ac_ct_CC@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__rm_f_notfound = @am__rm_f_notfound@
am__tar = @am__tar@
am__untar = @am__untar@
am__xargs_n = @am__xargs_n@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
docdir = @docdir@
dvidir = @dvidir@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
pdfdir = @pdfdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
runstatedir = @runstatedir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
AM_CFLAGS = -Wall -Wextra
ipxd_SOURCES = \
ipxd.c \
ipxd.h \
ipxripd.c \
ipxripd.h \
ipxsapd.c \
ipxsapd.h \
ipxsap.c \
ipxsap.h \
ipxrip.c \
ipxrip.h \
ipxkern.c \
ipxkern.h \
ipxutil.c \
ipxutil.h
man8_MANS = ipxd.8
man5_MANS = ipx_ticks.5
EXTRA_DIST = \
README \
COPYING \
ipxripd-0.7.lsm \
ipx_ticks
all: all-am
.SUFFIXES:
.SUFFIXES: .c .o .obj
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
&& { if test -f $@; then exit 0; else break; fi; }; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ipxripd/Makefile'; \
$(am__cd) $(top_srcdir) && \
$(AUTOMAKE) --foreign ipxripd/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(top_srcdir)/configure: $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
install-sbinPROGRAMS: $(sbin_PROGRAMS)
@$(NORMAL_INSTALL)
@list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \
if test -n "$$list"; then \
echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \
$(MKDIR_P) "$(DESTDIR)$(sbindir)" || exit 1; \
fi; \
for p in $$list; do echo "$$p $$p"; done | \
sed 's/$(EXEEXT)$$//' | \
while read p p1; do if test -f $$p \
; then echo "$$p"; echo "$$p"; else :; fi; \
done | \
sed -e 'p;s,.*/,,;n;h' \
-e 's|.*|.|' \
-e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
sed 'N;N;N;s,\n, ,g' | \
$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
{ d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
if ($$2 == $$4) files[d] = files[d] " " $$1; \
else { print "f", $$3 "/" $$4, $$1; } } \
END { for (d in files) print "f", d, files[d] }' | \
while read type dir files; do \
if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
test -z "$$files" || { \
echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \
$(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \
} \
; done
uninstall-sbinPROGRAMS:
@$(NORMAL_UNINSTALL)
@list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \
files=`for p in $$list; do echo "$$p"; done | \
sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
-e 's/$$/$(EXEEXT)/' \
`; \
test -n "$$list" || exit 0; \
echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \
cd "$(DESTDIR)$(sbindir)" && $(am__rm_f) $$files
clean-sbinPROGRAMS:
-$(am__rm_f) $(sbin_PROGRAMS)
ipxd$(EXEEXT): $(ipxd_OBJECTS) $(ipxd_DEPENDENCIES) $(EXTRA_ipxd_DEPENDENCIES)
@rm -f ipxd$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(ipxd_OBJECTS) $(ipxd_LDADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
distclean-compile:
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipxd.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipxkern.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipxrip.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipxripd.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipxsap.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipxsapd.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipxutil.Po@am__quote@ # am--include-marker
$(am__depfiles_remade):
@$(MKDIR_P) $(@D)
@: >>$@
am--depfiles: $(am__depfiles_remade)
.c.o:
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
.c.obj:
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
install-man5: $(man5_MANS)
@$(NORMAL_INSTALL)
@list1='$(man5_MANS)'; \
list2=''; \
test -n "$(man5dir)" \
&& test -n "`echo $$list1$$list2`" \
|| exit 0; \
echo " $(MKDIR_P) '$(DESTDIR)$(man5dir)'"; \
$(MKDIR_P) "$(DESTDIR)$(man5dir)" || exit 1; \
{ for i in $$list1; do echo "$$i"; done; \
if test -n "$$list2"; then \
for i in $$list2; do echo "$$i"; done \
| sed -n '/\.5[a-z]*$$/p'; \
fi; \
} | while read p; do \
if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
echo "$$d$$p"; echo "$$p"; \
done | \
sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
sed 'N;N;s,\n, ,g' | { \
list=; while read file base inst; do \
if test "$$base" = "$$inst"; then list="$$list $$file"; else \
echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \
$(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst" || exit $$?; \
fi; \
done; \
for i in $$list; do echo "$$i"; done | $(am__base_list) | \
while read files; do \
test -z "$$files" || { \
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man5dir)'"; \
$(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \
done; }
uninstall-man5:
@$(NORMAL_UNINSTALL)
@list='$(man5_MANS)'; test -n "$(man5dir)" || exit 0; \
files=`{ for i in $$list; do echo "$$i"; done; \
} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
dir='$(DESTDIR)$(man5dir)'; $(am__uninstall_files_from_dir)
install-man8: $(man8_MANS)
@$(NORMAL_INSTALL)
@list1='$(man8_MANS)'; \
list2=''; \
test -n "$(man8dir)" \
&& test -n "`echo $$list1$$list2`" \
|| exit 0; \
echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \
$(MKDIR_P) "$(DESTDIR)$(man8dir)" || exit 1; \
{ for i in $$list1; do echo "$$i"; done; \
if test -n "$$list2"; then \
for i in $$list2; do echo "$$i"; done \
| sed -n '/\.8[a-z]*$$/p'; \
fi; \
} | while read p; do \
if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
echo "$$d$$p"; echo "$$p"; \
done | \
sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
sed 'N;N;s,\n, ,g' | { \
list=; while read file base inst; do \
if test "$$base" = "$$inst"; then list="$$list $$file"; else \
echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \
$(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst" || exit $$?; \
fi; \
done; \
for i in $$list; do echo "$$i"; done | $(am__base_list) | \
while read files; do \
test -z "$$files" || { \
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man8dir)'"; \
$(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \
done; }
uninstall-man8:
@$(NORMAL_UNINSTALL)
@list='$(man8_MANS)'; test -n "$(man8dir)" || exit 0; \
files=`{ for i in $$list; do echo "$$i"; done; \
} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir)
ID: $(am__tagged_files)
$(am__define_uniq_tagged_files); mkid -fID $$unique
tags: tags-am
TAGS: tags
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
set x; \
here=`pwd`; \
$(am__define_uniq_tagged_files); \
shift; \
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
if test $$# -gt 0; then \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
"$$@" $$unique; \
else \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$unique; \
fi; \
fi
ctags: ctags-am
CTAGS: ctags
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
$(am__define_uniq_tagged_files); \
test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
cscopelist: cscopelist-am
cscopelist-am: $(am__tagged_files)
list='$(am__tagged_files)'; \
case "$(srcdir)" in \
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
*) sdir=$(subdir)/$(srcdir) ;; \
esac; \
for i in $$list; do \
if test -f "$$i"; then \
echo "$(subdir)/$$i"; \
else \
echo "$$sdir/$$i"; \
fi; \
done >> $(top_builddir)/cscope.files
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(BUILT_SOURCES)
$(MAKE) $(AM_MAKEFLAGS) distdir-am
distdir-am: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
list='$(DISTFILES)'; \
dist_files=`for file in $$list; do echo $$file; done | \
sed -e "s|^$$srcdirstrip/||;t" \
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
case $$dist_files in \
*/*) $(MKDIR_P) `echo "$$dist_files" | \
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
sort -u` ;; \
esac; \
for file in $$dist_files; do \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
if test -d $$d/$$file; then \
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
if test -d "$(distdir)/$$file"; then \
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
test -f "$(distdir)/$$file" \
|| cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
check-am: all-am
check: check-am
all-am: Makefile $(PROGRAMS) $(MANS)
installdirs:
for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)"; do \
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
done
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-am
install-strip:
if test -z '$(STRIP)'; then \
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
install; \
else \
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
clean-generic:
distclean-generic:
-$(am__rm_f) $(CONFIG_CLEAN_FILES)
-test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am
distclean: distclean-am
-rm -f ./$(DEPDIR)/ipxd.Po
-rm -f ./$(DEPDIR)/ipxkern.Po
-rm -f ./$(DEPDIR)/ipxrip.Po
-rm -f ./$(DEPDIR)/ipxripd.Po
-rm -f ./$(DEPDIR)/ipxsap.Po
-rm -f ./$(DEPDIR)/ipxsapd.Po
-rm -f ./$(DEPDIR)/ipxutil.Po
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
distclean-tags
dvi: dvi-am
dvi-am:
html: html-am
html-am:
info: info-am
info-am:
install-data-am: install-man
install-dvi: install-dvi-am
install-dvi-am:
install-exec-am: install-sbinPROGRAMS
install-html: install-html-am
install-html-am:
install-info: install-info-am
install-info-am:
install-man: install-man5 install-man8
install-pdf: install-pdf-am
install-pdf-am:
install-ps: install-ps-am
install-ps-am:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -f ./$(DEPDIR)/ipxd.Po
-rm -f ./$(DEPDIR)/ipxkern.Po
-rm -f ./$(DEPDIR)/ipxrip.Po
-rm -f ./$(DEPDIR)/ipxripd.Po
-rm -f ./$(DEPDIR)/ipxsap.Po
-rm -f ./$(DEPDIR)/ipxsapd.Po
-rm -f ./$(DEPDIR)/ipxutil.Po
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-compile mostlyclean-generic
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-man uninstall-sbinPROGRAMS
uninstall-man: uninstall-man5 uninstall-man8
.MAKE: install-am install-strip
.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
clean-generic clean-sbinPROGRAMS cscopelist-am ctags ctags-am \
distclean distclean-compile distclean-generic distclean-tags \
distdir dvi dvi-am html html-am info info-am install \
install-am install-data install-data-am install-dvi \
install-dvi-am install-exec install-exec-am install-html \
install-html-am install-info install-info-am install-man \
install-man5 install-man8 install-pdf install-pdf-am \
install-ps install-ps-am install-sbinPROGRAMS install-strip \
installcheck installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
uninstall-am uninstall-man uninstall-man5 uninstall-man8 \
uninstall-sbinPROGRAMS
.PRECIOUS: Makefile
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
# Tell GNU make to disable its built-in pattern rules.
%:: %,v
%:: RCS/%,v
%:: RCS/%
%:: s.%
%:: SCCS/s.%

51
ipxripd/README Normal file
View File

@@ -0,0 +1,51 @@
This is my version of an IPX RIP/SAP daemon for Linux. For me, it
works very well with kernel 1.2.13 as well as 1.3.x kernels.
I hope this will eventually provide a stable, standard RIP/SAP daemon
for Linux. Currently (February '96) there is no such program that can
be called a standard one. All programs that I know of either require
kernel patches, do more than just RIP/SAP (such as mars_nwe), or
simply do not implement RIP and SAP correctly. Please forgive me if I
ignored the super ipx-rip/sap daemon I did not find.
I think this release provides some advantages over the other programs,
as it does not require a kernel patch, and it works fine when you
reconfigure your IPX interfaces while ipxd is running. With IPX over
PPP this should make remote access to IPX networks via Linux very
convenient.
Although ipxd does not require a kernel patch, it works fine with the
full internal network, which can be activated since Linux 1.3.60.
INSTALLATION
Simply type 'make' and, as root, 'make install'. This puts the program
ipxd into /usr/sbin/ and the manpages into /usr/man/man5 and
/usr/man/man8.
To start ipxd automatically on system startup, you might want to put
the following lines somewhere into /etc/rc.d/rc.local:
if [ -f /usr/sbin/ipxd ]; then
echo "Starting IPX RIP/SAP daemon"
/usr/sbin/ipxd
fi
You might also want to copy the file ipx_ticks to /etc/ and change it
to reflect your environment.
NOTES
In the file ipx.diff there is a patch for 1.3 kernels that provides a
full internal net with several nodes, but without cross-routing of
packets to the so-called special sockets on the primary net. Sockets
bound on the internal net can request any node number they
like. Currently there's a lot of discussion about this topic on the
linware mailing list.
Volker
<lendecke@namu01.gwdg.de>

5
ipxripd/ipx_ticks Normal file
View File

@@ -0,0 +1,5 @@
# Tick values for IPX interfaces
#
# device name ticks value
eth0 1
ppp0 7

37
ipxripd/ipx_ticks.5 Normal file
View File

@@ -0,0 +1,37 @@
.TH IPX_TICKS 5 "IPX Utilities" "Volker Lendecke"
.SH NAME
ipx_ticks \- Configuration file for ipxd
.SH SYNOPSIS
.B /etc/ipx_ticks
.SH DESCRIPTION
The
.B ipx_ticks
file contains the configuration information required by ipxd, the IPX
RIP/SAP daemon.
The RIP/SAP daemon can find out nearly all information it needs to run
properly by scanning the file /proc/net/ipx_interfaces, and by asking
other routers and servers on the net. The only information it can not
get this way is the time it takes to send a packet over the different
interfaces. This information is required by the IPX RIP protocol. It
is specified in so-called ticks, which is about 55 ms per tick.
The format of this file is very simple. On each line of the file the
tick value for a physical interface is specified. The first field is
the name of the interface, and the ticks value follows after a
white-space. Empty lines as well as lines starting with '#' are
ignored. A possible example is the following:
# Tick values for IPX interfaces
#
# device name ticks value
eth0 1
ppp0 7
The default ticks value for devices not specified in /etc/ipx_ticks is
1.
.SH AUTHOR
Volker Lendecke <lendecke@namu01.gwdg.de>

BIN
ipxripd/ipxd Executable file

Binary file not shown.

89
ipxripd/ipxd.8 Normal file
View File

@@ -0,0 +1,89 @@
.TH IPXD 8 "IPX Utilities" "Volker Lendecke"
.SH NAME
ipxd \- IPX RIP/SAP daemon program
.SH SYNOPSIS
.B ipxd
[
.B -d
] [
.B -p
] [
.B -l
.I log_file
] [
.B -t
.I ticks_file
]
.SH DESCRIPTION
The IPX RIP/SAP daemon
.B ipxd
is invoked at boot time to manage the kernel IPX routing tables.
When ipxd is started, it scans the file /proc/net/ipx_interfaces to
find the ipx networks the computer is directly connected to. It sends
the RIP and SAP response and request packets required by the IPX
router specification v1.20 to the interfaces it found, so that an
initial RIP and SAP table can be built.
During normal operation, ipxd listens on the RIP and SAP ports of each
directly connected interface for broadcasts that other routers on the
network send out, as well as requests issued by workstations. This way
the full router functionality required by the IPX router specification
v1.20 is hopefully implemented.
Every 30 seconds, as well as on request by a HUP signal, the file
/proc/net/ipx_interfaces is re-scanned. Changes in the network
topology are detected this way and broadcasted appropriately. This
could eventually make Linux a quite flexible IPX router.
.SH OPTIONS
.B -d
.RS 3
With option
.B -d,
ipxd does not daemonize itself and logs the IPX traffic it receives
and sends out to the log file.
.RE
.B -p
.RS 3
With option
.B -p,
ipxd works in passive mode. This means it does not output any response
on the net. It does not broadcast its internal tables, and does not
answer requests. This makes it suitable for use in a normal IPX
workstation, which should not act as a router. By starting ipxd in
passive mode, the kernel routing tables are kept up to date. This
means that utilities like slist or nprint do not have to run suid
root, to be able to add IPX routing table entries.
It is not possible to use ipxd in passive mode when you have an
internal net, because other IPX nodes must know how to reach the
internal net. They can only know it if ipxd tells them where the
internal net is.
.RE
.B -l
.I logfile
.RS 3
With this option you can tell ipxd where to put its log output. The
default is /dev/null.
.RE
.B -t
.I ticks_file
.RS 3
With this option you can override the default file name for the ticks
file. The default is /etc/ipx_ticks. See ipx_ticks(5) for more
information.
.SH FILES
/etc/ipx_ticks
.SH SEE ALSO
ipx_ticks(5), ipx_interface(8)
.SH AUTHOR
Volker Lendecke <lendecke@namu01.gwdg.de>

735
ipxripd/ipxd.c Normal file
View File

@@ -0,0 +1,735 @@
/*
IPX routing daemon
Copyright (C) 1996, Volker Lendecke <lendecke@namu01.gwdg.de>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include "ipxd.h"
#include "ipxripd.h"
#include "ipxsapd.h"
#define DEVICE_LENGTH (31)
#define MAX_DEVICE MAX_IFACE
struct ticks_entry {
char device_name[DEVICE_LENGTH+1];
int ticks;
};
static struct ipx_interface ifaces[MAX_IFACE];
int time_since_last_bcast=0;
static struct rip_packet rip_in_buf;
static struct sap_packet sap_in_buf;
static struct ticks_entry ticks_table[MAX_DEVICE];
int ticks_entries=0;
static char default_ticks_file[] = TICKS_FILE;
static char *ticks_file = default_ticks_file;
int passive = 0;
volatile int check_request=0;
static volatile int dump_request=0;
static volatile int timer_request=0;
static volatile int terminate=0;
static volatile int scan_ticks_request=0;
int new_log_entry=1;
int debug_option=0;
FILE *log_file = NULL;
static IPXNet
ifc_net(struct ipx_interface *ifc)
{
return ntohl(ifc->r_output.dest_addr.sipx_network);
}
static void
int_handler(int signo)
{
(void)signo;
signal(SIGINT,int_handler);
dump_request=1;
}
static void
timer_handler(int signo)
{
(void)signo;
signal(SIGALRM,timer_handler);
timer_request=1;
check_request=1;
}
static void
terminate_handler(int signo)
{
(void)signo;
signal(SIGTERM,terminate_handler);
terminate=1;
}
static void
hup_handler(int signo)
{
(void)signo;
signal(SIGHUP,hup_handler);
scan_ticks_request=1;
check_request=1;
}
struct ipx_interface *
first_interface(void)
{
int i = first_ifc_index();
if (i < 0)
{
return NULL;
}
return &(ifaces[i]);
}
struct ipx_interface *
next_interface(struct ipx_interface *ifc)
{
int i = next_ifc_index(ifc_get_index(ifc));
if (i < 0)
{
return NULL;
}
return &(ifaces[i]);
}
int
ifc_get_index(struct ipx_interface *ifc)
{
if (ifc == NULL)
{
return -1;
}
return ifc - ifaces;
}
int
first_ifc_index(void)
{
int i;
for (i = 0; i < MAX_IFACE; i += 1)
{
if (ifaces[i].valid != 0)
{
return i;
}
}
return -1;
}
int
next_ifc_index(int i)
{
if ((i < 0) || (i >= MAX_IFACE-1))
{
return -1;
}
i = i+1;
while (i < MAX_IFACE)
{
if (ifaces[i].valid != 0)
{
return i;
}
i = i+1;
}
return -1;
}
static int
first_free_ifc_index(void)
{
int i;
for (i = 0; i < MAX_IFACE; i += 1)
{
if (ifaces[i].valid == 0)
{
return i;
}
}
return -1;
}
static void
read_ticks_table(void)
{
char buf[512];
char device[512];
int ticks;
FILE *f = fopen(ticks_file, "r");
ticks_entries = 0;
if (f == NULL)
{
return;
}
while (fgets(buf, sizeof(buf), f) != NULL)
{
if ( (strlen(buf) == 0)
|| (buf[0] == '#'))
{
continue;
}
if (sscanf(buf, "%s %d", device, &ticks) != 2)
{
continue;
}
if (strlen(device) > DEVICE_LENGTH)
{
fclose(f);
return;
}
strcpy(ticks_table[ticks_entries].device_name, device);
ticks_table[ticks_entries].ticks = ticks;
ticks_entries += 1;
if (ticks_entries >= MAX_DEVICE)
{
fclose(f);
return;
}
}
fclose(f);
return;
}
int
find_ticks(char *device)
{
int i;
for (i = 0; i < ticks_entries; i += 1)
{
if (strcmp(device, ticks_table[i].device_name) == 0)
{
return ticks_table[i].ticks;
}
}
return DEFAULT_TICKS;
}
static void
dump_ticks(void)
{
int i;
LOG_ENTRY;
LOG_START;
fprintf(log_file, "Ticks table:\n");
for (i = 0; i < ticks_entries; i += 1)
{
fprintf(log_file, "Device: %s, Ticks: %d\n",
ticks_table[i].device_name,
ticks_table[i].ticks);
}
LOG_END;
}
static int
ipx_init_interface(struct ipx_interface *ifc,
IPXNet network, IPXNode node,
char *device, int type, void *data)
{
int result;
ipx_assign_node(ifc->ifnode, node);
ifc->ticks = find_ticks(device);
if ((result = ipx_rip_init_ifc(ifc, network, device, type, data)) != 0)
{
return result;
}
if ((result = ipx_sap_init_ifc(ifc, network, device, type, data)) != 0)
{
return result;
}
ifc->valid = 1;
return 0;
}
static int
ipx_create_ifc(IPXNet network, IPXNode node,
char *device, int type, void *data)
{
struct ipx_interface *ifc = &(ifaces[first_free_ifc_index()]);
int result;
if (ifc == NULL)
{
LOG_START;
fprintf(log_file,"too many interfaces (max. %i)\n",
(int)MAX_IFACE);
LOG_END;
return -1;
}
if (network == 0)
{
LOG_START;
fprintf(log_file,"interface bound to net 0\n");
LOG_END;
return -1;
}
if ( (passive != 0)
&& ((type & IPX_KRT_INTERNAL) != 0))
{
LOG_START;
fprintf(log_file, "passive mode only whithout internal net\n");
LOG_END;
return -1;
}
if ((result = ipx_init_interface(ifc, network, node, device, type,
data)) != 0)
{
return result;
}
return 0;
}
static void
init(void)
{
if (log_file == NULL)
log_file = stderr;
struct itimerval itval;
int i;
LOG_ENTRY;
LOG_START;
fprintf(log_file,"Init start\n");
LOG_END;
read_ticks_table();
for (i = 0; i < MAX_IFACE; i++)
{
ifaces[i].valid = 0;
}
if (ipx_kern_scan_ifaces(ipx_create_ifc, NULL) != 0)
{
exit(1);
}
itval.it_interval.tv_sec = TIMER_RATE;
itval.it_value.tv_sec = TIMER_RATE;
itval.it_interval.tv_usec = 0;
itval.it_value.tv_usec = 0;
if (setitimer(ITIMER_REAL, &itval, (struct itimerval *)NULL) < 0)
{
LOG_START;
fprintf(log_file, "FATAL ERROR: can't set itimer: %s\n",
strerror(errno));
LOG_END;
exit(1);
}
signal(SIGINT,int_handler);
signal(SIGALRM,timer_handler);
signal(SIGTERM,terminate_handler);
signal(SIGHUP,hup_handler);
ipx_rip_initial_broadcasts();
ipx_sap_initial_broadcasts();
LOG_ENTRY;
LOG_START;
fprintf(log_file,"Init end\n");
LOG_END;
}
static int
ipx_visit_ifc(IPXNet network, IPXNode node,
char *device, int type, void *data)
{
struct ipx_interface *ifc;
int result;
if (network == 0)
{
return 0;
}
for (ifc = first_interface();
ifc != NULL;
ifc = next_interface(ifc))
{
if (ifc_net(ifc) == network)
{
ifc->visited = 1;
return 0;
}
}
/* We have a new interface */
ifc = &(ifaces[first_free_ifc_index()]);
if (ifc == NULL)
{
LOG_START;
fprintf(log_file,"too many interfaces (max. %i)\n",
(int)MAX_IFACE);
LOG_END;
return -1;
}
if ((result = ipx_init_interface(ifc, network, node, device, type,
data)) != 0)
{
return result;
}
ipx_rip_initial_broadcast(ifc);
ipx_sap_initial_broadcast(ifc);
ifc->visited = 1;
return 0;
}
static void
ipx_check_interfaces(void)
{
struct ipx_interface *ifc;
for (ifc = first_interface();
ifc != NULL;
ifc = next_interface(ifc))
{
ifc->visited = 0;
}
ipx_kern_scan_ifaces(ipx_visit_ifc, NULL);
for (ifc = first_interface();
ifc != NULL;
ifc = next_interface(ifc))
{
if (ifc->visited == 0)
{
/* Interface is down now */
ipx_sap_down_ifc(ifc);
ipx_rip_down_ifc(ifc);
ifc->valid = 0;
}
}
}
static void
run(void)
{
struct sockaddr_ipx sipx;
socklen_t addr_len=sizeof(sipx);
int size;
fd_set rset;
int result;
int max_sk;
struct ipx_interface *ifc = NULL;
int got_rip, got_sap;
while(1)
{
FD_ZERO(&rset);
max_sk = 0;
got_rip = got_sap = 0;
for (ifc = first_interface();
ifc != NULL;
ifc = next_interface(ifc))
{
if (ifc->r_output.sk > max_sk)
{
max_sk = ifc->r_output.sk;
}
FD_SET(ifc->r_output.sk, &rset);
if (ifc->s_output.sk > max_sk)
{
max_sk = ifc->s_output.sk;
}
FD_SET(ifc->s_output.sk, &rset);
}
LOG_ENTRY;
result = select(max_sk+1, &rset, NULL, NULL, NULL);
if ( (result < 0)
&& (errno != EINTR))
{
LOG_START;
fprintf(log_file, "select error: %s\n",
strerror(errno));
LOG_END;
continue;
}
size = -1;
if (result == 0)
{
LOG_START;
fprintf(log_file, "select timeout expired\n");
LOG_END;
continue;
}
if (result > 0)
{
for (ifc = first_interface();
ifc != NULL;
ifc = next_interface(ifc))
{
if (FD_ISSET(ifc->r_output.sk, &rset))
{
size=recvfrom(ifc->r_output.sk,
&rip_in_buf,
sizeof(rip_in_buf), 0,
(struct sockaddr*)&sipx,
&addr_len);
if (size > 0)
{
got_rip = 1;
}
/* only one packet at a time */
break;
}
if (FD_ISSET(ifc->s_output.sk, &rset))
{
size=recvfrom(ifc->s_output.sk,
&sap_in_buf,
sizeof(sap_in_buf), 0,
(struct sockaddr*)&sipx,
&addr_len);
if (size > 0)
{
got_sap = 1;
}
/* only one packet at a time */
break;
}
}
}
if (size < 0)
{
/* One reason can be an interface that died. */
check_request = 1;
}
if (got_rip != 0)
{
DL_START;
fprintf(log_file,"RIP from: ");
ipx_fprint_saddr(log_file,&sipx);
fprintf(log_file,"\n");
ipx_rip_fdump(log_file, &rip_in_buf, size);
DL_END;
handle_rip(&rip_in_buf, size, &sipx,ifc);
}
if (got_sap != 0)
{
DL_START;
fprintf(log_file,"SAP from: ");
ipx_fprint_saddr(log_file,&sipx);
fprintf(log_file,"\n");
ipx_sap_fdump(log_file, &sap_in_buf, size);
DL_END;
handle_sap(&sap_in_buf, size, &sipx,ifc);
}
if (dump_request)
{
fdump_routes(log_file);
fdump_servers(log_file);
dump_ticks();
dump_request=0;
}
if (timer_request)
{
static int rip_broadcast = 0;
int do_broadcast = 0;
time_since_last_bcast += TIMER_RATE;
if (time_since_last_bcast >= BROADCAST_TIME/2)
{
do_broadcast = 1;
rip_broadcast = (rip_broadcast==0) ? 1 : 0;
time_since_last_bcast -= BROADCAST_TIME/2;
}
LOG_ENTRY;
ipx_rip_do_aging(TIMER_RATE,
(do_broadcast != 0)
&& (rip_broadcast != 0));
LOG_ENTRY;
ipx_sap_do_aging(TIMER_RATE,
(do_broadcast!=0)
&& (rip_broadcast == 0));
timer_request=0;
}
if (check_request)
{
ipx_check_interfaces();
check_request = 0;
}
if (scan_ticks_request)
{
read_ticks_table();
scan_ticks_request = 0;
}
if (terminate)
{
LOG_START;
if (terminate==1)
fprintf(log_file,
"exiting on signal 15 (SIGTERM)\n");
else
fprintf(log_file,
"exiting on signal 1 (SIGHUP)\n");
LOG_END;
return;
}
}
}
static void
help()
{
fprintf(stderr,
"IPX routing daemon v0.91, (c) Ales Dryak, 1995\n"
"Usage: ipxd [options]\n");
}
static int
parse_cmdline(int argc,char** argv)
{
char* log_name = DEFAULT_LOGNAME;
int opt;
while ((opt = getopt(argc, argv, "dt:l:p")) != EOF)
{
switch (opt)
{
case 'd':
debug_option=1;
break;
case 't':
ticks_file = optarg;
break;
case 'l':
log_name = optarg;
break;
case 'p':
passive = 1;
break;
default:
fprintf(stderr,
"Unknown command line option %s\n",*argv);
help();
exit(1);
}
}
if (optind != argc)
{
fprintf(stderr,"Too many parameters");
help();
exit(1);
}
if (debug_option)
{
log_file=stdout;
return 0;
}
if ((log_file=fopen(log_name,"a"))==NULL)
{
perror(log_name);
exit(1);
}
return 1;
}
static void
daemonize()
{
int fd,c;
if ((c = fork()) > 0) exit(0);
if (c < 0)
{
fprintf(stderr, "ipxripd: can't fork: %s\n",strerror(errno));
exit(1);
}
close(0);
close(1);
close(2);
if ((fd = open("/dev/tty", O_RDWR)) >= 0)
{
ioctl(fd, TIOCNOTTY, NULL);
close(fd);
}
}
int
main(int argc,char** argv)
{
if (parse_cmdline(argc,argv))
{
daemonize();
}
init();
run();
ipx_rip_done();
ipx_sap_done();
return 0;
}

84
ipxripd/ipxd.h Normal file
View File

@@ -0,0 +1,84 @@
/*
IPX routing daemon
Copyright (C) 1996, Volker Lendecke <lendecke@namu01.gwdg.de>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef _IPXD_H_
#define _IPXD_H_
#include <stdio.h>
#include <sys/time.h>
#include "ipxutil.h"
#include "ipxkern.h"
#include "ipxsap.h"
#include "ipxrip.h"
#include <time.h>
#define TICKS_FILE ("/etc/ipx_ticks")
#define DEFAULT_TICKS (1)
#define TIMER_RATE (30)
#define EXPIRE_TIME (180)
#define BROADCAST_TIME (60)
#define MAX_IFACE (32)
struct ipx_interface
{
IPXNode ifnode;
int ticks; /* How many ticks does it cost to send
over this interface? */
int valid;
int visited;
struct sap_output s_output;
struct rip_output r_output;
};
extern int new_log_entry;
extern int debug_option;
extern FILE *log_file;
extern int passive;
extern volatile int check_request;
struct ipx_interface *first_interface(void);
struct ipx_interface *next_interface(struct ipx_interface *ifc);
int ifc_get_index(struct ipx_interface *ifc);
int first_ifc_index(void);
int next_ifc_index(int i);
int find_ticks(char *device);
static inline void
print_time()
{
time_t t;
time(&t);
fprintf(log_file,"\n%s",ctime(&t));
}
#define LOG_ENTRY {new_log_entry=1;}
#define LOG_START {if (new_log_entry) {print_time(); new_log_entry=0;}
#define LOG_END fflush(log_file);}
#define DL_ENTRY {if (debug_option) LOG_ENTRY}
#define DL_START {if (debug_option) LOG_START
#define DL_END LOG_END }
#define DEFAULT_LOGNAME "/dev/null"
#endif /* _IPXD_H_ */

232
ipxripd/ipxkern.c Normal file
View File

@@ -0,0 +1,232 @@
/*
IPX support library - kernel dependent functions
Copyright (C) 1994, 1995 Ales Dryak <e-mail: A.Dryak@sh.cvut.cz>
Copyright (C) 1996, Volker Lendecke <lendecke@namu01.gwdg.de>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <errno.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <string.h>
#include <linux/route.h>
#include <netinet/in.h>
#include "ipxkern.h"
#define MAX_IFC (256)
static int
asc2frame(char *frame)
{
if (strcasecmp("etherii", frame) == 0)
return IPX_FRAME_ETHERII;
else if (strcasecmp("802.2", frame) == 0)
return IPX_FRAME_8022;
else if (strcasecmp("802.3", frame) == 0)
return IPX_FRAME_8023;
else if (strcasecmp("snap", frame) == 0)
return IPX_FRAME_SNAP;
else
return 0;
}
int
ipx_kern_scan_rtable(IPXrtScanFunc f, void *data)
{
FILE *ipx_route;
char buf[512];
ipx_route = fopen("/proc/net/ipx_route", "r");
if (ipx_route == NULL)
{
sprintf(ipx_err_string, "open ipx_route: %s",
strerror(errno));
return -1;
}
/* ignore header line */
if (fgets(buf, sizeof(buf), ipx_route) == NULL) {
fclose(ipx_route);
return -1;
}
while (fgets(buf, sizeof(buf), ipx_route) != NULL)
{
IPXNet network;
IPXNet router_net;
IPXNode router_node;
int type = 0;
if (strncmp(&(buf[11]), "Directly", 8) == 0)
{
if (ipx_sscanf_net(buf, &network) != 0)
{
fclose(ipx_route);
return -1;
}
router_net = 0;
memset(router_node, 0, sizeof(router_node));
}
else
{
type |= IPX_KRT_ROUTE;
if ( (ipx_sscanf_net(buf, &network) != 0)
|| (ipx_sscanf_net(&(buf[11]), &router_net) != 0)
|| (ipx_sscanf_node(&(buf[24]), router_node) != 0))
{
fclose(ipx_route);
return -1;
}
}
if (f(network, router_net, router_node, type, data) != 0)
{
fclose(ipx_route);
return 0;
}
}
fclose(ipx_route);
return 1;
}
int
ipx_kern_scan_ifaces(IPXifcScanFunc f, void *data)
{
FILE *ipx_ifc;
char buf[512];
ipx_ifc = fopen("/proc/net/ipx_interface", "r");
if (ipx_ifc == NULL)
{
sprintf(ipx_err_string, "open ipx_interface: %s",
strerror(errno));
return -1;
}
/* ignore header line */
if (fgets(buf, sizeof(buf), ipx_ifc) == NULL) {
fclose(ipx_ifc);
return -1;
}
while (fgets(buf, sizeof(buf), ipx_ifc) != NULL)
{
IPXNet network;
IPXNode node;
int type = 0;
char device[128];
int i;
int result;
type = asc2frame(&(buf[46]));
if (strncmp(&(buf[35]), "Internal", 8) == 0)
{
type |= IPX_KRT_INTERNAL;
}
if ( (ipx_sscanf_net(buf, &network) != 0)
|| (ipx_sscanf_node(&(buf[11]), node) != 0))
{
fclose(ipx_ifc);
return -1;
}
memset(device, 0, sizeof(device));
for (i = 0; (size_t)i < sizeof(device) - 1; i++)
{
if (buf[i+35] == ' ')
{
break;
}
device[i] = buf[i+35];
}
if ((result = f(network, node, device, type, data)) != 0)
{
fclose(ipx_ifc);
return result;
}
}
fclose(ipx_ifc);
return 0;
}
int
ipx_kern_route_add(int sock, IPXNet net, IPXNet rt_net, IPXNode rt_node)
{
struct rtentry rt;
struct sockaddr_ipx* sr;
struct sockaddr_ipx* st;
sr=(struct sockaddr_ipx*)&rt.rt_gateway;
st=(struct sockaddr_ipx*)&rt.rt_dst;
sr->sipx_family=st->sipx_family=AF_IPX;
st->sipx_network=htonl(net);
sr->sipx_network=htonl(rt_net);
ipx_assign_node(sr->sipx_node,rt_node);
rt.rt_flags=RTF_GATEWAY;
if(ioctl(sock,SIOCADDRT,(void *)&rt)!=0)
{
sprintf(ipx_err_string,"ioctl SIOCADDRT: %s",strerror(errno));
return -1;
}
return 0;
}
int
ipx_kern_route_delete(int sock, IPXNet net)
{
struct rtentry rt;
struct sockaddr_ipx* sr;
struct sockaddr_ipx* st;
sr=(struct sockaddr_ipx*)&rt.rt_gateway;
st=(struct sockaddr_ipx*)&rt.rt_dst;
sr->sipx_family=st->sipx_family=AF_IPX;
st->sipx_network=htonl(net);
rt.rt_flags=RTF_GATEWAY;
if(ioctl(sock,SIOCDELRT,(void *)&rt)!=0)
{
sprintf(ipx_err_string,"ioctl SIOCDELRT: %s",strerror(errno));
return -1;
}
return 0;
}
int
ipx_kern_enable_broadcast(int sock)
{
int opt=1;
/* Permit broadcast output */
if(setsockopt(sock,SOL_SOCKET,SO_BROADCAST, &opt,sizeof(opt))==-1)
{
sprintf(ipx_err_string,"setsockopt SO_BROADCAST: %s",
strerror(errno));
return -1;
}
return 0;
}

41
ipxripd/ipxkern.h Normal file
View File

@@ -0,0 +1,41 @@
/*
IPX support library
Copyright (C) 1994, 1995 Ales Dryak <e-mail: A.Dryak@sh.cvut.cz>
Copyright (C) 1996, Volker Lendecke <lendecke@namu01.gwdg.de>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __IPXKERN_H__
#define __IPXKERN_H__
#include "ipxutil.h"
#define IPX_KRT_INTERNAL (1)
#define IPX_KRT_ROUTE (2)
typedef int (*IPXifcScanFunc)(IPXNet,IPXNode,char *,int,void*);
typedef int (*IPXrtScanFunc)(IPXNet,IPXNet,IPXNode,int,void*);
int ipx_kern_enable_broadcast(int sock);
int ipx_kern_route_add(int sock,IPXNet net,IPXNet rt_net,IPXNode rt_node);
int ipx_kern_route_delete(int sock,IPXNet net);
int ipx_kern_scan_ifaces(IPXifcScanFunc f,void* data);
int ipx_kern_scan_rtable(IPXrtScanFunc f,void* data);
#endif /* __IPXKERN_H__ */

204
ipxripd/ipxrip.c Normal file
View File

@@ -0,0 +1,204 @@
/*
IPX support library - RIP
Copyright (C) 1994, 1995 Ales Dryak <e-mail: A.Dryak@sh.cvut.cz>
Copyright (C) 1996, Volker Lendecke <lendecke@namu01.gwdg.de>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <sys/socket.h>
#include <netinet/in.h>
#include "ipxrip.h"
#include "ipxd.h"
int
ipx_rip_size(int n)
{
if ((unsigned int)n > IPX_RIP_MAX_ENTRIES)
{
return 0;
}
return 2 + n * sizeof(struct rip_entry);
}
static int
ipx_rip_sendto(int sock, struct rip_packet *buffer, int size,
struct sockaddr_ipx *daddr)
{
if (ipx_rip_output_func!=NULL)
{
return ipx_rip_output_func(sock, buffer, size, daddr);
}
return 0;
}
int
ipx_rip_output_init(struct rip_output *out, IPXNet net)
{
out->entries=0;
out->send_error = 0;
out->buffer.operation=htons(IPX_RIP_OP_REQUEST);
out->dest_addr.sipx_family=AF_IPX;
out->dest_addr.sipx_type=IPX_RIP_PTYPE;
out->dest_addr.sipx_network=htonl(net);
return 0;
}
void
ipx_rip_output_flush(struct rip_output *out)
{
if (out->entries==0)
{
return;
}
if (out->send_error != 0)
{
out->entries = 0;
return;
}
if (ipx_rip_sendto(out->sk, &(out->buffer), ipx_rip_size(out->entries),
&(out->dest_addr)) < 0)
{
out->send_error = 1;
check_request = 1;
}
out->entries=0;
}
void
ipx_rip_output_request(struct rip_output *out, IPXNet net)
{
struct rip_entry *re;
if ((unsigned int)out->entries >= IPX_RIP_MAX_ENTRIES)
{
ipx_rip_output_flush(out);
}
if (out->buffer.operation!=htons(IPX_RIP_OP_REQUEST))
{
ipx_rip_output_flush(out);
out->buffer.operation=htons(IPX_RIP_OP_REQUEST);
}
re = &(out->buffer.rip_entries[out->entries]);
re->network = htonl(net);
re->hops = 0;
re->ticks = 0;
out->entries += 1;
}
void
ipx_rip_output_response(struct rip_output *out, IPXNet net, hop_t hops,
tick_t ticks, int down_allow)
{
struct rip_entry* re;
if (hops>=IPX_RIP_NET_DOWN && !down_allow)
{
return;
}
if ((unsigned int)out->entries >= IPX_RIP_MAX_ENTRIES)
{
ipx_rip_output_flush(out);
}
if (out->buffer.operation!=htons(IPX_RIP_OP_RESPONSE))
{
ipx_rip_output_flush(out);
out->buffer.operation=htons(IPX_RIP_OP_RESPONSE);
}
if (passive != 0)
{
return;
}
re = &(out->buffer.rip_entries[out->entries]);
re->network = htonl(net);
re->hops = htons(hops);
re->ticks = htons(ticks);
out->entries += 1;
}
void
ipx_rip_output_set_destination(struct rip_output *out, IPXNode node,
IPXPort port)
{
ipx_rip_output_flush(out);
ipx_assign_node(out->dest_addr.sipx_node,node);
out->dest_addr.sipx_port=htons(port);
}
void
ipx_rip_dump(struct rip_packet *pkt, int len)
{
ipx_rip_fdump(stdout, pkt, len);
}
void
ipx_rip_fdump(FILE *file, struct rip_packet *pkt, int len)
{
struct rip_entry *re=pkt->rip_entries;
int ent = (len-2) / sizeof(struct rip_entry);
if (len<2)
{
return;
}
fprintf(file,"Operation: %i size: %i ", ntohs(pkt->operation),len);
switch (ntohs(pkt->operation))
{
case IPX_RIP_OP_REQUEST:
fprintf(file,"(Request)\n");
if (len != ipx_rip_size(ent))
{
fprintf(file,"Warning: Bad RIP size (not 8*n+2)\n");
}
for(; ent > 0; ent -= 1)
{
fprintf(file,"RIP: Network: ");
ipx_fprint_network(file,ntohl(re->network));
fprintf(file,"\n");
re += 1;
}
break;
case IPX_RIP_OP_RESPONSE:
fprintf(file,"(Response)\n");
if (len != ipx_rip_size(ent))
{
fprintf(file,"Warning: Bad RIP size (not 8*n+2)\n");
}
for(; ent > 0; ent -= 1)
{
fprintf(file,"RIP: Network: ");
ipx_fprint_network(file,ntohl(re->network));
fprintf(file," HopCount: %u Ticks: %u\n",
ntohs(re->hops),ntohs(re->ticks));
re += 1;
}
break;
default:
fprintf(file,"(Unknown)\n");
break;
}
}
int (*ipx_rip_output_func)(int, void*, int, struct sockaddr_ipx*)=NULL;

15
ipxripd/ipxripd-0.7.lsm Normal file
View File

@@ -0,0 +1,15 @@
Begin3
Title: ipxripd
Version: 0.7
Entered-date: 09. March 1996
Description: ipxripd is a RIP/SAP daemon program for Linux.
It makes your Linux computer act as an IPX router.
Keywords: ipx rip sap novell netware
Author: A.Dryak@sh.cvut.cz (Ales Dyrak)
lendecke@namu01.gwdg.de (Volker Lendecke)
Maintained-by: lendecke@namu01.gwdg.de (Volker Lendecke)
Primary-site: linux01.gwdg.de:/pub/ncpfs
~28k ipxripd-0.7.tgz
~ 1k ipxripd-0.7.lsm
Copying-policy: GPL
End

843
ipxripd/ipxripd.c Normal file
View File

@@ -0,0 +1,843 @@
/*
IPX routing daemon
Copyright (C) 1994, 1995 Ales Dryak <e-mail: A.Dryak@sh.cvut.cz>
Copyright (C) 1996, Volker Lendecke <lendecke@namu01.gwdg.de>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* done: filter my broadcasts for proper aging */
/* done: age each iface separately */
/* done: DONTROUTE ioctl */
/* done: shutdown */
/* done: logovani ... */
/* done: full daemonize */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netipx/ipx.h>
#include "ipxutil.h"
#include "ipxkern.h"
#include "ipxrip.h"
#include "ipxd.h"
typedef unsigned char ifc_timer;
struct rip_table
{
IPXNet network;
hop_t hops;
tick_t ticks;
IPXNode router_node;
struct ipx_interface *router_interface;
ifc_timer timers[MAX_IFACE]; /* 0<timer<EXPIRE_TIME =>
net is reachable via iface */
/* timer>=EXPIPE_TIME => net is not r. */
struct rip_table* next;
};
struct rip_table *rtable = NULL;
static IPXNet
ifc_net(struct ipx_interface *ifc)
{
return ntohl(ifc->r_output.dest_addr.sipx_network);
}
static IPXNet
rt_net(struct rip_table *rt)
{
return ifc_net(rt->router_interface);
}
/* get some ipx socket */
static int
ipx_socket(void)
{
struct ipx_interface *ifc = first_interface();
if (first_interface() == NULL)
{
LOG_START;
fprintf(log_file, "No ipx socket available\n");
LOG_END;
exit(1);
}
return ifc->r_output.sk;
}
static int
is_expired(ifc_timer* tm)
{
return *tm>=EXPIRE_TIME;
}
/* Do I forward packets targeted to rt->network coming over interface
* ifc?
*/
static int
is_rt_target(struct rip_table *rt, struct ipx_interface *ifc)
{
return is_expired(rt->timers + ifc_get_index(ifc));
}
/* set up the timers in rt so that only ifc is reachable.
*/
static void
setup_timers(struct rip_table* rt, struct ipx_interface* ifc)
{
ifc_timer* tm;
for(tm=rt->timers; tm < rt->timers+MAX_IFACE; tm += 1)
{
*tm=EXPIRE_TIME;
}
rt->timers[ifc_get_index(ifc)]=0;
}
static void
output_flushall()
{
struct ipx_interface *ifc = first_interface();
while (ifc != NULL)
{
ipx_rip_output_flush(&(ifc->r_output));
ifc = next_interface(ifc);
}
}
static void
output_set_destination(struct ipx_interface *ifc,
IPXNode dest_node, IPXPort dest_port)
{
if (ifc == NULL)
{
ifc = first_interface();
while (ifc != NULL)
{
ipx_rip_output_set_destination(&(ifc->r_output),
dest_node, dest_port);
ifc = next_interface(ifc);
}
}
else
{
ipx_rip_output_set_destination(&(ifc->r_output), dest_node,
dest_port);
}
}
/* Broadcast the existence of the route rt to all interfaces through
* which rt's target is not directly reachable.
*/
static void
output_broadcast(struct rip_table *rt, int down_allow)
{
struct ipx_interface *ifc = first_interface();
while (ifc != NULL)
{
if (is_expired(&(rt->timers[ifc_get_index(ifc)])))
{
ipx_rip_output_response(&(ifc->r_output),rt->network,
rt->hops,rt->ticks,down_allow);
}
ifc = next_interface(ifc);
}
}
static int
output_sendto(int sock, void *buffer, int size, struct sockaddr_ipx *daddr)
{
int res;
DL_ENTRY;
DL_START;
fprintf(log_file,"Sending RIP to ");
ipx_fprint_saddr(log_file,daddr);
fprintf(log_file,"\n");
ipx_rip_fdump(log_file,buffer,size);
DL_END;
res=sendto(sock,(void*)buffer,size,0,
(struct sockaddr*)daddr,sizeof(*daddr));
if (res==-1)
{
LOG_START;
fprintf(log_file,"sendto: %s\n",strerror(errno));
LOG_END;
}
return res;
}
static void
fprint_route(FILE *file, struct rip_table *rt)
{
int i;
LOG_START;
fprintf(file,"dst:");
ipx_fprint_network(file,rt->network);
fprintf(file," h:%d t:%d rtr:",rt->hops,rt->ticks);
ipx_fprint_network(file,rt_net(rt));
fprintf(file,":");
ipx_fprint_node(file,rt->router_node);
fprintf(file," ");
for (i = first_ifc_index(); i >= 0; i = next_ifc_index(i))
{
ifc_timer* tm = &(rt->timers[i]);;
fprintf(file,"%i",is_expired(tm)?0:1);
DL_START;
fprintf(file,"(%i)",(int)*tm);
DL_END;
}
LOG_END;
}
void
fdump_routes(FILE *file)
{
struct rip_table *rt;
LOG_START;
fprintf(file,"IPX routing database:\n");
for(rt=rtable; rt!=NULL; rt=rt->next)
{
fprint_route(file,rt);
fprintf(file,"\n");
}
LOG_END;
}
static struct rip_table*
add_route(IPXNet to, hop_t h, tick_t t, struct ipx_interface *ifc,
IPXNode rt_node)
{
struct rip_table *rt;
rt=(struct rip_table*)malloc(sizeof(struct rip_table));
if (rt == NULL)
{
LOG_START;
fprintf(log_file,"ipxripd: out of memory in add_route\n");
LOG_END;
return NULL;
}
rt->network=to;
rt->hops=h;
rt->ticks=t;
rt->router_interface=ifc;
ipx_assign_node(rt->router_node,rt_node);
setup_timers(rt,ifc);
rt->next=rtable;
rtable=rt;
return rt;
}
static void
delete_route(struct rip_table* d)
{
struct rip_table **r;
for(r=&rtable; *r!=NULL; r=&((*r)->next))
{
if (*r==d)
{
*r=d->next;
free(d);
return;
}
}
}
static void
delete_invalid_routes(void)
{
struct rip_table **r = &rtable;
while (*r != NULL)
{
if ((*r)->hops >= IPX_RIP_NET_DOWN)
{
struct rip_table *d = *r;
*r = (*r)->next;
free(d);
}
else
{
r = &((*r)->next);
}
}
}
static void
ipx_rip_rt_add(struct rip_table *rt)
{
if(ipx_kern_route_add(ipx_socket(), rt->network, rt_net(rt),
rt->router_node) < 0)
{
LOG_START;
fprintf(log_file,"Cannot add route to network ");
ipx_fprint_network(log_file,rt->network);
fprintf(log_file,"\n%s\n",ipx_err_string);
LOG_END;
}
}
static void
ipx_rip_rt_del(IPXNet net)
{
if (ipx_kern_route_delete(ipx_socket(), net)<0)
{
LOG_START;
fprintf(log_file,"Cannot delete route to network ");
ipx_fprint_network(log_file,net);
fprintf(log_file,"\n%s\n",ipx_err_string);
LOG_END;
}
}
static void
handle_rip_request(struct rip_entry *re, struct ipx_interface *src_ifc)
{
struct rip_table *cur;
if (re->network==htonl(IPX_RIP_GENERAL_RQ))
{
for(cur=rtable; cur!=NULL; cur=cur->next)
{
if (is_rt_target(cur, src_ifc))
{
ipx_rip_output_response(&(src_ifc->r_output),
cur->network,
cur->hops,
cur->ticks,0);
}
}
}
else
{
for(cur=rtable; cur!=NULL; cur=cur->next)
{
if ( (htonl(re->network)==cur->network)
&& ( (is_rt_target(cur, src_ifc))
|| (ifc_net(src_ifc)==htonl(re->network))))
{
ipx_rip_output_response(&(src_ifc->r_output),
cur->network,
cur->hops,
cur->ticks,0);
}
}
}
}
static void
handle_rip_response(struct rip_entry *re, struct ipx_interface *src_ifc,
IPXNode src_node)
{
struct rip_table *cur;
re->hops=ntohs(re->hops)+1;
re->ticks=ntohs(re->ticks)+src_ifc->ticks;
for(cur=rtable; cur!=NULL; cur=cur->next)
{
if (cur->network != htonl(re->network))
{
continue;
}
if (cur->network==rt_net(cur))
{
/* don't change routes to ifaces */
return;
}
if (re->hops <= IPX_RIP_NET_DOWN)
{
if (!( (re->ticks < cur->ticks)
|| ( (re->ticks == cur->ticks)
&& (re->hops <= cur->hops))))
{
/* route re-> is worse */
return;
}
/* route is at least good as
* existing one */
if ( (re->ticks==cur->ticks)
&& (re->hops==cur->hops))
{
/* new route has the same cost - reset timer*/
if (!( (ifc_net(src_ifc)==rt_net(cur))
&& (!ipx_node_equal(cur->router_node,
src_node))))
{
cur->timers[ifc_get_index(src_ifc)]=0;
}
}
else
{
/* new route is better */
LOG_START;
fprintf(log_file,"CHANGE ");
fprint_route(log_file,cur);
LOG_END;
/* update table */
cur->ticks=re->ticks;
cur->hops=re->hops;
cur->router_interface = src_ifc;
ipx_assign_node(cur->router_node,
src_node);
setup_timers(cur,src_ifc);
LOG_START;
fprintf(log_file,"\nto ");
fprint_route(log_file,cur);
fprintf(log_file,"\n");
LOG_END;
/* update kernel table */
ipx_rip_rt_add(cur);
/* send info bcast */
output_broadcast(cur,0);
}
}
else
{
/* network down response */
if (ifc_net(src_ifc)==rt_net(cur))
{
if (ipx_node_equal(cur->router_node, src_node))
{
LOG_START;
fprintf(log_file,"DELETE ");
fprint_route(log_file,cur);
fprintf(log_file, " (net down)\n");
LOG_END;
/* update kernel table */
ipx_rip_rt_del(cur->network);
/* send info bcast */
cur->hops=IPX_RIP_NET_DOWN;
output_broadcast(cur,1);
/* update table */
delete_route(cur);
}
else
{ /* my router alive */
}
}
else
{
cur->timers[ifc_get_index(src_ifc)]
=EXPIRE_TIME;
}
}
return;
}
if (re->hops<=IPX_RIP_NET_DOWN)
{
struct rip_table *rt=add_route(htonl(re->network),
re->hops,re->ticks,
src_ifc,src_node);
if (rt!=NULL)
{
/* update kernel table */
ipx_rip_rt_add(rt);
/* send info bcast */
output_broadcast(rt,0);
LOG_START;
fprintf(log_file,"ADD ");
fprint_route(log_file,rt);
fprintf(log_file,"\n");
LOG_END;
}
}
}
void
handle_rip(struct rip_packet *pkt, int len, struct sockaddr_ipx* sipx,
struct ipx_interface *src_ifc)
{
struct rip_entry *re=pkt->rip_entries;
int nent=(len-2)/8;
if (ifc_net(src_ifc) != ntohl(sipx->sipx_network))
{
LOG_START;
fprintf(log_file,"RIP from non-local net on ifc ");
ipx_fprint_network(log_file, ifc_net(src_ifc));
fprintf(log_file, "\n");
ipx_fprint_network(log_file,ntohl(sipx->sipx_network));
fprintf(log_file," (ignored)\n");
LOG_END;
return;
}
if (len<ipx_rip_size(1))
{
LOG_START;
fprintf(log_file,
"RIP packet too small len=%i (ignored)\n",len);
LOG_END;
return;
}
if (ipx_rip_size(nent)!=len)
{
LOG_START;
fprintf(log_file,"RIP packet bad size (ignored)\n");
LOG_END;
return;
}
if ( (ipx_node_equal(src_ifc->ifnode,sipx->sipx_node))
&& ((unsigned short)sipx->sipx_port==htons(IPX_RIP_PORT)))
{
DL_START;
fprintf(log_file,"My packet (ignored)\n");
DL_END;
return;
}
switch (ntohs(pkt->operation))
{
case IPX_RIP_OP_REQUEST:
output_set_destination(src_ifc, sipx->sipx_node,
ntohs(sipx->sipx_port));
for(;nent--;re++)
{
handle_rip_request(re, src_ifc);
}
ipx_rip_output_flush(&(src_ifc->r_output));
output_set_destination(src_ifc, IPX_BROADCAST, IPX_RIP_PORT);
break;
case IPX_RIP_OP_RESPONSE:
/* option: ignore responses from non RIP ports
* if (sipx->sipx_port!=htons(IPX_RIP_PORT)) return;
*/
output_set_destination(NULL, IPX_BROADCAST, IPX_RIP_PORT);
for(;nent--;re++)
{
handle_rip_response(re, src_ifc, sipx->sipx_node);
}
output_flushall();
break;
default:
LOG_START;
fprintf(log_file,"Unknown RIP operation\n");
LOG_END;
break;
}
}
void
ipx_rip_do_aging(int rate, int do_broadcast)
{
struct rip_table *cur;
int routes_died = 0;
DL_START;
fprintf(log_file,"DO RIP AGING\n");
DL_END;
output_set_destination(NULL, IPX_BROADCAST, IPX_RIP_PORT);
for(cur=rtable; cur!=NULL; cur=cur->next)
{
int i;
ifc_timer* tm;
for (i = first_ifc_index(); i >= 0; i = next_ifc_index(i))
{
tm = &(cur->timers[i]);
if (!is_expired(tm))
{
(*tm)+=rate;
}
}
tm=cur->timers+ifc_get_index(cur->router_interface);
/* cannot timeout iface !*/
if (cur->network==rt_net(cur))
{
*tm=0;
}
if (is_expired(tm))
{
/* net is down */
LOG_START;
fprintf(log_file,"DELETE ");
fprint_route(log_file,cur);
fprintf(log_file," (timed out)\n");
LOG_END;
/* update kernel table */
ipx_rip_rt_del(cur->network);
/* send info bcast */
cur->hops=IPX_RIP_NET_DOWN;
output_broadcast(cur,1);
/* table to be updated, delayed */
routes_died = 1;
}
else
{
if (do_broadcast)
{
output_broadcast(cur,0);
}
}
}
output_flushall();
/* Delete all bogus routes */
if (routes_died != 0)
{
delete_invalid_routes();
}
}
int
ipx_rip_init_ifc(struct ipx_interface *ifc, IPXNet network,
char *device, int type, void *data)
{
(void)type;
(void)data;
struct sockaddr_ipx sipx;
if (ipx_rip_output_init(&(ifc->r_output), network) != 0)
{
LOG_START;
fprintf(log_file,
"out of memory allocating output buffer\n");
LOG_END;
return -1;
}
if (add_route(network,1,find_ticks(device),ifc,ifc->ifnode) == NULL)
{
LOG_START;
fprintf(log_file,
"cannot add route to iface (out of memory)\n");
LOG_END;
return -1;
}
if ((ifc->r_output.sk = socket(AF_IPX, SOCK_DGRAM, PF_IPX)) < 0)
{
LOG_START;
fprintf(log_file,
"can't open socket: %s\n", strerror(errno));
LOG_END;
return -1;
}
memset(&sipx, 0, sizeof(sipx));
sipx.sipx_family = AF_IPX;
sipx.sipx_network = htonl(network);
ipx_assign_node(sipx.sipx_node, IPX_THIS_NODE);
sipx.sipx_port = htons(IPX_RIP_PORT);
sipx.sipx_type = IPX_RIP_PTYPE;
if (bind(ifc->r_output.sk, (struct sockaddr *)&sipx, sizeof(sipx)) < 0)
{
LOG_START;
fprintf(log_file, "can't bind socket: %s\n",
strerror(errno));
LOG_END;
return -1;
}
if (ipx_kern_enable_broadcast(ifc->r_output.sk) != 0)
{
LOG_START;
fprintf(log_file, "cant' enable broadcast\n");
LOG_END;
return -1;
}
LOG_START;
ipx_fprint_network(log_file, network);
fprintf(log_file,":");
ipx_fprint_node(log_file, ifc->ifnode);
fprintf(log_file,"\n");
LOG_END;
return 0;
}
static void
ipx_rip_deinit_ifc(struct ipx_interface *ifc)
{
close(ifc->r_output.sk);
}
static int
ipx_rip_del_old_rt(IPXNet net, IPXNet rt_net, IPXNode node,
int type, void *data)
{
(void)rt_net;
(void)node;
(void)data;
if ((type & IPX_KRT_ROUTE) != 0)
{
/* remove old routes */
ipx_rip_rt_del(net);
}
return 0;
}
void
ipx_rip_del_old_routes(void)
{
ipx_kern_scan_rtable(ipx_rip_del_old_rt, NULL);
}
void
ipx_rip_initial_broadcasts(void)
{
struct rip_table* rt;
struct ipx_interface* ifc;
ipx_rip_output_func=output_sendto;
output_set_destination(NULL, IPX_BROADCAST, IPX_RIP_PORT);
for(rt=rtable;rt!=NULL;rt=rt->next)
{
output_broadcast(rt,0);
}
output_flushall();
ifc = first_interface();
while (ifc != NULL)
{
ipx_rip_output_request(&(ifc->r_output),
IPX_RIP_GENERAL_RQ);
ifc = next_interface(ifc);
}
output_flushall();
}
void
ipx_rip_initial_broadcast(struct ipx_interface *ifc)
{
struct rip_table *cur;
output_set_destination(ifc, IPX_BROADCAST, IPX_RIP_PORT);
for(cur=rtable; cur!=NULL; cur=cur->next)
{
if (is_rt_target(cur, ifc))
{
ipx_rip_output_response(&(ifc->r_output),
cur->network,
cur->hops,
cur->ticks,0);
}
if (cur->router_interface == ifc)
{
output_broadcast(cur, 0);
}
}
ipx_rip_output_request(&(ifc->r_output), IPX_RIP_GENERAL_RQ);
output_flushall();
}
void
ipx_rip_down_ifc(struct ipx_interface *ifc)
{
struct rip_table *rt;
LOG_ENTRY;
LOG_START;
fprintf(log_file, "RIP DOWN INTERFACE ");
ipx_fprint_network(log_file, ifc_net(ifc));
fprintf(log_file, "\n");
LOG_END;
for (rt = rtable; rt != NULL; rt = rt->next)
{
if (rt->router_interface != ifc)
{
/* rt is not via ifc */
continue;
}
/* cur is via ifc, so down it */
LOG_START;
fprintf(log_file,"DELETE ");
fprint_route(log_file,rt);
fprintf(log_file, " (ifc down)\n");
LOG_END;
/* Update of kernel table unneccessary */
/* send info bcast */
rt->hops=IPX_RIP_NET_DOWN;
output_broadcast(rt,1);
}
output_flushall();
delete_invalid_routes();
ipx_rip_deinit_ifc(ifc);
}
void
ipx_rip_done(void)
{
struct rip_table* cur;
LOG_ENTRY;
LOG_START;
fprintf(log_file,"RIP Shutdown start\n");
LOG_END;
output_set_destination(NULL, IPX_BROADCAST, IPX_RIP_PORT);
for(cur=rtable; cur!=NULL; cur=cur->next)
{
/* update kernel table (don't delete ifaces)*/
if (cur->network != rt_net(cur))
{
ipx_rip_rt_del(cur->network);
LOG_START
fprintf(log_file,"DELETE ");
fprint_route(log_file,cur);
fprintf(log_file," (shutdown)\n");
LOG_END
}
/* send info bcast */
cur->hops=IPX_RIP_NET_DOWN;
output_broadcast(cur,1);
/* update table */
delete_route(cur);
}
output_flushall();
LOG_ENTRY;
LOG_START;
fprintf(log_file,"RIP Shutdown end\n");
LOG_END;
}

51
ipxripd/ipxripd.h Normal file
View File

@@ -0,0 +1,51 @@
/*
IPX routing daemon
Copyright (C) 1996, Volker Lendecke <lendecke@namu01.gwdg.de>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef _IPXRIPD_H_
#define _IPXRIPD_H_
void
fdump_routes(FILE *file);
void
handle_rip(struct rip_packet *pkt, int len, struct sockaddr_ipx* sipx,
struct ipx_interface *src_ifc);
void
ipx_rip_do_aging(int rate, int do_broadcast);
int
ipx_rip_init_ifc(struct ipx_interface *ifc, IPXNet network,
char *device, int type, void *data);
void
ipx_rip_done(void);
void
ipx_rip_initial_broadcasts(void);
void
ipx_rip_initial_broadcast(struct ipx_interface *ifc);
void
ipx_rip_down_ifc(struct ipx_interface *ifc);
#endif /* _IPXRIPD_H_ */

314
ipxripd/ipxsap.c Normal file
View File

@@ -0,0 +1,314 @@
/*
IPX support library - SAP
Copyright (C) 1994, 1995 Ales Dryak <e-mail: A.Dryak@sh.cvut.cz>
Copyright (C) 1996, Volker Lendecke <lendecke@namu01.gwdg.de>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include "ipxsap.h"
#include "ipxd.h"
int
ipx_sap_size(int n, unsigned short int operation)
{
if (n <= 0)
{
return 0;
}
switch (operation)
{
case IPX_SAP_OP_REQUEST:
return n == 1 ? IPX_SAP_REQUEST_LEN : 0;
case IPX_SAP_OP_RESPONSE:
if ((unsigned int)n > IPX_SAP_MAX_ENTRIES)
{
return 0;
}
return (2 + n * sizeof(struct sap_entry));
case IPX_SAP_OP_GNS_REQUEST:
return n == 1 ? IPX_SAP_REQUEST_LEN : 0;
case IPX_SAP_OP_GNS_RESPONSE:
return n == 1 ? 2 + sizeof(struct sap_entry) : 0;
break;
default:
return 0;
}
}
void
ipx_sap_assign_ser_name(ser_name_t dest, ser_name_t src)
{
memset(dest, 0, IPX_SAP_SERVER_NAME_LEN);
strncpy(dest, src, IPX_SAP_SERVER_NAME_LEN);
}
int
ipx_sap_name_equal(ser_name_t n1, ser_name_t n2)
{
return strncmp(n1, n2, IPX_SAP_SERVER_NAME_LEN) == 0;
}
int
ipx_sap_type_equal(ser_type_t t1, ser_type_t t2)
{
return t1==IPX_SAP_GENERAL_RQ || t2==IPX_SAP_GENERAL_RQ || t1 == t2;
}
static int
ipx_sap_sendto(int sock, void *buffer, int size, struct sockaddr_ipx *daddr)
{
if (ipx_sap_output_func != NULL)
{
return ipx_sap_output_func(sock, buffer, size, daddr);
}
return 0;
}
int
ipx_sap_output_init(struct sap_output *out, IPXNet net)
{
out->entries = 0;
out->send_error = 0;
out->buffer.operation = htons(IPX_SAP_OP_REQUEST);
out->dest_addr.sipx_family = AF_IPX;
out->dest_addr.sipx_type = IPX_SAP_PTYPE;
out->dest_addr.sipx_network = htonl(net);
return 0;
}
void
ipx_sap_output_flush(struct sap_output * out)
{
if (out->entries == 0)
{
return;
}
if (out->send_error != 0)
{
out->entries = 0;
return;
}
if (ipx_sap_sendto(out->sk, &(out->buffer),
ipx_sap_size(out->entries,
ntohs(out->buffer.operation)),
&(out->dest_addr)) < 0)
{
out->send_error = 1;
check_request = 1;
}
out->entries = 0;
}
void
ipx_sap_output_request(struct sap_output * out, ser_type_t ser_type)
{
struct sap_entry *se;
ipx_sap_output_flush(out);
out->buffer.operation = htons(IPX_SAP_OP_REQUEST);
se = &(out->buffer.sap_entries[out->entries]);
se->ser_type = htons(ser_type);
out->entries++;
}
void
ipx_sap_output_gns_request(struct sap_output * out, ser_type_t ser_type)
{
struct sap_entry *se;
ipx_sap_output_flush(out);
out->buffer.operation = htons(IPX_SAP_OP_GNS_REQUEST);
se = &(out->buffer.sap_entries[out->entries]);
se->ser_type = htons(ser_type);
out->entries++;
}
void
ipx_sap_output_response(struct sap_output * out, ser_type_t type,
ser_name_t name, struct sockaddr_ipx *addr,
hop_t hops, int down_allow)
{
struct sap_entry *se;
if (hops >= IPX_SAP_SERVER_DOWN && !down_allow)
{
return;
}
if ((unsigned int)out->entries >= IPX_SAP_MAX_ENTRIES)
{
ipx_sap_output_flush(out);
}
if (out->buffer.operation != htons(IPX_SAP_OP_RESPONSE))
{
ipx_sap_output_flush(out);
out->buffer.operation = htons(IPX_SAP_OP_RESPONSE);
}
if (passive != 0)
{
return;
}
se = &(out->buffer.sap_entries[out->entries]);
se->ser_type = htons(type);
ipx_sap_assign_ser_name(se->ser_name, name);
se->network = addr->sipx_network;
ipx_assign_node(se->node, addr->sipx_node);
se->port = addr->sipx_port;
se->hops = htons(hops);
out->entries++;
}
void
ipx_sap_output_gns_response(struct sap_output * out,
ser_type_t type, ser_name_t name,
struct sockaddr_ipx *addr, hop_t hops)
{
struct sap_entry *se;
if (hops >= IPX_SAP_SERVER_DOWN)
{
return;
}
ipx_sap_output_flush(out);
if (passive != 0)
{
return;
}
out->buffer.operation = htons(IPX_SAP_OP_GNS_RESPONSE);
se = &(out->buffer.sap_entries[out->entries]);
se->ser_type = htons(type);
ipx_sap_assign_ser_name(se->ser_name, name);
se->network = addr->sipx_network;
ipx_assign_node(se->node, addr->sipx_node);
se->port = addr->sipx_port;
se->hops = htons(hops);
out->entries++;
}
void
ipx_sap_output_set_destination(struct sap_output * out,
IPXNode node, IPXPort port)
{
ipx_sap_output_flush(out);
ipx_assign_node(out->dest_addr.sipx_node, node);
out->dest_addr.sipx_port = htons(port);
}
void
ipx_sap_fprint_name(FILE * file, ser_name_t sname)
{
char name[IPX_SAP_SERVER_NAME_LEN + 1];
int len;
memcpy(name, sname, IPX_SAP_SERVER_NAME_LEN);
name[IPX_SAP_SERVER_NAME_LEN] = 0;
len = strlen(name);
memset(name + len, ' ', IPX_SAP_SERVER_NAME_LEN - len);
fprintf(file, name);
}
static void
fprint_entry(FILE * file, struct sap_entry *se)
{
fprintf(file, "SAP: type: %04X name: ", ntohs(se->ser_type));
ipx_sap_fprint_name(file, se->ser_name);
fprintf(file, " \nhops: %i addr: ", ntohs(se->hops));
ipx_fprint_network(file, ntohl(se->network));
fprintf(file, ":");
ipx_fprint_node(file, se->node);
fprintf(file, ":");
ipx_fprint_port(file, ntohs(se->port));
fprintf(file, "\n");
}
void
ipx_sap_dump(struct sap_packet *pkt, int len)
{
ipx_sap_fdump(stdout, pkt, len);
}
void
ipx_sap_fdump(FILE * file, struct sap_packet *pkt, int len)
{
int ent;
struct sap_entry *se = pkt->sap_entries;
if (len < 2)
{
return;
}
fprintf(file, "Operation: %i size: %i ", ntohs(pkt->operation), len);
switch (ntohs(pkt->operation))
{
case IPX_SAP_OP_REQUEST:
fprintf(file, "(Request)\n");
if (ipx_sap_size(1, IPX_SAP_OP_REQUEST) != len)
{
fprintf(file, "Warning: Bad SAP size\n");
}
fprintf(file, "SAP: Type: %04X\n", ntohs(se->ser_type));
break;
case IPX_SAP_OP_GNS_REQUEST:
fprintf(file, "(Get Nearest Server Request)\n");
if (ipx_sap_size(1, IPX_SAP_OP_GNS_REQUEST) != len)
{
fprintf(file, "Warning: Bad SAP size\n");
}
fprintf(file, "SAP: Type: %04X\n", ntohs(se->ser_type));
break;
case IPX_SAP_OP_RESPONSE:
fprintf(file, "(Response)\n");
ent = (len - 2) / sizeof(struct sap_entry);
if (ipx_sap_size(ent, IPX_SAP_OP_RESPONSE) != len)
{
fprintf(file, "Warning: Bad SAP size\n");
}
for (; ent--; se++)
{
fprint_entry(file, se);
}
break;
case IPX_SAP_OP_GNS_RESPONSE:
fprintf(file, "(Get Nearest Server Response)\n");
if (ipx_sap_size(1, IPX_SAP_OP_RESPONSE) != len)
{
fprintf(file, "Warning: Bad SAP size\n");
}
fprint_entry(file, se);
break;
default:
fprintf(file, "(Unknown)\n");
break;
}
}
int (*ipx_sap_output_func) (int sock, void *, int, struct sockaddr_ipx *)
= NULL;

746
ipxripd/ipxsapd.c Normal file
View File

@@ -0,0 +1,746 @@
/*
IPX service advertising daemon
Copyright (C) 1994, 1995 Ales Dryak <e-mail: A.Dryak@sh.cvut.cz>
Copyright (C) 1996, Volker Lendecke <lendecke@namu01.gwdg.de>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netipx/ipx.h>
#include "ipxutil.h"
#include "ipxkern.h"
#include "ipxsap.h"
#include "ipxd.h"
typedef unsigned char ifc_timer;
struct sap_table
{
ser_name_t name;
ser_type_t type;
hop_t hops;
struct sockaddr_ipx addr;
ifc_timer timers[MAX_IFACE]; /* 0<timer<EXPIRE_TIME => net is
reachable via iface */
/* timer>=EXPIPE_TIME => net is not r. */
struct sap_table *next;
};
struct sap_table *stable = NULL;
static IPXNet
ifc_net(struct ipx_interface *ifc)
{
return ntohl(ifc->s_output.dest_addr.sipx_network);
}
static int
is_expired(ifc_timer * tm)
{
return *tm >= EXPIRE_TIME;
}
static void
setup_timers(struct sap_table *rt, struct ipx_interface *ifc)
{
ifc_timer *tm;
for (tm = rt->timers; tm < rt->timers + MAX_IFACE; tm++)
{
*tm = EXPIRE_TIME;
}
rt->timers[ifc_get_index(ifc)] = 0;
}
static void
output_flushall()
{
struct ipx_interface *ifc = first_interface();
while (ifc != NULL)
{
ipx_sap_output_flush(&(ifc->s_output));
ifc = next_interface(ifc);
}
}
static void
output_set_destination(struct ipx_interface *ifc,
IPXNode dest_node, IPXPort dest_port)
{
if (ifc == NULL)
{
ifc = first_interface();
while (ifc != NULL)
{
ipx_sap_output_set_destination(&(ifc->s_output),
dest_node, dest_port);
ifc = next_interface(ifc);
}
}
else
{
ipx_sap_output_set_destination(&(ifc->s_output), dest_node,
dest_port);
}
}
static void
output_broadcast(struct sap_table *st, int down_allow)
{
struct ipx_interface *ifc = first_interface();
while (ifc != NULL)
{
if (is_expired(&(st->timers[ifc_get_index(ifc)])))
{
ipx_sap_output_response(&(ifc->s_output),
st->type, st->name,
&(st->addr),
st->hops, down_allow);
}
ifc = next_interface(ifc);
}
}
static int
output_sendto(int sock, void *buffer, int size, struct sockaddr_ipx *daddr)
{
int res;
DL_ENTRY;
DL_START;
fprintf(log_file, "Sending SAP to ");
ipx_fprint_saddr(log_file, daddr);
fprintf(log_file, "\n");
ipx_sap_fdump(log_file, buffer, size);
DL_END;
res = sendto(sock, (void *) buffer, size, 0,
(struct sockaddr *) daddr, sizeof(*daddr));
if (res == -1)
{
LOG_START;
fprintf(log_file, "sendto: %s\n", strerror(errno));
LOG_END;
}
return res;
}
static void
fprint_server(FILE * file, struct sap_table *st)
{
int i;
LOG_START;
fprintf(file, "SAP: type: %04X name: ", st->type);
ipx_sap_fprint_name(file, st->name);
fprintf(file, " \nhops: %i addr: ", st->hops);
ipx_fprint_saddr(file, &(st->addr));
fprintf(file, " ");
for (i = first_ifc_index(); i >= 0; i = next_ifc_index(i))
{
ifc_timer *tm = &(st->timers[i]);
fprintf(file, "%i", is_expired(tm) ? 0 : 1);
DL_START;
fprintf(file, "(%i)", (int) *tm);
DL_END;
}
LOG_END;
}
void
fdump_servers(FILE * file)
{
struct sap_table *st;
LOG_START;
fprintf(file, "IPX server database:\n");
for (st = stable; st != NULL; st = st->next)
{
fprint_server(file, st);
fprintf(file, "\n");
}
LOG_END;
}
static struct sap_table *
add_server(ser_type_t type, ser_name_t name, struct sockaddr_ipx *addr,
hop_t hops, struct ipx_interface *ifc)
{
struct sap_table *st;
st=(struct sap_table *)malloc(sizeof(struct sap_table));
if (st == NULL)
{
LOG_START;
fprintf(log_file, "ipxsapd: out of memory in add_server\n");
LOG_END;
return NULL;
}
st->type = type;
ipx_sap_assign_ser_name(st->name, name);
st->addr = *addr;
st->hops = hops;
setup_timers(st, ifc);
st->next = stable;
stable = st;
return st;
}
static void
delete_server(struct sap_table *d)
{
struct sap_table **s;
for (s = &stable; *s != NULL; s = &((*s)->next))
{
if (*s == d)
{
*s = d->next;
free(d);
return;
}
}
}
static void
handle_sap_gns_request(struct sap_entry * se, struct ipx_interface *src_ifc)
{
struct sap_table *cur;
struct sap_table *nearest = NULL;
if (ntohs(se->ser_type) == IPX_SAP_GENERAL_RQ)
{
return;
}
for (cur = stable; cur != NULL; cur = cur->next)
{
if (ipx_sap_type_equal(cur->type, ntohs(se->ser_type)))
{
if (nearest == NULL)
{
nearest = cur;
continue;
}
if (nearest->hops > cur->hops)
{
nearest = cur;
}
}
}
if (nearest != NULL)
{
ipx_sap_output_gns_response(&(src_ifc->s_output),
nearest->type, nearest->name,
&(nearest->addr), nearest->hops);
}
else
{
DL_START;
fprintf(log_file, "No servers of type %04X was found\n",
ntohs(se->ser_type));
DL_END;
}
}
static void
handle_sap_request(struct sap_entry *se, struct ipx_interface *src_ifc)
{
struct sap_table *cur;
for (cur = stable; cur != NULL; cur = cur->next)
{
if (ipx_sap_type_equal(cur->type, ntohs(se->ser_type)))
{
ipx_sap_output_response(&(src_ifc->s_output),
cur->type, cur->name,
&(cur->addr), cur->hops, 0);
}
}
}
static void
handle_sap_response(struct sap_entry *se, struct ipx_interface *src_ifc,
IPXNode src_node)
{
(void)src_node;
struct sap_table *cur;
se->hops = ntohs(se->hops) + 1;
for (cur = stable; cur != NULL; cur = cur->next)
{
if ( !ipx_sap_name_equal(cur->name, se->ser_name)
|| !ipx_sap_type_equal(cur->type, ntohs(se->ser_type)))
{
/* Another server was announced */
continue;
}
/* entry found */
if (se->hops <= IPX_SAP_SERVER_DOWN)
{
/* server ok */
if (se->hops > cur->hops)
{
return;
}
if (se->hops == cur->hops)
{
/* server has equal 'route' */
/* update info (near not neccesary) */
cur->addr.sipx_network = se->network;
ipx_assign_node(cur->addr.sipx_node, se->node);
cur->addr.sipx_port = se->port;
/* update timer for iface */
cur->timers[ifc_get_index(src_ifc)] = 0;
return;
}
/* server has better 'route' */
LOG_START;
fprintf(log_file, "CHANGE ");
fprint_server(log_file, cur);
LOG_END;
/* update table */
cur->hops = se->hops;
cur->addr.sipx_network = se->network;
ipx_assign_node(cur->addr.sipx_node, se->node);
cur->addr.sipx_port = se->port;
setup_timers(cur, src_ifc);
LOG_START;
fprintf(log_file, "\nto ");
fprint_server(log_file, cur);
fprintf(log_file, "\n");
LOG_END;
/* send info bcast */
output_broadcast(cur, 0);
}
else
{
/* server down through iface */
int src_ifc_idx = ifc_get_index(src_ifc);
int i;
cur->timers[src_ifc_idx] = EXPIRE_TIME;
for (i = first_ifc_index();
i >= 0;
i = next_ifc_index(i))
{
ifc_timer *tm = &(cur->timers[i]);
if (!is_expired(tm))
{
return;
}
}
cur->timers[src_ifc_idx] = 0;
cur->hops = IPX_SAP_SERVER_DOWN;
output_broadcast(cur, 1);
LOG_START;
fprintf(log_file, "DELETE ");
fprint_server(log_file, cur);
fprintf(log_file, " (service down)\n");
LOG_END;
delete_server(cur);
}
return;
}
/* entry not found */
if (se->hops <= IPX_SAP_SERVER_DOWN)
{
struct sap_table *st;
struct sockaddr_ipx addr;
addr.sipx_network = se->network;
ipx_assign_node(addr.sipx_node, se->node);
addr.sipx_port = se->port;
addr.sipx_type = 0;
st = add_server(ntohs(se->ser_type), se->ser_name, &addr,
se->hops, src_ifc);
if (st != NULL)
{
/* send info bcast */
output_broadcast(st, 0);
LOG_START;
fprintf(log_file, "ADD ");
fprint_server(log_file, st);
fprintf(log_file, "\n");
LOG_END;
}
}
}
void
handle_sap(struct sap_packet * pkt, int len, struct sockaddr_ipx *sipx,
struct ipx_interface *src_ifc)
{
struct sap_entry *se = pkt->sap_entries;
int nent = (len - 2) / sizeof(struct sap_entry);
if (ifc_net(src_ifc) != ntohl(sipx->sipx_network))
{
LOG_START;
fprintf(log_file, "SAP from non-local net ");
ipx_fprint_network(log_file, ntohl(sipx->sipx_network));
fprintf(log_file, " (ignored)\n");
LOG_END;
return;
}
if (len < 2)
{
LOG_START;
fprintf(log_file,
"SAP packet too small len=%i (ignored)\n", len);
LOG_END;
return;
}
if ( ipx_node_equal(src_ifc->ifnode, sipx->sipx_node)
&& ((unsigned short) sipx->sipx_port == htons(IPX_SAP_PORT)))
{
DL_START;
fprintf(log_file, "My packet (ignored)\n");
DL_END;
return;
}
switch (ntohs(pkt->operation))
{
case IPX_SAP_OP_REQUEST:
if (len != ipx_sap_size(1, IPX_SAP_OP_REQUEST))
{
LOG_START;
fprintf(log_file,
"SAP packet invalid size (ignored)\n");
LOG_END;
return;
}
output_set_destination(src_ifc,
sipx->sipx_node,
ntohs(sipx->sipx_port));
handle_sap_request(se, src_ifc);
output_flushall();
break;
case IPX_SAP_OP_GNS_REQUEST:
if (len != ipx_sap_size(1, IPX_SAP_OP_REQUEST))
{
LOG_START;
fprintf(log_file,
"SAP packet invalid size (ignored)\n");
LOG_END;
return;
}
output_set_destination(src_ifc,
sipx->sipx_node,
ntohs(sipx->sipx_port));
handle_sap_gns_request(se, src_ifc);
output_flushall();
break;
case IPX_SAP_OP_RESPONSE:
/* option: ignore responses from non SAP ports
* if (sipx->sipx_port!=htons(IPX_SAP_PORT)) return;
*/
output_set_destination(NULL, IPX_BROADCAST, IPX_SAP_PORT);
for (; nent--; se++)
{
handle_sap_response(se, src_ifc, sipx->sipx_node);
}
output_flushall();
break;
case IPX_SAP_OP_GNS_RESPONSE:
LOG_START;
fprintf(log_file,
"GNS response should never be received (ignored)\n");
LOG_END;
break;
default:
LOG_START;
fprintf(log_file, "Unknown SAP operation\n");
LOG_END;
break;
}
}
static void
delete_invalid_servers(void)
{
struct sap_table **s = &stable;
while (*s != NULL)
{
if ((*s)->hops >= IPX_SAP_SERVER_DOWN)
{
struct sap_table *d = *s;
*s = (*s)->next;
free(d);
}
else
{
s = &((*s)->next);
}
}
}
void
ipx_sap_do_aging(int rate, int do_broadcast)
{
struct sap_table *cur;
int servers_died = 0;
DL_START;
fprintf(log_file, "DO SAP AGING\n");
DL_END;
output_set_destination(NULL, IPX_BROADCAST, IPX_SAP_PORT);
for (cur = stable; cur != NULL; cur = cur->next)
{
int down = 1;
int i;
for (i = first_ifc_index(); i >= 0; i = next_ifc_index(i))
{
ifc_timer* tm = &(cur->timers[i]);;
if (!is_expired(tm))
{
(*tm) += rate;
if (!is_expired(tm))
{
down = 0;
}
}
}
if (down)
{
/* server is down */
LOG_START;
fprintf(log_file, "DELETE ");
fprint_server(log_file, cur);
fprintf(log_file, " (timed out)\n");
LOG_END;
/* send info bcast */
cur->hops = IPX_SAP_SERVER_DOWN;
output_broadcast(cur, 1);
/* table update deferred */
servers_died = 1;
} else
{
if (do_broadcast != 0)
{
output_broadcast(cur, 0);
}
}
}
/* Delete bogus servers */
if (servers_died != 0)
{
delete_invalid_servers();
}
output_flushall();
}
int
ipx_sap_init_ifc(struct ipx_interface *ifc, IPXNet network,
char *device, int type, void *data)
{
(void)device;
(void)type;
(void)data;
struct sockaddr_ipx sipx;
if (ipx_sap_output_init(&(ifc->s_output), network) != 0)
{
LOG_START;
fprintf(log_file,
"out of memory allocating output buffer\n");
LOG_END;
return -1;
}
if ((ifc->s_output.sk = socket(AF_IPX, SOCK_DGRAM, PF_IPX)) < 0)
{
LOG_START;
fprintf(log_file,
"can't open socket: %s\n", strerror(errno));
LOG_END;
return -1;
}
memset(&sipx, 0, sizeof(sipx));
sipx.sipx_family = AF_IPX;
sipx.sipx_network = htonl(network);
ipx_assign_node(sipx.sipx_node, IPX_THIS_NODE);
sipx.sipx_port = htons(IPX_SAP_PORT);
sipx.sipx_type = IPX_SAP_PTYPE;
if (bind(ifc->s_output.sk, (struct sockaddr *)&sipx, sizeof(sipx)) < 0)
{
LOG_START;
fprintf(log_file, "can't bind socket: %s\n",
strerror(errno));
LOG_END;
return -1;
}
if (ipx_kern_enable_broadcast(ifc->s_output.sk) != 0)
{
LOG_START;
fprintf(log_file, "cant' enable broadcast\n");
LOG_END;
exit(1);
}
LOG_START;
ipx_fprint_network(log_file, network);
fprintf(log_file,":");
ipx_fprint_node(log_file, ifc->ifnode);
fprintf(log_file,"\n");
LOG_END;
return 0;
}
static void
ipx_sap_deinit_ifc(struct ipx_interface *ifc)
{
close(ifc->s_output.sk);
}
void
ipx_sap_down_ifc(struct ipx_interface *ifc)
{
struct sap_table *st;
int ifc_index = ifc_get_index(ifc);
LOG_ENTRY;
LOG_START;
fprintf(log_file, "SAP DOWN INTERFACE ");
ipx_fprint_network(log_file, ifc_net(ifc));
fprintf(log_file, "\n");
LOG_END;
for (st = stable; st != NULL; st = st->next)
{
int i;
st->timers[ifc_index] = EXPIRE_TIME;
for (i = first_ifc_index();
i >= 0;
i = next_ifc_index(i))
{
ifc_timer *tm = &(st->timers[i]);
if (!is_expired(tm))
{
return;
}
}
st->timers[ifc_index] = 0;
st->hops = IPX_SAP_SERVER_DOWN;
output_broadcast(st, 1);
LOG_START;
fprintf(log_file, "DELETE ");
fprint_server(log_file, st);
fprintf(log_file, " (interface down)\n");
LOG_END;
}
delete_invalid_servers();
ipx_sap_deinit_ifc(ifc);
}
void
ipx_sap_initial_broadcasts()
{
struct ipx_interface *ifc;
ipx_sap_output_func = output_sendto;
output_set_destination(NULL, IPX_BROADCAST, IPX_SAP_PORT);
ifc = first_interface();
while (ifc != NULL)
{
ipx_sap_output_request(&(ifc->s_output),
IPX_SAP_GENERAL_RQ);
ifc = next_interface(ifc);
}
output_flushall();
}
void
ipx_sap_initial_broadcast(struct ipx_interface *ifc)
{
struct sap_table *cur;
output_set_destination(ifc, IPX_BROADCAST, IPX_SAP_PORT);
for (cur = stable; cur != NULL; cur = cur->next)
{
ipx_sap_output_response(&(ifc->s_output),
cur->type, cur->name,
&(cur->addr), cur->hops, 0);
}
ipx_sap_output_request(&(ifc->s_output), IPX_SAP_GENERAL_RQ);
ipx_sap_output_flush(&(ifc->s_output));
}
void
ipx_sap_done()
{
struct sap_table *cur;
LOG_ENTRY;
LOG_START;
fprintf(log_file, "SAP Shutdown start\n");
LOG_END;
output_set_destination(NULL, IPX_BROADCAST, IPX_SAP_PORT);
for (cur = stable; cur != NULL; cur = cur->next)
{
LOG_START;
fprintf(log_file, "DELETE ");
fprint_server(log_file, cur);
fprintf(log_file, " (shutdown)\n");
LOG_END;
/* send info bcast */
cur->hops = IPX_SAP_SERVER_DOWN;
output_broadcast(cur, 1);
/* update table */
delete_server(cur);
}
output_flushall();
LOG_ENTRY;
LOG_START;
fprintf(log_file, "SAP Shutdown end\n");
LOG_END;
}

50
ipxripd/ipxsapd.h Normal file
View File

@@ -0,0 +1,50 @@
/*
IPX routing daemon
Copyright (C) 1996, Volker Lendecke <lendecke@namu01.gwdg.de>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef _IPXSAPD_H_
#define _IPXSAPD_H_
void
fdump_servers(FILE *file);
void
handle_sap(struct sap_packet *pkt, int len, struct sockaddr_ipx* sipx,
struct ipx_interface *src_ifc);
void
ipx_sap_do_aging(int rate, int do_broadcast);
int
ipx_sap_init_ifc(struct ipx_interface *ifc, IPXNet network,
char *device, int type, void *data);
void
ipx_sap_done(void);
void
ipx_sap_initial_broadcasts(void);
void
ipx_sap_initial_broadcast(struct ipx_interface *ifc);
void
ipx_sap_down_ifc(struct ipx_interface *ifc);
#endif /* _IPXSAPD_H_ */

129
ipxripd/ipxutil.c Normal file
View File

@@ -0,0 +1,129 @@
/*
IPX support library - general functions
Copyright (C) 1994, 1995 Ales Dryak <e-mail: A.Dryak@sh.cvut.cz>
Copyright (C) 1996, Volker Lendecke <lendecke@namu01.gwdg.de>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <string.h>
#include <netinet/in.h>
#include "ipxutil.h"
void
ipx_fprint_node(FILE *file, IPXNode node)
{
fprintf(file,"%02X%02X%02X%02X%02X%02X",
(unsigned char)node[0],
(unsigned char)node[1],
(unsigned char)node[2],
(unsigned char)node[3],
(unsigned char)node[4],
(unsigned char)node[5]
);
}
void
ipx_fprint_network(FILE *file, IPXNet net)
{
fprintf(file,"%08lX",net);
}
void
ipx_fprint_port(FILE *file, IPXPort port)
{
fprintf(file,"%04X",port);
}
void
ipx_fprint_saddr(FILE *file, struct sockaddr_ipx *sipx)
{
ipx_fprint_network(file,ntohl(sipx->sipx_network));
fprintf(file,":");
ipx_fprint_node(file,sipx->sipx_node);
fprintf(file,":");
ipx_fprint_port(file,ntohs(sipx->sipx_port));
}
void
ipx_print_node(IPXNode node)
{
ipx_fprint_node(stdout,node);
}
void
ipx_print_network(IPXNet net)
{
ipx_fprint_network(stdout,net);
}
void
ipx_print_port(IPXPort port)
{
ipx_fprint_port(stdout,port);
}
void
ipx_print_saddr(struct sockaddr_ipx *sipx)
{
ipx_fprint_saddr(stdout,sipx);
}
void
ipx_assign_node(IPXNode dest, IPXNode src)
{
memcpy(dest,src,sizeof(IPXNode));
}
int
ipx_node_equal(IPXNode n1, IPXNode n2)
{
return memcmp(n1,n2,sizeof(IPXNode))==0;
}
int
ipx_sscanf_node(char *buf, IPXNode node)
{
int i;
int n[6];
if ((i = sscanf(buf, "%2x%2x%2x%2x%2x%2x",
&(n[0]), &(n[1]), &(n[2]),
&(n[3]), &(n[4]), &(n[5]))) != 6)
{
return -1;
}
for (i=0; i<6; i++)
{
node[i] = n[i];
}
return 0;
}
int
ipx_sscanf_net(char *buf, IPXNet *target)
{
if (sscanf(buf, "%8lX", target) == 1)
{
return 0;
}
return -1;
}
IPXNode ipx_this_node={0,0,0,0,0,0};
IPXNode ipx_broadcast_node={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
char ipx_err_string[IPX_MAX_ERROR+1]="no error detected";

65
ipxripd/ipxutil.h Normal file
View File

@@ -0,0 +1,65 @@
/*
IPX support library
Copyright (C) 1994, 1995 Ales Dryak <e-mail: A.Dryak@sh.cvut.cz>
Copyright (C) 1996, Volker Lendecke <lendecke@namu01.gwdg.de>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __IPXUTIL_H__
#define __IPXUTIL_H__
#include <stdio.h>
#include <netipx/ipx.h>
#define IPX_MAX_ERROR (255)
#define IPX_THIS_NET (0)
#define IPX_THIS_NODE (ipx_this_node)
#define IPX_BROADCAST (ipx_broadcast_node)
#define IPX_AUTO_PORT (0)
#define IPX_USER_PTYPE (0)
#define IPX_IS_INTERNAL (1)
typedef unsigned char IPXNode[6];
typedef unsigned long int IPXNet;
typedef unsigned short int IPXPort;
typedef unsigned short int hop_t;
typedef unsigned short int tick_t;
void ipx_print_node(IPXNode node);
void ipx_print_network(IPXNet net);
void ipx_print_port(IPXPort port);
void ipx_print_saddr(struct sockaddr_ipx* sipx);
void ipx_fprint_node(FILE* file,IPXNode node);
void ipx_fprint_network(FILE* file,IPXNet net);
void ipx_fprint_port(FILE* file,IPXPort port);
void ipx_fprint_saddr(FILE* file,struct sockaddr_ipx* sipx);
int ipx_sscanf_node(char *buf, IPXNode node);
int ipx_sscanf_net(char *buf, IPXNet *target);
void ipx_assign_node(IPXNode dest,IPXNode src);
int ipx_node_equal(IPXNode n1,IPXNode n2);
extern IPXNode ipx_this_node;
extern IPXNode ipx_broadcast_node;
extern char ipx_err_string[IPX_MAX_ERROR+1];
#endif

620
po/Makefile Normal file
View File

@@ -0,0 +1,620 @@
# Makefile for PO directory in any package using GNU gettext.
# Copyright (C) 1995-2000 Ulrich Drepper <drepper@gnu.ai.mit.edu>
# Copyright (C) 2000-2020 Free Software Foundation, Inc.
#
# Copying and distribution of this file, with or without modification,
# are permitted in any medium without royalty provided the copyright
# notice and this notice are preserved. This file is offered as-is,
# without any warranty.
#
# Origin: gettext-0.21
GETTEXT_MACRO_VERSION = 0.20
PACKAGE = ipx-utils
VERSION = 1.4
PACKAGE_BUGREPORT = mario.fetka@disconnected-by-peer.at
SED = /usr/bin/sed
SHELL = /bin/sh
srcdir = .
top_srcdir = ..
prefix = /usr
exec_prefix = ${prefix}
datarootdir = ${prefix}/share
datadir = ${datarootdir}
localedir = ${datarootdir}/locale
gettextsrcdir = $(datadir)/gettext/po
INSTALL = /usr/bin/install -c
INSTALL_DATA = ${INSTALL} -m 644
# We use $(mkdir_p).
# In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as
# "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions,
# ${SHELL} /home/mario/mars/ipx-utils/install-sh does not start with $(SHELL), so we add it.
# In automake >= 1.10, $(MKDIR_P) is derived from ${MKDIR_P}, which is defined
# either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake
# versions, $(mkinstalldirs) and $(install_sh) are unused.
mkinstalldirs = $(SHELL) ${SHELL} /home/mario/mars/ipx-utils/install-sh -d
install_sh = $(SHELL) ${SHELL} /home/mario/mars/ipx-utils/install-sh
MKDIR_P = /usr/bin/mkdir -p
mkdir_p = $(MKDIR_P)
# When building gettext-tools, we prefer to use the built programs
# rather than installed programs. However, we can't do that when we
# are cross compiling.
CROSS_COMPILING = @CROSS_COMPILING@
GMSGFMT_ = /usr/bin/gmsgfmt
GMSGFMT_no = /usr/bin/gmsgfmt
GMSGFMT_yes = /usr/bin/gmsgfmt
GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT))
XGETTEXT_ = /usr/bin/xgettext
XGETTEXT_no = /usr/bin/xgettext
XGETTEXT_yes = /usr/bin/xgettext
XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT))
MSGMERGE = /usr/bin/msgmerge
MSGMERGE_UPDATE = /usr/bin/msgmerge --update
MSGMERGE_FOR_MSGFMT_OPTION = --for-msgfmt
MSGINIT = msginit
MSGCONV = msgconv
MSGFILTER = msgfilter
POFILES = cs.po de.po es.po fr.po hu.po it.po ja.po pt_BR.po zh_CN.po zh_TW.po
GMOFILES = cs.gmo de.gmo es.gmo fr.gmo hu.gmo it.gmo ja.gmo pt_BR.gmo zh_CN.gmo zh_TW.gmo
UPDATEPOFILES = cs.po-update de.po-update es.po-update fr.po-update hu.po-update it.po-update ja.po-update pt_BR.po-update zh_CN.po-update zh_TW.po-update
DUMMYPOFILES = cs.nop de.nop es.nop fr.nop hu.nop it.nop ja.nop pt_BR.nop zh_CN.nop zh_TW.nop
DISTFILES.common = Makefile.in.in remove-potcdate.sin \
$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3)
DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \
$(POFILES) $(GMOFILES) \
$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3)
POTFILES = \
../src/ipx_configure.c \
../src/ipx_interface.c \
../src/ipx_internal_net.c \
../src/ipx_route.c \
../src/ipx_cmd.c \
../tools/ipxdump.c \
../tools/ipxparse.c
CATALOGS = cs.gmo de.gmo es.gmo fr.gmo hu.gmo it.gmo ja.gmo pt_BR.gmo zh_CN.gmo zh_TW.gmo
POFILESDEPS_ = $(srcdir)/$(DOMAIN).pot
POFILESDEPS_yes = $(POFILESDEPS_)
POFILESDEPS_no =
POFILESDEPS = $(POFILESDEPS_$(PO_DEPENDS_ON_POT))
DISTFILESDEPS_ = update-po
DISTFILESDEPS_yes = $(DISTFILESDEPS_)
DISTFILESDEPS_no =
DISTFILESDEPS = $(DISTFILESDEPS_$(DIST_DEPENDS_ON_UPDATE_PO))
# Makevars gets inserted here. (Don't remove this line!)
# Makefile variables for PO directory in any package using GNU gettext.
# Usually the message domain is the same as the package name.
DOMAIN = $(PACKAGE)
# These two variables depend on the location of this directory.
subdir = po
top_builddir = ..
# These options get passed to xgettext.
XGETTEXT_OPTIONS = --keyword=_ --keyword=N_
# This is the copyright holder that gets inserted into the header of the
# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding
# package. (Note that the msgstr strings, extracted from the package's
# sources, belong to the copyright holder of the package.) Translators are
# expected to transfer the copyright for their translations to this person
# or entity, or to disclaim their copyright. The empty string stands for
# the public domain; in this case the translators are expected to disclaim
# their copyright.
COPYRIGHT_HOLDER = Free Software Foundation, Inc.
# This is the email address or URL to which the translators shall report
# bugs in the untranslated strings:
# - Strings which are not entire sentences, see the maintainer guidelines
# in the GNU gettext documentation, section 'Preparing Strings'.
# - Strings which use unclear terms or require additional context to be
# understood.
# - Strings which make invalid assumptions about notation of date, time or
# money.
# - Pluralisation problems.
# - Incorrect English spelling.
# - Incorrect formatting.
# It can be your email address, or a mailing list address where translators
# can write to without being subscribed, or the URL of a web page through
# which the translators can contact you.
MSGID_BUGS_ADDRESS =
# This is the list of locale categories, beyond LC_MESSAGES, for which the
# message catalogs shall be used. It is usually empty.
EXTRA_LOCALE_CATEGORIES =
all: all-yes
.SUFFIXES:
.SUFFIXES: .po .gmo .sed .sin .nop .po-create .po-update
# The .pot file, stamp-po, .po files, and .gmo files appear in release tarballs.
# The GNU Coding Standards say in
# <https://www.gnu.org/prep/standards/html_node/Makefile-Basics.html>:
# "GNU distributions usually contain some files which are not source files
# ... . Since these files normally appear in the source directory, they
# should always appear in the source directory, not in the build directory.
# So Makefile rules to update them should put the updated files in the
# source directory."
# Therefore we put these files in the source directory, not the build directory.
# During .po -> .gmo conversion, take into account the most recent changes to
# the .pot file. This eliminates the need to update the .po files when the
# .pot file has changed, which would be troublesome if the .po files are put
# under version control.
$(GMOFILES): $(srcdir)/$(DOMAIN).pot
.po.gmo:
@lang=`echo $* | sed -e 's,.*/,,'`; \
test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
echo "$${cdcmd}rm -f $${lang}.gmo && $(MSGMERGE) $(MSGMERGE_FOR_MSGFMT_OPTION) -o $${lang}.1po $${lang}.po $(DOMAIN).pot && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.1po && rm -f $${lang}.1po"; \
cd $(srcdir) && \
rm -f $${lang}.gmo && \
$(MSGMERGE) $(MSGMERGE_FOR_MSGFMT_OPTION) -o $${lang}.1po $${lang}.po $(DOMAIN).pot && \
$(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.1po && \
mv t-$${lang}.gmo $${lang}.gmo && \
rm -f $${lang}.1po
.sin.sed:
sed -e '/^#/d' $< > t-$@
mv t-$@ $@
all-yes: $(srcdir)/stamp-po
all-no:
# Ensure that the gettext macros and this Makefile.in.in are in sync.
CHECK_MACRO_VERSION = \
test "$(GETTEXT_MACRO_VERSION)" = "0.20" \
|| { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version 0.20" 1>&2; \
exit 1; \
}
# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no
# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because
# we don't want to bother translators with empty POT files). We assume that
# LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty.
# In this case, $(srcdir)/stamp-po is a nop (i.e. a phony target).
# $(srcdir)/stamp-po is a timestamp denoting the last time at which the CATALOGS
# have been loosely updated. Its purpose is that when a developer or translator
# checks out the package from a version control system, and the $(DOMAIN).pot
# file is not under version control, "make" will update the $(DOMAIN).pot and
# the $(CATALOGS), but subsequent invocations of "make" will do nothing. This
# timestamp would not be necessary if updating the $(CATALOGS) would always
# touch them; however, the rule for $(POFILES) has been designed to not touch
# files that don't need to be changed.
$(srcdir)/stamp-po: $(srcdir)/$(DOMAIN).pot
@$(CHECK_MACRO_VERSION)
test ! -f $(srcdir)/$(DOMAIN).pot || \
test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES)
@test ! -f $(srcdir)/$(DOMAIN).pot || { \
echo "touch $(srcdir)/stamp-po" && \
echo timestamp > $(srcdir)/stamp-poT && \
mv $(srcdir)/stamp-poT $(srcdir)/stamp-po; \
}
# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update',
# otherwise packages like GCC can not be built if only parts of the source
# have been downloaded.
# This target rebuilds $(DOMAIN).pot; it is an expensive operation.
# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed.
# The determination of whether the package xyz is a GNU one is based on the
# heuristic whether some file in the top level directory mentions "GNU xyz".
# If GNU 'find' is available, we avoid grepping through monster files.
$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
package_gnu="$(PACKAGE_GNU)"; \
test -n "$$package_gnu" || { \
if { if (LC_ALL=C find --version) 2>/dev/null | grep GNU >/dev/null; then \
LC_ALL=C find -L $(top_srcdir) -maxdepth 1 -type f -size -10000000c -exec grep -i 'GNU ipx-utils' /dev/null '{}' ';' 2>/dev/null; \
else \
LC_ALL=C grep -i 'GNU ipx-utils' $(top_srcdir)/* 2>/dev/null; \
fi; \
} | grep -v 'libtool:' >/dev/null; then \
package_gnu=yes; \
else \
package_gnu=no; \
fi; \
}; \
if test "$$package_gnu" = "yes"; then \
package_prefix='GNU '; \
else \
package_prefix=''; \
fi; \
if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \
msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \
else \
msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \
fi; \
case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
'' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \
$(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
--add-comments=TRANSLATORS: \
--files-from=$(srcdir)/POTFILES.in \
--copyright-holder='$(COPYRIGHT_HOLDER)' \
--msgid-bugs-address="$$msgid_bugs_address" \
$(XGETTEXT_OPTIONS) \
;; \
*) \
$(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
--add-comments=TRANSLATORS: \
--files-from=$(srcdir)/POTFILES.in \
--copyright-holder='$(COPYRIGHT_HOLDER)' \
--package-name="$${package_prefix}ipx-utils" \
--package-version='1.4' \
--msgid-bugs-address="$$msgid_bugs_address" \
$(XGETTEXT_OPTIONS) \
;; \
esac
test ! -f $(DOMAIN).po || { \
if test -f $(srcdir)/$(DOMAIN).pot-header; then \
sed -e '1,/^#$$/d' < $(DOMAIN).po > $(DOMAIN).1po && \
cat $(srcdir)/$(DOMAIN).pot-header $(DOMAIN).1po > $(DOMAIN).po && \
rm -f $(DOMAIN).1po \
|| exit 1; \
fi; \
if test -f $(srcdir)/$(DOMAIN).pot; then \
sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \
sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \
if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \
rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \
else \
rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \
mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
fi; \
else \
mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
fi; \
}
# This rule has no dependencies: we don't need to update $(DOMAIN).pot at
# every "make" invocation, only create it when it is missing.
# Only "make $(DOMAIN).pot-update" or "make dist" will force an update.
$(srcdir)/$(DOMAIN).pot:
$(MAKE) $(DOMAIN).pot-update
# This target rebuilds a PO file if $(DOMAIN).pot has changed.
# Note that a PO file is not touched if it doesn't need to be changed.
$(POFILES): $(POFILESDEPS)
@test -f $(srcdir)/$(DOMAIN).pot || $(MAKE) $(srcdir)/$(DOMAIN).pot
@lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \
if test -f "$(srcdir)/$${lang}.po"; then \
test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} --previous $${lang}.po $(DOMAIN).pot"; \
cd $(srcdir) \
&& { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
'' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].*) \
$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \
0.1[6-7] | 0.1[6-7].*) \
$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --previous $${lang}.po $(DOMAIN).pot;; \
*) \
$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} --previous $${lang}.po $(DOMAIN).pot;; \
esac; \
}; \
else \
$(MAKE) $${lang}.po-create; \
fi
install: install-exec install-data
install-exec:
install-data: install-data-yes
if test "$(PACKAGE)" = "gettext-tools"; then \
$(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
for file in $(DISTFILES.common) Makevars.template; do \
$(INSTALL_DATA) $(srcdir)/$$file \
$(DESTDIR)$(gettextsrcdir)/$$file; \
done; \
for file in Makevars; do \
rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
done; \
else \
: ; \
fi
install-data-no: all
install-data-yes: all
@catalogs='$(CATALOGS)'; \
for cat in $$catalogs; do \
cat=`basename $$cat`; \
lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
dir=$(localedir)/$$lang/LC_MESSAGES; \
$(mkdir_p) $(DESTDIR)$$dir; \
if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \
$(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \
echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \
for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
if test -n "$$lc"; then \
if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
(cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
for file in *; do \
if test -f $$file; then \
ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
fi; \
done); \
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
else \
if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
:; \
else \
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
fi; \
fi; \
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \
fi; \
done; \
done
install-strip: install
installdirs: installdirs-exec installdirs-data
installdirs-exec:
installdirs-data: installdirs-data-yes
if test "$(PACKAGE)" = "gettext-tools"; then \
$(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
else \
: ; \
fi
installdirs-data-no:
installdirs-data-yes:
@catalogs='$(CATALOGS)'; \
for cat in $$catalogs; do \
cat=`basename $$cat`; \
lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
dir=$(localedir)/$$lang/LC_MESSAGES; \
$(mkdir_p) $(DESTDIR)$$dir; \
for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
if test -n "$$lc"; then \
if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
(cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
for file in *; do \
if test -f $$file; then \
ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
fi; \
done); \
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
else \
if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
:; \
else \
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
fi; \
fi; \
fi; \
done; \
done
# Define this as empty until I found a useful application.
installcheck:
uninstall: uninstall-exec uninstall-data
uninstall-exec:
uninstall-data: uninstall-data-yes
if test "$(PACKAGE)" = "gettext-tools"; then \
for file in $(DISTFILES.common) Makevars.template; do \
rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
done; \
else \
: ; \
fi
uninstall-data-no:
uninstall-data-yes:
catalogs='$(CATALOGS)'; \
for cat in $$catalogs; do \
cat=`basename $$cat`; \
lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
done; \
done
check: all
info dvi ps pdf html tags TAGS ctags CTAGS ID:
install-dvi install-ps install-pdf install-html:
mostlyclean:
rm -f remove-potcdate.sed
rm -f $(srcdir)/stamp-poT
rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po
rm -fr *.o
clean: mostlyclean
distclean: clean
rm -f Makefile Makefile.in POTFILES
maintainer-clean: distclean
@echo "This command is intended for maintainers to use;"
@echo "it deletes files that may require special tools to rebuild."
rm -f $(srcdir)/$(DOMAIN).pot $(srcdir)/stamp-po $(GMOFILES)
distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
dist distdir:
test -z "$(DISTFILESDEPS)" || $(MAKE) $(DISTFILESDEPS)
@$(MAKE) dist2
# This is a separate target because 'update-po' must be executed before.
dist2: $(srcdir)/stamp-po $(DISTFILES)
@dists="$(DISTFILES)"; \
if test "$(PACKAGE)" = "gettext-tools"; then \
dists="$$dists Makevars.template"; \
fi; \
if test -f $(srcdir)/$(DOMAIN).pot; then \
dists="$$dists $(DOMAIN).pot stamp-po"; \
else \
case $(XGETTEXT) in \
:) echo "Warning: Creating a tarball without '$(DOMAIN).pot', because a suitable 'xgettext' program was not found in PATH." 1>&2;; \
*) echo "Warning: Creating a tarball without '$(DOMAIN).pot', because 'xgettext' found no strings to extract. Check the contents of the POTFILES.in file and the XGETTEXT_OPTIONS in the Makevars file." 1>&2;; \
esac; \
fi; \
if test -f $(srcdir)/ChangeLog; then \
dists="$$dists ChangeLog"; \
fi; \
for i in 0 1 2 3 4 5 6 7 8 9; do \
if test -f $(srcdir)/ChangeLog.$$i; then \
dists="$$dists ChangeLog.$$i"; \
fi; \
done; \
if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \
for file in $$dists; do \
if test -f $$file; then \
cp -p $$file $(distdir) || exit 1; \
else \
cp -p $(srcdir)/$$file $(distdir) || exit 1; \
fi; \
done
update-po: Makefile
$(MAKE) $(DOMAIN).pot-update
test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES)
$(MAKE) update-gmo
# General rule for creating PO files.
.nop.po-create:
@lang=`echo $@ | sed -e 's/\.po-create$$//'`; \
echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \
exit 1
# General rule for updating PO files.
.nop.po-update:
@lang=`echo $@ | sed -e 's/\.po-update$$//'`; \
if test "$(PACKAGE)" = "gettext-tools" && test "$(CROSS_COMPILING)" != "yes"; then PATH=`pwd`/../src:$$PATH; fi; \
tmpdir=`pwd`; \
echo "$$lang:"; \
test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang --previous $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \
cd $(srcdir); \
if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
'' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].*) \
$(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
0.1[6-7] | 0.1[6-7].*) \
$(MSGMERGE) $(MSGMERGE_OPTIONS) --previous -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
*) \
$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang --previous -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
esac; \
}; then \
if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
rm -f $$tmpdir/$$lang.new.po; \
else \
if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
:; \
else \
echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
exit 1; \
fi; \
fi; \
else \
echo "msgmerge for $$lang.po failed!" 1>&2; \
rm -f $$tmpdir/$$lang.new.po; \
fi
$(DUMMYPOFILES):
update-gmo: Makefile $(GMOFILES)
@:
# Recreate Makefile by invoking config.status. Explicitly invoke the shell,
# because execution permission bits may not work on the current file system.
# Use /bin/sh, which is the shell determined by autoconf for the use by its
# scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient.
Makefile: Makefile.in.in Makevars $(top_builddir)/config.status POTFILES.in LINGUAS
cd $(top_builddir) \
&& /bin/sh ./config.status $(subdir)/$@.in po-directories
force:
# Tell versions [3.59,3.63) of GNU make not to export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
# Special Makefile rules for English message catalogs with quotation marks.
#
# Copyright (C) 2001-2017 Free Software Foundation, Inc.
# This file, Rules-quot, and its auxiliary files (listed under
# DISTFILES.common.extra1) are free software; the Free Software Foundation
# gives unlimited permission to use, copy, distribute, and modify them.
DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot
.SUFFIXES: .insert-header .po-update-en
en@quot.po-create:
$(MAKE) en@quot.po-update
en@boldquot.po-create:
$(MAKE) en@boldquot.po-update
en@quot.po-update: en@quot.po-update-en
en@boldquot.po-update: en@boldquot.po-update-en
.insert-header.po-update-en:
@lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \
if test "$(PACKAGE)" = "gettext-tools" && test "$(CROSS_COMPILING)" != "yes"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \
tmpdir=`pwd`; \
echo "$$lang:"; \
ll=`echo $$lang | sed -e 's/@.*//'`; \
LC_ALL=C; export LC_ALL; \
cd $(srcdir); \
if $(MSGINIT) $(MSGINIT_OPTIONS) -i $(DOMAIN).pot --no-translator -l $$lang -o - 2>/dev/null \
| $(SED) -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | \
{ case `$(MSGFILTER) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
'' | 0.[0-9] | 0.[0-9].* | 0.1[0-8] | 0.1[0-8].*) \
$(MSGFILTER) $(SED) -f `echo $$lang | sed -e 's/.*@//'`.sed \
;; \
*) \
$(MSGFILTER) `echo $$lang | sed -e 's/.*@//'` \
;; \
esac } 2>/dev/null > $$tmpdir/$$lang.new.po \
; then \
if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
rm -f $$tmpdir/$$lang.new.po; \
else \
if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
:; \
else \
echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
exit 1; \
fi; \
fi; \
else \
echo "creation of $$lang.po failed!" 1>&2; \
rm -f $$tmpdir/$$lang.new.po; \
fi
en@quot.insert-header: insert-header.sin
sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header
en@boldquot.insert-header: insert-header.sin
sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header
mostlyclean: mostlyclean-quot
mostlyclean-quot:
rm -f *.insert-header

510
po/Makefile.in Normal file
View File

@@ -0,0 +1,510 @@
# Makefile for PO directory in any package using GNU gettext.
# Copyright (C) 1995-2000 Ulrich Drepper <drepper@gnu.ai.mit.edu>
# Copyright (C) 2000-2020 Free Software Foundation, Inc.
#
# Copying and distribution of this file, with or without modification,
# are permitted in any medium without royalty provided the copyright
# notice and this notice are preserved. This file is offered as-is,
# without any warranty.
#
# Origin: gettext-0.21
GETTEXT_MACRO_VERSION = 0.20
PACKAGE = ipx-utils
VERSION = 1.4
PACKAGE_BUGREPORT = mario.fetka@disconnected-by-peer.at
SED = /usr/bin/sed
SHELL = /bin/sh
srcdir = .
top_srcdir = ..
prefix = /usr
exec_prefix = ${prefix}
datarootdir = ${prefix}/share
datadir = ${datarootdir}
localedir = ${datarootdir}/locale
gettextsrcdir = $(datadir)/gettext/po
INSTALL = /usr/bin/install -c
INSTALL_DATA = ${INSTALL} -m 644
# We use $(mkdir_p).
# In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as
# "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions,
# ${SHELL} /home/mario/mars/ipx-utils/install-sh does not start with $(SHELL), so we add it.
# In automake >= 1.10, $(MKDIR_P) is derived from ${MKDIR_P}, which is defined
# either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake
# versions, $(mkinstalldirs) and $(install_sh) are unused.
mkinstalldirs = $(SHELL) ${SHELL} /home/mario/mars/ipx-utils/install-sh -d
install_sh = $(SHELL) ${SHELL} /home/mario/mars/ipx-utils/install-sh
MKDIR_P = /usr/bin/mkdir -p
mkdir_p = $(MKDIR_P)
# When building gettext-tools, we prefer to use the built programs
# rather than installed programs. However, we can't do that when we
# are cross compiling.
CROSS_COMPILING = @CROSS_COMPILING@
GMSGFMT_ = /usr/bin/gmsgfmt
GMSGFMT_no = /usr/bin/gmsgfmt
GMSGFMT_yes = /usr/bin/gmsgfmt
GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT))
XGETTEXT_ = /usr/bin/xgettext
XGETTEXT_no = /usr/bin/xgettext
XGETTEXT_yes = /usr/bin/xgettext
XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT))
MSGMERGE = /usr/bin/msgmerge
MSGMERGE_UPDATE = /usr/bin/msgmerge --update
MSGMERGE_FOR_MSGFMT_OPTION = --for-msgfmt
MSGINIT = msginit
MSGCONV = msgconv
MSGFILTER = msgfilter
POFILES = @POFILES@
GMOFILES = @GMOFILES@
UPDATEPOFILES = @UPDATEPOFILES@
DUMMYPOFILES = @DUMMYPOFILES@
DISTFILES.common = Makefile.in.in remove-potcdate.sin \
$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3)
DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \
$(POFILES) $(GMOFILES) \
$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3)
POTFILES = \
CATALOGS = @CATALOGS@
POFILESDEPS_ = $(srcdir)/$(DOMAIN).pot
POFILESDEPS_yes = $(POFILESDEPS_)
POFILESDEPS_no =
POFILESDEPS = $(POFILESDEPS_$(PO_DEPENDS_ON_POT))
DISTFILESDEPS_ = update-po
DISTFILESDEPS_yes = $(DISTFILESDEPS_)
DISTFILESDEPS_no =
DISTFILESDEPS = $(DISTFILESDEPS_$(DIST_DEPENDS_ON_UPDATE_PO))
# Makevars gets inserted here. (Don't remove this line!)
all: all-yes
.SUFFIXES:
.SUFFIXES: .po .gmo .sed .sin .nop .po-create .po-update
# The .pot file, stamp-po, .po files, and .gmo files appear in release tarballs.
# The GNU Coding Standards say in
# <https://www.gnu.org/prep/standards/html_node/Makefile-Basics.html>:
# "GNU distributions usually contain some files which are not source files
# ... . Since these files normally appear in the source directory, they
# should always appear in the source directory, not in the build directory.
# So Makefile rules to update them should put the updated files in the
# source directory."
# Therefore we put these files in the source directory, not the build directory.
# During .po -> .gmo conversion, take into account the most recent changes to
# the .pot file. This eliminates the need to update the .po files when the
# .pot file has changed, which would be troublesome if the .po files are put
# under version control.
$(GMOFILES): $(srcdir)/$(DOMAIN).pot
.po.gmo:
@lang=`echo $* | sed -e 's,.*/,,'`; \
test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
echo "$${cdcmd}rm -f $${lang}.gmo && $(MSGMERGE) $(MSGMERGE_FOR_MSGFMT_OPTION) -o $${lang}.1po $${lang}.po $(DOMAIN).pot && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.1po && rm -f $${lang}.1po"; \
cd $(srcdir) && \
rm -f $${lang}.gmo && \
$(MSGMERGE) $(MSGMERGE_FOR_MSGFMT_OPTION) -o $${lang}.1po $${lang}.po $(DOMAIN).pot && \
$(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.1po && \
mv t-$${lang}.gmo $${lang}.gmo && \
rm -f $${lang}.1po
.sin.sed:
sed -e '/^#/d' $< > t-$@
mv t-$@ $@
all-yes: $(srcdir)/stamp-po
all-no:
# Ensure that the gettext macros and this Makefile.in.in are in sync.
CHECK_MACRO_VERSION = \
test "$(GETTEXT_MACRO_VERSION)" = "0.20" \
|| { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version 0.20" 1>&2; \
exit 1; \
}
# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no
# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because
# we don't want to bother translators with empty POT files). We assume that
# LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty.
# In this case, $(srcdir)/stamp-po is a nop (i.e. a phony target).
# $(srcdir)/stamp-po is a timestamp denoting the last time at which the CATALOGS
# have been loosely updated. Its purpose is that when a developer or translator
# checks out the package from a version control system, and the $(DOMAIN).pot
# file is not under version control, "make" will update the $(DOMAIN).pot and
# the $(CATALOGS), but subsequent invocations of "make" will do nothing. This
# timestamp would not be necessary if updating the $(CATALOGS) would always
# touch them; however, the rule for $(POFILES) has been designed to not touch
# files that don't need to be changed.
$(srcdir)/stamp-po: $(srcdir)/$(DOMAIN).pot
@$(CHECK_MACRO_VERSION)
test ! -f $(srcdir)/$(DOMAIN).pot || \
test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES)
@test ! -f $(srcdir)/$(DOMAIN).pot || { \
echo "touch $(srcdir)/stamp-po" && \
echo timestamp > $(srcdir)/stamp-poT && \
mv $(srcdir)/stamp-poT $(srcdir)/stamp-po; \
}
# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update',
# otherwise packages like GCC can not be built if only parts of the source
# have been downloaded.
# This target rebuilds $(DOMAIN).pot; it is an expensive operation.
# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed.
# The determination of whether the package xyz is a GNU one is based on the
# heuristic whether some file in the top level directory mentions "GNU xyz".
# If GNU 'find' is available, we avoid grepping through monster files.
$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
package_gnu="$(PACKAGE_GNU)"; \
test -n "$$package_gnu" || { \
if { if (LC_ALL=C find --version) 2>/dev/null | grep GNU >/dev/null; then \
LC_ALL=C find -L $(top_srcdir) -maxdepth 1 -type f -size -10000000c -exec grep -i 'GNU ipx-utils' /dev/null '{}' ';' 2>/dev/null; \
else \
LC_ALL=C grep -i 'GNU ipx-utils' $(top_srcdir)/* 2>/dev/null; \
fi; \
} | grep -v 'libtool:' >/dev/null; then \
package_gnu=yes; \
else \
package_gnu=no; \
fi; \
}; \
if test "$$package_gnu" = "yes"; then \
package_prefix='GNU '; \
else \
package_prefix=''; \
fi; \
if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \
msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \
else \
msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \
fi; \
case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
'' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \
$(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
--add-comments=TRANSLATORS: \
--files-from=$(srcdir)/POTFILES.in \
--copyright-holder='$(COPYRIGHT_HOLDER)' \
--msgid-bugs-address="$$msgid_bugs_address" \
$(XGETTEXT_OPTIONS) \
;; \
*) \
$(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
--add-comments=TRANSLATORS: \
--files-from=$(srcdir)/POTFILES.in \
--copyright-holder='$(COPYRIGHT_HOLDER)' \
--package-name="$${package_prefix}ipx-utils" \
--package-version='1.4' \
--msgid-bugs-address="$$msgid_bugs_address" \
$(XGETTEXT_OPTIONS) \
;; \
esac
test ! -f $(DOMAIN).po || { \
if test -f $(srcdir)/$(DOMAIN).pot-header; then \
sed -e '1,/^#$$/d' < $(DOMAIN).po > $(DOMAIN).1po && \
cat $(srcdir)/$(DOMAIN).pot-header $(DOMAIN).1po > $(DOMAIN).po && \
rm -f $(DOMAIN).1po \
|| exit 1; \
fi; \
if test -f $(srcdir)/$(DOMAIN).pot; then \
sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \
sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \
if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \
rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \
else \
rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \
mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
fi; \
else \
mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
fi; \
}
# This rule has no dependencies: we don't need to update $(DOMAIN).pot at
# every "make" invocation, only create it when it is missing.
# Only "make $(DOMAIN).pot-update" or "make dist" will force an update.
$(srcdir)/$(DOMAIN).pot:
$(MAKE) $(DOMAIN).pot-update
# This target rebuilds a PO file if $(DOMAIN).pot has changed.
# Note that a PO file is not touched if it doesn't need to be changed.
$(POFILES): $(POFILESDEPS)
@test -f $(srcdir)/$(DOMAIN).pot || $(MAKE) $(srcdir)/$(DOMAIN).pot
@lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \
if test -f "$(srcdir)/$${lang}.po"; then \
test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} --previous $${lang}.po $(DOMAIN).pot"; \
cd $(srcdir) \
&& { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
'' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].*) \
$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \
0.1[6-7] | 0.1[6-7].*) \
$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --previous $${lang}.po $(DOMAIN).pot;; \
*) \
$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} --previous $${lang}.po $(DOMAIN).pot;; \
esac; \
}; \
else \
$(MAKE) $${lang}.po-create; \
fi
install: install-exec install-data
install-exec:
install-data: install-data-yes
if test "$(PACKAGE)" = "gettext-tools"; then \
$(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
for file in $(DISTFILES.common) Makevars.template; do \
$(INSTALL_DATA) $(srcdir)/$$file \
$(DESTDIR)$(gettextsrcdir)/$$file; \
done; \
for file in Makevars; do \
rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
done; \
else \
: ; \
fi
install-data-no: all
install-data-yes: all
@catalogs='$(CATALOGS)'; \
for cat in $$catalogs; do \
cat=`basename $$cat`; \
lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
dir=$(localedir)/$$lang/LC_MESSAGES; \
$(mkdir_p) $(DESTDIR)$$dir; \
if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \
$(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \
echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \
for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
if test -n "$$lc"; then \
if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
(cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
for file in *; do \
if test -f $$file; then \
ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
fi; \
done); \
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
else \
if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
:; \
else \
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
fi; \
fi; \
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \
fi; \
done; \
done
install-strip: install
installdirs: installdirs-exec installdirs-data
installdirs-exec:
installdirs-data: installdirs-data-yes
if test "$(PACKAGE)" = "gettext-tools"; then \
$(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
else \
: ; \
fi
installdirs-data-no:
installdirs-data-yes:
@catalogs='$(CATALOGS)'; \
for cat in $$catalogs; do \
cat=`basename $$cat`; \
lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
dir=$(localedir)/$$lang/LC_MESSAGES; \
$(mkdir_p) $(DESTDIR)$$dir; \
for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
if test -n "$$lc"; then \
if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
(cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
for file in *; do \
if test -f $$file; then \
ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
fi; \
done); \
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
else \
if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
:; \
else \
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
fi; \
fi; \
fi; \
done; \
done
# Define this as empty until I found a useful application.
installcheck:
uninstall: uninstall-exec uninstall-data
uninstall-exec:
uninstall-data: uninstall-data-yes
if test "$(PACKAGE)" = "gettext-tools"; then \
for file in $(DISTFILES.common) Makevars.template; do \
rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
done; \
else \
: ; \
fi
uninstall-data-no:
uninstall-data-yes:
catalogs='$(CATALOGS)'; \
for cat in $$catalogs; do \
cat=`basename $$cat`; \
lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \
rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
done; \
done
check: all
info dvi ps pdf html tags TAGS ctags CTAGS ID:
install-dvi install-ps install-pdf install-html:
mostlyclean:
rm -f remove-potcdate.sed
rm -f $(srcdir)/stamp-poT
rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po
rm -fr *.o
clean: mostlyclean
distclean: clean
rm -f Makefile Makefile.in POTFILES
maintainer-clean: distclean
@echo "This command is intended for maintainers to use;"
@echo "it deletes files that may require special tools to rebuild."
rm -f $(srcdir)/$(DOMAIN).pot $(srcdir)/stamp-po $(GMOFILES)
distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
dist distdir:
test -z "$(DISTFILESDEPS)" || $(MAKE) $(DISTFILESDEPS)
@$(MAKE) dist2
# This is a separate target because 'update-po' must be executed before.
dist2: $(srcdir)/stamp-po $(DISTFILES)
@dists="$(DISTFILES)"; \
if test "$(PACKAGE)" = "gettext-tools"; then \
dists="$$dists Makevars.template"; \
fi; \
if test -f $(srcdir)/$(DOMAIN).pot; then \
dists="$$dists $(DOMAIN).pot stamp-po"; \
else \
case $(XGETTEXT) in \
:) echo "Warning: Creating a tarball without '$(DOMAIN).pot', because a suitable 'xgettext' program was not found in PATH." 1>&2;; \
*) echo "Warning: Creating a tarball without '$(DOMAIN).pot', because 'xgettext' found no strings to extract. Check the contents of the POTFILES.in file and the XGETTEXT_OPTIONS in the Makevars file." 1>&2;; \
esac; \
fi; \
if test -f $(srcdir)/ChangeLog; then \
dists="$$dists ChangeLog"; \
fi; \
for i in 0 1 2 3 4 5 6 7 8 9; do \
if test -f $(srcdir)/ChangeLog.$$i; then \
dists="$$dists ChangeLog.$$i"; \
fi; \
done; \
if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \
for file in $$dists; do \
if test -f $$file; then \
cp -p $$file $(distdir) || exit 1; \
else \
cp -p $(srcdir)/$$file $(distdir) || exit 1; \
fi; \
done
update-po: Makefile
$(MAKE) $(DOMAIN).pot-update
test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES)
$(MAKE) update-gmo
# General rule for creating PO files.
.nop.po-create:
@lang=`echo $@ | sed -e 's/\.po-create$$//'`; \
echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \
exit 1
# General rule for updating PO files.
.nop.po-update:
@lang=`echo $@ | sed -e 's/\.po-update$$//'`; \
if test "$(PACKAGE)" = "gettext-tools" && test "$(CROSS_COMPILING)" != "yes"; then PATH=`pwd`/../src:$$PATH; fi; \
tmpdir=`pwd`; \
echo "$$lang:"; \
test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang --previous $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \
cd $(srcdir); \
if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
'' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].*) \
$(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
0.1[6-7] | 0.1[6-7].*) \
$(MSGMERGE) $(MSGMERGE_OPTIONS) --previous -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
*) \
$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang --previous -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
esac; \
}; then \
if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
rm -f $$tmpdir/$$lang.new.po; \
else \
if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
:; \
else \
echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
exit 1; \
fi; \
fi; \
else \
echo "msgmerge for $$lang.po failed!" 1>&2; \
rm -f $$tmpdir/$$lang.new.po; \
fi
$(DUMMYPOFILES):
update-gmo: Makefile $(GMOFILES)
@:
# Recreate Makefile by invoking config.status. Explicitly invoke the shell,
# because execution permission bits may not work on the current file system.
# Use /bin/sh, which is the shell determined by autoconf for the use by its
# scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient.
Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@
cd $(top_builddir) \
&& /bin/sh ./config.status $(subdir)/$@.in po-directories
force:
# Tell versions [3.59,3.63) of GNU make not to export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

7
po/POTFILES Normal file
View File

@@ -0,0 +1,7 @@
../src/ipx_configure.c \
../src/ipx_interface.c \
../src/ipx_internal_net.c \
../src/ipx_route.c \
../src/ipx_cmd.c \
../tools/ipxdump.c \
../tools/ipxparse.c

1
po/stamp-po Normal file
View File

@@ -0,0 +1 @@
timestamp

1
stamp-h1 Normal file
View File

@@ -0,0 +1 @@
timestamp for config.h