adding zephyr-im master branch

This commit is contained in:
Brian 2022-07-25 09:01:27 -06:00
parent 61f5ed8f01
commit ee1236fa5c
Signed by: brian
GPG Key ID: DE1A5390A3B84CD8
311 changed files with 62265 additions and 0 deletions

14
.gitattributes vendored Normal file
View File

@ -0,0 +1,14 @@
*.c ident
*.h ident
*.y ident
*.et ident
*.ct ident
*.py ident
*.1.in ident
*.1 ident
*.8.in ident
*.8 ident
debian export-ignore
.gitignore export-ignore
.gitattributes export-ignore
release export-ignore

89
.gitignore vendored Normal file
View File

@ -0,0 +1,89 @@
*~
.\#*
\#*#
autom4te.cache
TAGS
*.pyc
/build-stamp
/debian/files
/debian/*.substvars
/debian/*.debhelper.log
/configure-stamp
/debian/libzephyr-dev/*
/debian/*.debhelper
/debian/libzephyr-python/*
/debian/libzephyr4-krb/*
/debian/libzephyr4-krb45/*
/debian/libzephyr4-krb5/*
/debian/libzephyr4/*
/debian/tmp-krb5/*
/debian/tmp/*
/debian/zephyr-clients/*
/debian/zephyr-server-krb/*
/debian/zephyr-server-krb45/*
/debian/zephyr-server-krb5.README.Debian
/debian/zephyr-server-krb5.docs
/debian/zephyr-server-krb5.files
/debian/zephyr-server-krb5.postinst
/debian/zephyr-server-krb5.postrm
/debian/zephyr-server-krb5.templates
/debian/zephyr-server-krb5/*
/debian/zephyr-server/*
/krb5/*
/no-krb/*
/debian/libzephyr4-krb5.files
aclocal.m4
configure
h/config.h.in
ltmain.sh
m4
config.guess
config.sub
libtool
install-sh
config.log
config.status
*.o
*.lo
*.la
/lib/zephyr_err.c
/lib/zephyr_err.h
/server/zsrv_err.c
/server/zsrv_err.h
.libs
Makefile
/server/test_server
/server/zephyrd
/server/zephyrd.8
/zhm/zhm
/zhm/zhm.8
/zwgc/char_stack.h
/zwgc/int_dictionary.c
/zwgc/int_dictionary.h
/zwgc/pointer_dictionary.c
/zwgc/pointer_dictionary.h
/zwgc/port_dictionary.c
/zwgc/port_dictionary.h
/zwgc/string_dictionary.c
/zwgc/string_dictionary.h
/zwgc/string_stack.h
/zwgc/unsigned_long_dictionary.c
/zwgc/unsigned_long_dictionary.h
/zwgc/xmode_stack.h
/zwgc/y.tab.c
/zwgc/y.tab.h
/zwgc/zwgc
/zwgc/zwgc.1
/clients/zaway/zaway
/clients/zctl/zctl
/clients/zctl/zctl.1
/clients/zctl/zctl_cmds.c
/clients/zleave/zleave
/clients/zlocate/zlocate
/clients/znol/znol
/clients/zshutdown_notify/zshutdown_notify
/clients/zstat/zstat
/clients/zwrite/zwrite
/h/config.h
/h/zephyr/zephyr_err.h
/h/zephyr_version.h

78
INSTALL Normal file
View File

@ -0,0 +1,78 @@
This file explains how to build and install Zephyr on a machine. To
learn how to use Zephyr once you've installed it, read the file USING.
To learn how to set up Zephyr service at a site, read the file
OPERATING.
To build and install Zephyr, run:
./configure
make
make install
This will build Zephyr without Hesiod or Kerberos support, and install
in /usr/local. To install in a location other than /usr/local, add
"--prefix=INSTPREFIX" to the configure line, where INSTPREFIX is the
directory you want to install Zephyr in.
If your site has a Hesiod service with a valid zephyr.sloc entry (or
you can add one), you can enable Hesiod support by adding the option
"--with-hesiod=HESPREFIX" to the configure line, where
HESPREFIX/include and HESPREFIX/lib are the directories you have the
Hesiod libraries installed in.
If your site has a Kerberos 5 service, you can enable Kerberos 5 support
by adding the option "--with-krb5=KRBPREFIX" to the configure line,
where KRBPREFIX/include and KRBPREFIX/lib are the directories you
have the Kerberos libraries installed in.
If your site has a Kerberos 4 service, you can enable Kerberos 4 support
by adding the option "--with-krb4=KRBPREFIX" to the configure line,
where KRBPREFIX/include and KRBPREFIX/lib are the directories you
have the Kerberos libraries installed in. Note that this is
deprecated, and should only be enabled for transitions.
If you build with both krb5 and krb4, you will get a client that only
knows how to authenticate with krb5 servers, but a server that can
understand authentication from both krb4 and krb5 clients.
If you want/need a krb4 client, you have to build without krb5.
If you have a make which supports VPATH in a manner compatible with
GNU make, you can build in a separate directory. Simply invoke the
configure script from within the build directory and configure will
locate the source directory for you. (If that doesn't work for some
reason, you can also specify "--srcdir=SOURCEDIR" on the configuration
line.)
If configure can't properly find your X11 include or library
directories, add "--x-includes=INCDIR" and "--x-libraries=LIBDIR" to
the configure line. To build without X11 support, add "--without-x"
to the configure line.
If you have Hesiod and/or Kerberos installed such that you can't
specify a single prefix for both include files and libraries, set the
environment variables CPPFLAGS and LDFLAGS to include the relevant
directories, and just configure with "--with-krb4" and
"--with-hesiod". For instance (for a csh-like shell):
setenv CPPFLAGS "-I/opt/athena/include"
setenv LDFLAGS "-I/opt/athena/arch/sparc/lib"
./configure --with-hesiod --with-krb4
make
make install
Although it's not necessary for Zephyr to function correctly, you
should add the following services to /etc/services if possible:
zephyr-clt 2103/udp # Zephyr serv-hm connection
zephyr-hm 2104/udp # Zephyr hostmanager
zephyr-hm-srv 2105/udp # Zephyr hm-serv connection
To learn how to use Zephyr, read the file USING and the man pages for
the various Zephyr programs. To learn how to operate a Zephyr
service, read the file OPERATING.
We have tried to make Zephyr as portable as is reasonably possible,
but have not taken into account every possible kind of system. If you
have any problems building or installing Zephyr according to these
instructions, please go to http://zephyr.1ts.org and open a ticket.

65
Makefile.in Normal file
View File

@ -0,0 +1,65 @@
SHELL = /bin/sh
prefix=@prefix@
exec_prefix=@exec_prefix@
datadir=@datadir@
sysconfdir=@sysconfdir@
sbindir=@sbindir@
datarootdir=@datarootdir@
includedir=@includedir@
mandir=@mandir@
bindir=@bindir@
libdir=@libdir@
srcdir=@srcdir@
top_srcdir=@top_srcdir@
INSTALL=@INSTALL@
SUBDIRS=lib clients server zhm zwgc
build:
$(MAKE) all
h/zephyr_version.h: always
sh -x ${srcdir}/new_vers.sh $(top_srcdir)
clean: clean_version
clean_version:
$(RM) h/zephyr_version.h
all: h/zephyr_version.h
all check clean:
for i in ${SUBDIRS}; do (cd $$i; ${MAKE} $@) || exit 1; done
install:
${INSTALL} -d ${DESTDIR}${prefix}
${INSTALL} -d ${DESTDIR}${exec_prefix}
${INSTALL} -d ${DESTDIR}${bindir}
${INSTALL} -d ${DESTDIR}${libdir}
${INSTALL} -d ${DESTDIR}${libdir}/pkgconfig
${INSTALL} -d ${DESTDIR}${datadir}
${INSTALL} -d ${DESTDIR}${datadir}/zephyr
${INSTALL} -d ${DESTDIR}${sysconfdir}
${INSTALL} -d ${DESTDIR}${sysconfdir}/zephyr/acl
${INSTALL} -d ${DESTDIR}${sbindir}
${INSTALL} -d ${DESTDIR}${includedir}
${INSTALL} -d ${DESTDIR}${includedir}/zephyr
${INSTALL} -d ${DESTDIR}${mandir}
${INSTALL} -d ${DESTDIR}${mandir}/man1
${INSTALL} -d ${DESTDIR}${mandir}/man3
${INSTALL} -d ${DESTDIR}${mandir}/man8
${INSTALL} -m 644 ${srcdir}/h/zephyr/mit-copyright.h \
${DESTDIR}${includedir}/zephyr
${INSTALL} -m 644 ${srcdir}/h/zephyr/zephyr.h \
${DESTDIR}${includedir}/zephyr
${INSTALL} -m 644 zephyr.pc ${DESTDIR}${libdir}/pkgconfig
${INSTALL} -m 644 h/zephyr/zephyr_err.h ${DESTDIR}${includedir}/zephyr
for i in ${SUBDIRS}; do (cd $$i; ${MAKE} $@) || exit 1; done
always:
.PHONY: all build check install clean clean_version always

27
NOTES Normal file
View File

@ -0,0 +1,27 @@
Please observe the following notes when making changes to the source
tree.
The directory h contains header files used internally in the zephyr
source tree. The directory h/zephyr contains header files containing
declarations for the Zephyr API. h/zephyr/zephyr_err.h is generated
from lib/zephyr/zephyr_err.et when lib/zephyr is built.
h/zephyr/zephyr.h is generated by configure, as is h/config.h. Those
header files live in the build tree. All other header files in h live
in the source tree.
h/config.h is generated by configure and contains the results of
configure tests as well as definitions for the installation
configuration directory and data directory. h/sysdep.h uses
h/config.h to include various header files or make various external
declarations which many programs might be interested in. h/internal.h
contains declarations internal to the "Zephyr system proper," which
includes the Zephyr library, the server, the hostmanager, and (for
now) zstat.
h/zephyr/zephyr.h is a public header file; that is, it is installed
with the Zephyr system. As such, this header file may need to work
with compilers other than the compiler used to build the Zephyr system
itself. Thus, we use __STDC__ (both in h/sysdep.h and in zephyr.h) to
guess whether the compiler will handle const, prototypes, and stdarg.
This is unfortunately not as reliable as using autoconf features like
AC_C_CONST.

58
OPERATING Normal file
View File

@ -0,0 +1,58 @@
This file explains how to operate a Zephyr service once you have
installed Zephyr on all the relevant machines and file servers in your
environment. To learn how to configure, build, and install Zephyr,
read the file INSTALL.
To set up Zephyr service at a site, follow these steps:
1. Choose the machines you wish to have act as Zephyr servers at your
site. Expect the server to be CPU-efficient but to consume a bit more
memory than you might expect (at MIT, with around a thousand
simultaneous users, the Zephyr server's data size is 40MB). If you
have a lot of users, the server should have enough memory so that the
process doesn't swap.
2a. If you configured Zephyr with Hesiod support, make sure your
Hesiod realm has a "zephyr.sloc" entry containing a record for each
server. (Each entry should contain the name of the server, nothing
else.) The Zephyr servers will use the zephyr.sloc entry to find the
other servers. Host managers will use the zephyr.sloc entry to find
the Zephyr servers by default; however, you can control the set of
servers for each host manager by giving each host a
"<hostname>.cluster" entry containing a record "zcluster <serverset>".
If such a record is found, the host manager will resolve
"<serverset>.sloc" instead of "zephyr.sloc".
2b. If you configured Zephyr without Hesiod support, and you have
multiple Zephyr servers, each server should have a file "server.list"
in the configuration directory (which is /etc/athena/zephyr if you
configured with --enable-athena, or /usr/local/etc/zephyr if you
installed Zephyr in /usr/local and didn't use --enable-athena). This
file should contain a list of the servers, one per line. The server
will read and use this file if it exists even if the server was built
with hesiod support.
3. If you configured Zephyr with Kerberos 5 support, make a service
key "zephyr/zephyr@<your realm>" and install a keytab for that service
as "krb5.keytab" in the configuration directory of each of your zephyr
servers. Note that you need to ktadd the keytab only once and copy it
around; the files on all the servers should be identical.
4. Start zephyrd from the system binary directory (/usr/athena/etc if
you configured with --enable-athena, /usr/local/sbin if you installed
in /usr/local and didn't use --enable-athena). zephyrd logs as
service "local6"; watch the syslogs for error messages. Arrange for
zephyrd to be run at boot time on your server machines.
5. Each client machine should run zhm (the Zephyr Host Manager) from
the local system binary directory (/etc/athena for --enable-athena,
/usr/local/sbin if you installed in /usr/local and didn't use
--enable-athena). If you built Zephyr without Hesiod support, you
should start zhm as "zhm server1 server2 server3 ..." so that zhm
knows where the Zephyr servers are. Do not use "localhost" or
"127.0.0.1" as a server name, or zhm will become confused.
You can send a SIGFPE signal to the server process to make it dump its
subscription database to /var/tmp/zephyr.db. (If /var/tmp didn't
exist when Zephyr was built, the subscription database will be dumped
in /usr/tmp or /tmp instead.)

25
README.in Normal file
View File

@ -0,0 +1,25 @@
This is version @VERSION@ of the Project Athena Zephyr
notification system.
Zephyr allows users to send messages to other users or to groups of
users. Users can view incoming Zephyr messages as windowgrams
(transient X windows) or as text on a terminal. Zephyr can optionally
make use of the Kerberos version 4 security library or the Hesiod
service name resolution library.
Bug reports or patches should go to bug-zephyr@mit.edu. Please do not
send questions about snapshots; they are not supported.
To find out how to configure, build, and install Zephyr, read the file
INSTALL.
To find out how to operate a Zephyr service, read the file OPERATING.
To find out how to use an existing Zephyr service, read the file
USING.
Please read the file NOTES before making any modifications to the
source tree.
--Karl Ramm
http://zephyr.1ts.org/

77
USING Normal file
View File

@ -0,0 +1,77 @@
This file explains how to use an existing Zephyr service once you've
built and installed the Zephyr distribution. To learn how to build
and install Zephyr, read the file INSTALL. To learn how to set up
Zephyr service at a site, read the file OPERATING.
First, before you can do anything else, your client machine must be
running zhm from the local system binary directory (/etc/athena/zephyr
if you built Zephyr with --enable-athena, /usr/local/sbin/zephyr if
you installed Zephyr in /usr/local and didn't use --enable-athena).
Only one copy of zhm can be running on a given machine, and it can be
started by any user. If you're using a machine you don't administer,
you may want to check if the machine is configured to start up zhm
automatically at boot time.
Once you have zhm running, you can start receiving zephyrgrams by
running the command:
zwgc
"zwgc" stands for "Zephyr WindowGram Client". If you built Zephyr
with X support and are using an X display, you will receive messages
as windows on your screen (click on them to get rid of them);
otherwise, you will receive messages in your terminal as text. Read
the man page on zwgc to find out how to configure it using the
.zwgc.desc file in your home directory.
You can send messages to another user with:
zwrite username
To write to groups of users, you must agree on a "class" and/or
"instance" to write to (this will be explained in greater detail
below). At MIT, most users communicate in private groups via classes.
Suppose a bunch of people wanted to communicate on a class "newclass".
They would all subscribe to the class with the command:
zctl add newclass \* \*
and send messages with:
zwrite -c newclass
The "zctl add" command adds the subscription to the .zephyr.subs file
in your home directory, so that you will automatically be subscribed
to the class the next time you run zwgc. If you just want to
subscribe without adding the subscription to your .zephyr.subs file,
use "zctl sub" instead of "zctl add".
Now for a bit more explanation about what classes and instances are:
every Zephyr message is send to a class, an instance, and a recipient,
commonly written as <class,instance,recipient>. The default class is
"MESSAGE"; the default instance is "PERSONAL". When you use "zwrite
username", you are sending a message to <MESSAGE,PERSONAL,username>.
If you don't specify a username on the zwrite command line, you will
be sending to the recipient "*", so when you use "zwrite -c newclass",
you are sending a message to <newclass,PERSONAL,*>.
Similarly, every time you request a subscription, you are subscribing
to a class, an instance, and a recipient. The recipient must be
either "*" or your username. The instance can be any string; however,
if you subscribe to instance "*", you will receive messages to any
instance as long as the class and recipient also match. The class can
be any string; "*" has no special meaning for class names. When you
start zwgc, you are automatically subscribed to
<MESSAGE,PERSONAL,yourusername> and <MESSAGE,URGENT,yourusername> even
if you don't explicitly request those subscriptions.
As an example of how you might use these features, at MIT we have
several frequently-used instances of class MESSAGE, called
"white-magic", "help", "weather", "tmbg" and so forth. These are
commonly known as "public" instances because they are not intended to
exclude anyone. Users can subscribe to individual instances using
"zctl add message help \*", or they can subscribe to all of them at
once using "zctl add message \* \*". (If users do this, they can tell
zwgc to filter out messages from certain instances; see the man page
for zwgc.) If users want to have semi-private group conversations,
they use separate classes, as described earlier.

13
clients/Makefile.in Normal file
View File

@ -0,0 +1,13 @@
SHELL = /bin/sh
SUBDIRS=zaway zctl zleave zlocate znol \
zshutdown_notify zstat zwrite
all:
for i in ${SUBDIRS}; do (cd $$i; ${MAKE} $@) || exit 1; done
check install clean:
for i in ${SUBDIRS}; do (cd $$i; ${MAKE} $@) || exit 1; done
.PHONY: all check install clean

56
clients/zaway/Makefile.in Normal file
View File

@ -0,0 +1,56 @@
SHELL=@SHELL@
prefix=@prefix@
exec_prefix=@exec_prefix@
datadir=@datadir@
sysconfdir=@sysconfdir@
sbindir=@sbindir@
lsbindir=@lsbindir@
datarootdir=@datarootdir@
top_builddir=../..
includedir=@includedir@
mandir=@mandir@
libdir=@libdir@
bindir=@bindir@
srcdir=@srcdir@
top_srcdir=@top_srcdir@
BUILDTOP=../..
VPATH=@srcdir@
LIBTOOL=@LIBTOOL@
CC=@CC@
INSTALL=@INSTALL@
LIBZEPHYR=${BUILDTOP}/lib/libzephyr.la
CPPFLAGS=@CPPFLAGS@
CFLAGS=@CFLAGS@
ALL_CFLAGS=${CFLAGS} -I${top_srcdir}/h -I${BUILDTOP}/h ${CPPFLAGS}
LDFLAGS=@LDFLAGS@
LIBS=${LIBZEPHYR} @LIBS@ -lcom_err
OBJS= zaway.o
all: zaway
zaway: ${OBJS} ${LIBZEPHYR}
${LIBTOOL} --mode=link ${CC} ${LDFLAGS} -o $@ ${OBJS} ${LIBS}
.c.o:
${CC} -c ${ALL_CFLAGS} $<
check:
install: zaway
${LIBTOOL} --mode=install ${INSTALL} -m 755 zaway ${DESTDIR}${bindir}
${INSTALL} -m 644 ${srcdir}/zaway.1 ${DESTDIR}${mandir}/man1
clean:
${LIBTOOL} --mode=clean rm -f zaway
rm -f ${OBJS}
${OBJS}: ${top_srcdir}/h/sysdep.h ${BUILDTOP}/h/config.h
${OBJS}: ${BUILDTOP}/h/zephyr/zephyr.h ${BUILDTOP}/h/zephyr/zephyr_err.h
.PHONY: all check install clean

120
clients/zaway/zaway.1 Normal file
View File

@ -0,0 +1,120 @@
.\" $Id$
.\"
.\" Copyright 1987,1988 by the Massachusetts Institute of Technology
.\" All rights reserved. The file /usr/include/zephyr/mit-copyright.h
.\" specifies the terms and conditions for redistribution.
.\"
.\" @(#)zaway.1 6.1 (MIT) 7/9/87
.\"
.TH ZAWAY 1 "July 1, 1988" "MIT Project Athena"
.ds ]W MIT Project Athena
.SH NAME
zaway \- tell other people via Zephyr that you aren't around
.SH SYNOPSIS
.B zaway
[
.I OPTIONS
]
[
.I FILE
]
.SH DESCRIPTION
.I zaway
provides a way for you to automatically send replies when other people
contact you using
.I zwrite(1). zaway
subscribes itself to class "MESSAGE", instance "*", so that it can
monitor your incoming messages. It does not affect the operation of any
other client receiving messages.
.I zaway
is typically run when you are leaving your terminal or display
temporarily.
.I zaway
usually never exits; when you return to your terminal you should type
the interrupt character (usually ^C) in order to make
.I zaway
exit.
.SS OPTIONS
.TP
.I "\-m STRING"
Use STRING as the body of the auto-reply message. Any message file
(specified on the command line or the default) is ignored.
.TP
.I "\-w"
Watch the invoking user's location status. If the user is locatable
anywhere, no auto-replies will be sent.
.TP
.I "\-h"
Displays a short usage message and exits.
.PP
.I zaway
uses a message file (which defaults
to $HOME/.away) to describe what reponses should be sent to which
senders. The general format of this file
is:
.PP
.nf
>name
>name
message
>name
message
.fi
.PP
Any number of user names may be specified preceding the message to send
to those senders. If a user name appears more than once, the message will
be a concatenation of each of the appropriate messages. There are
two special names: "*" indicates that the following message should be
sent to all senders and "%" indicates that the following message should
only be sent if the user name has not matched yet.
.PP
If no file is specified,
and no default file can be found, the following message is returned:
.sp
.in +5
I'm sorry, but I am currently away from the terminal and am
not able to receive your message.
.in -5
.sp
If a user name does not match any of those listed in the file, and no
"*" or "%" field is specified, no return message is sent. All
messages are preceded by a signature "Automated reply:". To avoid
loops, messages are not sent in response to messages beginning with an
"Automated reply:" signature or sent by the same Kerberos principal as
the user running
.I zaway.
.SH SAMPLE FILE
.nf
>eichin
>tony
Hi there guys! I'm in the other room right now.
I'll be back in 5 minutes or so.
>jruser
Sorry, but I'm gone for the day...
>%
Hello...I'm not sure who you are. I'll be back soon,
though.
>*
This message comes to you compliments of zaway!
.fi
The final "compliments" message will be included in all messages,
whereas the "I'm not sure" message will only be included in messages that
are not from "eichin", "tony", or "jruser".
.SH FILES
$HOME/.away
.SH SEE ALSO
zephyr(1), zwgc(1), zwrite(1), zhm(8), zephyrd(8)
.br
Project Athena Technical Plan Section E.4.1, `Zephyr Notification
Service'
.SH AUTHOR
.PP
Robert S. French (MIT-Project Athena)
.SH RESTRICTIONS
Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
All Rights Reserved.
.br
.I zephyr(1)
specifies the terms and conditions for redistribution.

270
clients/zaway/zaway.c Normal file
View File

@ -0,0 +1,270 @@
/* This file is part of the Project Athena Zephyr Notification System.
* It contains code for the "zaway" command.
*
* Created by: Robert French
*
* $Id$
*
* Copyright (c) 1987, 1993 by the Massachusetts Institute of Technology.
* For copying and distribution information, see the file
* "mit-copyright.h".
*/
#include <sysdep.h>
#include <zephyr/mit-copyright.h>
#include <zephyr/zephyr.h>
#include <pwd.h>
#ifndef lint
static const char rcsid_zaway_c[] = "$Id$";
#endif
#define MESSAGE_CLASS "MESSAGE"
#define DEFAULT_MSG "I'm sorry, but I am currently away from the terminal and am\nnot able to receive your message.\n"
#define RESPONSE_OPCODE ""
static char *find_message(ZNotice_t *, FILE *);
RETSIGTYPE cleanup(int);
u_short port;
static void
usage(char *name)
{
printf("Usage: %s [OPTIONS] [FILE]\n"
"\n"
" -m STRING use STRING as the body of the reply message\n"
" -w watch your location and only reply if you aren't locatable\n"
" -h display this help and exit\n",
name);
}
int
main(int argc,
char *argv[])
{
FILE *fp;
ZNotice_t notice;
ZSubscription_t sub;
register int retval;
struct passwd *pw;
register char *ptr;
char awayfile[BUFSIZ],*msg[2],*envptr;
int optchar, watch_location;
char *cmdline_msg;
int nlocs;
char *charset = NULL;
unsigned short zcharset;
#ifdef _POSIX_VERSION
struct sigaction sa;
#endif
if ((retval = ZInitialize()) != ZERR_NONE) {
com_err(argv[0],retval,"while initializing");
exit(1);
}
port = 0;
if ((retval = ZOpenPort(&port)) != ZERR_NONE) {
com_err(argv[0],retval,"while opening port");
exit(1);
}
sub.zsub_class = MESSAGE_CLASS;
sub.zsub_classinst = "*";
sub.zsub_recipient = ZGetSender();
cmdline_msg = 0;
watch_location = 0;
while ((optchar = getopt(argc, argv, "m:whx:")) != EOF) {
switch (optchar) {
case 'm':
cmdline_msg = optarg;
break;
case 'w':
watch_location = 1;
break;
case 'h':
usage(argv[0]);
return 0;
case 'x':
charset = optarg;
break;
case '?':
fprintf(stderr,
"Unrecognized option '-%c'.\n"
"Try '%s -h' for more information.\n",
optopt, argv[0]);
return 1;
}
}
zcharset = ZGetCharset(charset);
if (argc > optind)
(void) strcpy(awayfile,argv[optind]);
else {
envptr = getenv("HOME");
if (envptr)
(void) sprintf(awayfile,"%s/.away",envptr);
else {
if (!(pw = getpwuid((int) getuid()))) {
fprintf(stderr,"Who are you?\n");
exit(1);
}
(void) sprintf(awayfile,"%s/.away",pw->pw_dir);
}
}
fp = fopen(awayfile,"r");
if (!fp && argc > optind) {
fprintf(stderr,"File %s not found!\n",awayfile);
exit(1);
}
#ifdef _POSIX_VERSION
(void) sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = cleanup;
(void) sigaction(SIGINT, &sa, (struct sigaction *)0);
(void) sigaction(SIGTERM, &sa, (struct sigaction *)0);
(void) sigaction(SIGHUP, &sa, (struct sigaction *)0);
#else
(void) signal(SIGINT, cleanup);
(void) signal(SIGTERM, cleanup);
(void) signal(SIGHUP, cleanup);
#endif
if ((retval = ZSubscribeToSansDefaults(&sub,1,port)) != ZERR_NONE) {
com_err(argv[0],retval,"while subscribing");
exit(1);
}
for (;;) {
if ((retval = ZReceiveNotice(&notice, (struct sockaddr_in *)0)) != ZERR_NONE) {
if (retval != ETIMEDOUT)
com_err(argv[0],retval,"while receiving notice");
continue;
}
if (strcmp(notice.z_sender,ZGetSender()) == 0 ||
strcmp(notice.z_opcode,"PING") == 0 ||
strcmp(notice.z_opcode,"AUTO") == 0 ||
strcmp(notice.z_message,"Automated reply:") == 0) {
ZFreeNotice(&notice);
continue;
}
if (watch_location) {
if ((retval = ZLocateUser(ZGetSender(), &nlocs, ZNOAUTH))
!= ZERR_NONE) {
com_err(argv[0],retval,"while locating self");
continue;
}
if (nlocs != 0) {
/* User is logged in. Don't send an autoreply. */
continue;
}
ZFlushLocations();
}
if (cmdline_msg) {
ptr = strdup(cmdline_msg);
if (!ptr) {
com_err(argv[0],ENOMEM,"while getting cmdline message");
exit(1);
}
}
else if (fp) {
if (!(ptr = find_message(&notice,fp))) {
ZFreeNotice(&notice);
continue;
}
}
else {
ptr = malloc(sizeof(DEFAULT_MSG)+1);
if (!ptr) {
com_err(argv[0],ENOMEM,"while getting default message");
exit(1);
}
(void) strcpy(ptr,DEFAULT_MSG);
}
notice.z_recipient = notice.z_sender;
notice.z_sender = 0;
notice.z_default_format = "";
notice.z_opcode = RESPONSE_OPCODE;
notice.z_charset = zcharset;
msg[0] = "Automated reply:";
msg[1] = ptr;
notice.z_message_len = strlen(notice.z_message)+1;
if ((retval = ZSendList(&notice,msg,2,ZNOAUTH)) != ZERR_NONE) {
com_err(argv[0],retval,"while sending notice");
}
free(ptr);
ZFreeNotice(&notice);
}
}
char *
find_message(ZNotice_t *notice,
FILE *fp)
{
char *ptr,*ptr2;
char bfr[BUFSIZ],sender[BUFSIZ];
int gotone,lastwasnt;
rewind(fp);
(void) strcpy(sender,notice->z_sender);
ptr2 = strchr(sender,'@');
if (ptr2)
*ptr2 = '\0';
ptr = 0;
gotone = 0;
lastwasnt = 0;
while (fgets(bfr,sizeof bfr,fp) != (char *)0) {
if (*bfr == '>') {
if (lastwasnt)
gotone = 0;
bfr[strlen(bfr)-1] = '\0';
ptr2 = strchr(bfr,'@');
if (ptr2)
*ptr2 = '\0';
if (!strcmp(bfr+1,sender) ||
!strcmp(bfr+1,"*") ||
(!strcmp(bfr+1,"%") && !ptr))
gotone = 1;
lastwasnt = 0;
}
else {
if (gotone) {
if (!ptr) {
ptr = malloc((unsigned)(strlen(bfr)+1));
*ptr = '\0';
}
else
ptr = realloc(ptr,(unsigned)(strlen(bfr)+strlen(ptr)+1));
(void) strcat(ptr,bfr);
}
lastwasnt = 1;
}
}
return (ptr);
}
RETSIGTYPE
cleanup(int ignored)
{
ZCancelSubscriptions(port);
exit(1);
}

71
clients/zctl/Makefile.in Normal file
View File

@ -0,0 +1,71 @@
SHELL=@SHELL@
prefix=@prefix@
exec_prefix=@exec_prefix@
datadir=@datadir@
sysconfdir=@sysconfdir@
sbindir=@sbindir@
lsbindir=@lsbindir@
datarootdir=@datarootdir@
includedir=@includedir@
mandir=@mandir@
libdir=@libdir@
bindir=@bindir@
top_builddir=../..
srcdir=@srcdir@
top_srcdir=@top_srcdir@
BUILDTOP=../..
VPATH=@srcdir@
LIBTOOL=@LIBTOOL@
CC=@CC@
INSTALL=@INSTALL@
editman = sed \
-e 's|@datadir[@]|${datadir}|g' \
-e 's|@sysconfdir[@]|${sysconfdir}|g' \
-e 's|@sbindir[@]|${sbindir}|g' \
-e 's|@lsbindir[@]|${lsbindir}|g'
LIBZEPHYR=${BUILDTOP}/lib/libzephyr.la
CPPFLAGS=@CPPFLAGS@
CFLAGS=@CFLAGS@
ALL_CFLAGS=${CFLAGS} -I${top_srcdir}/h -I${BUILDTOP}/h @X_CFLAGS@ ${CPPFLAGS}
LDFLAGS=@LDFLAGS@
LIBS=${LIBZEPHYR} @SS_LIBS@ @LIBS@ -lcom_err
SS_OBJS=zctl_cmds.o
OBJS= zctl.o @SS_OBJS@
all: zctl zctl.1
zctl: ${OBJS} ${LIBZEPHYR}
${LIBTOOL} --mode=link ${CC} ${LDFLAGS} -o $@ ${OBJS} ${LIBS}
zctl_cmds.c: zctl_cmds.ct
mk_cmds ${srcdir}/zctl_cmds.ct
.c.o:
${CC} -c ${ALL_CFLAGS} $<
zctl.1: ${srcdir}/zctl.1.in Makefile
${editman} ${srcdir}/$@.in > $@.tmp
mv $@.tmp $@
check:
install: zctl zctl.1
${LIBTOOL} --mode=install ${INSTALL} -m 755 zctl ${DESTDIR}${bindir}
${INSTALL} -m 644 zctl.1 ${DESTDIR}${mandir}/man1
clean:
${LIBTOOL} --mode=clean rm -f zctl
rm -f ${OBJS} zctl_cmds.c
rm -f zctl.1
${OBJS}: ${top_srcdir}/h/sysdep.h ${BUILDTOP}/h/config.h
${OBJS}: ${BUILDTOP}/h/zephyr/zephyr.h ${BUILDTOP}/h/zephyr/zephyr_err.h
.PHONY: all check install clean

319
clients/zctl/zctl.1.in Normal file
View File

@ -0,0 +1,319 @@
.\" $Id$
.\"
.\" Copyright 1987,1988 by the Massachusetts Institute of Technology
.\" All rights reserved. The file /usr/include/zephyr/mit-copyright.h
.\" specifies the terms and conditions for redistribution.
.\"
.\"
.TH ZCTL 1 "July 1, 1988" "MIT Project Athena"
.ds ]W MIT Project Athena
.SH NAME
zctl \- zephyr control program
.SH SYNOPSIS
.B zctl
[
.I options
]
.SH DESCRIPTION
.I Zctl
is a general purpose control program for the
.I Zephyr(1)
Notification Service. It allows the user to subscribe to specific
notice types, to save the subscriptions in a file (default
$HOME/.zephyr.subs), to change his location information, and to send
control messages to the HostManager,
.I zhm(8),
and the WindowGram client,
.I zwgc(1).
.PP
The commands may be typed on the command line, or may be entered
interactively by just typing
.I zctl
and then typing commands to the prompt.
.br
.B NOTE:
For all commands accepting an optional \fIrecipient\fR argument, the
\fIrecipient\fR defaults to your Kerberos principal. You may also
subscribe to recipient ``\fI*\fR''. If you specify a recipient, it is
silently converted to ``\fI*\fR''.
.br
The commands are as follows:
.TP 15
.B add \fIclass instance\fR [ \fIrecipient\fR ]
Subscribe to \fIclass, instance, recipient\fR, and add this triplet to
the subscriptions file.
.TP
.B add_unsubscription \fIclass instance\fR [ \fIrecipient\fR ]
Unsubscribe to \fIclass, instance, recipient\fR, and add this triplet
to the subscriptions file as an un-subscription.
For an explanation of un-subscriptions, see below.
.TP
.B cancel
Cancel all subscriptions.
.TP
.B defaults
Retrieve the default subscription list from the Zephyr server.
.TP
.B delete \fIclass instance\fR [ \fIrecipient\fR ]
Unsubscribe to \fIclass, instance, recipient\fR, and remove this triplet
from the subscriptions file.
.TP
.B delete_unsubscription \fIclass instance\fR [ \fIrecipient\fR ]
Unsubscribe to \fIclass, instance, recipient\fR, and remove this triplet
from the subscriptions file as an un-subscription.
.TP
.B file \fR[ \fIfile\fR ]
Set default subscriptions file to \fIfile\fR. If \fIfile\fR isn't specified,
show what the current subscriptions file is.
.TP
.B flush_locs \fR[ \fIuser\fR ]
Tell the Zephyr servers to flush all location information associated with
\fIuser\fR, or with the user running the command if none is given. This
should only be used to remove any incorrect data that may have been left
after a system crash. Note that only Operations staff may flush location
information associated with another user.
.TP
.B flush_subs \fR[ \fIrecipient\fR ]
Tell the Zephyr servers to flush all of \fIrecipient\fR's subscriptions,
This differs from the cancel command in that it affects subscriptions for
all of \fIrecipient\fR's clients. Note that only Operations staff may flush
the subscriptions of another user.
.TP
.B hide
Hide your location as maintained by the Zephyr server. This does not
affect the value of the exposure variable (see below, under
.B set).
.TP
.B hm_flush
Tell the HostManager,
.I zhm(8),
to ask the server to flush all state associated with the current host.
.TP
.B list \fR[ \fIfile\fR ]
List contents of current subscriptions file or
.I file.
Any macros in the file (see below) are displayed verbatim and not expanded.
.TP
.B list_requests
List all available commands. May be abbreviated by '?'.
.TP
.B load \fR[ \fIfile\fR ]
Subscribe to all subscription triplets and unsubscribe to all
un-subscription triplets in current subscriptions file or \fIfile\fR.
.TP
.B new_server
Tell the HostManager,
.I zhm(8),
to find a new Zephyr server.
.TP
.B quit
Exit from \fIzctl.
.TP
.B retrieve
Retrieve all current subscriptions from the Zephyr server. These include
subscriptions that might have been made by other programs, such as
.I znol(1).
.TP
.B save \fR[ \fIfile\fR ]
Save all current subscriptions (as returned by the Zephyr server)
into current subscriptions file or \fIfile\fR. The
file will be replaced.
.TP
.B set \fIvar\fR [ \fIvalue\fR ]
Set the value of Zephyr variable \fIvar\fR to \fIvalue\fR, or null if
no \fIvalue\fR is specified. The variable \fBexposure\fR has special
significance, and can only be set to the values none, opstaff, realm-visible,
realm-announced, net-visible, and net-announced. Setting this variable
immediately updates the information in the Zephyr servers (see below for
an explanation of the exposure levels). In addition,
setting this variable to none automatically performs the equivalent of a
.B wg_shutdown
command, and setting it to one of the other values automatically
performs the equivalent of a
.B wg_startup
command.
.br
The variable \fBresolved_addresses\fR determines whether zwgc will,
for an IP address indicating the origin of a message, attempt to look
up the hostname corresponding to that IP address. The value none
indicates that hostnames will never be found, and that the zwgc
fromhost variable will thus always contain an IP address (in
dotted-decimal form). The value all indicates that there will always
be an attempt to look up a hostname. Note that in this case, if you
have any subscriptions with recipient ``\fI*\fR'', these subscriptions
may be revealed to other Zephyr users who operate their own DNS name
servers. Any other value is interpreted as a regular expression;
hostname lookup attempts will occur only if the IP address matches
this regular expression.
.br
Any variable settings you make will be stored in \fI$HOME/.zephyr.vars\fR
.TP
.B show \fIvar\fR [ \fIvar\fR \ ... ]
Show the value of the specified Zephyr variables. If a variable is not
defined in the user's own variables file, the system variables file
(\fI@sysconfdir@/zephyr/zephyr.vars\fR) is searched for a default value.
.TP
.B subscribe \fIclass instance\fR [ \fIrecipient\fR ]
Subscribe to \fIclass, instance, recipient\fR, but don't add this triplet to
the subscriptions file.
.TP
.B unhide
Make your location as maintained by the Zephyr server visible. This does not
affect the value of the exposure variable.
.TP
.B unload \fR[ \fIfile\fR ]
Unsubscribe to all subscription triplets in current subscriptions file
or \fIfile\fR. Un-subscriptions in the file are ignored.
.TP
.B unset \fIvar\fR [ \fIvar\fR \ ... ]
Delete the definitions of the specified Zephyr variables.
.TP
.B unsubscribe \fIclass instance\fR [ \fIrecipient\fR ]
Unsubscribe to \fIclass, instance, recipient\fR, but don't remove this triplet
from the subscriptions file.
.TP
.B wg_exit
Tell the WindowGram client,
.I zwgc(1),
to exit.
.TP
.B wg_read
Tell the WindowGram client,
.I zwgc(1),
to reread its description file.
.TP
.B wg_shutdown
Tell the WindowGram client to shutdown; this causes it to ignore all
notices until a wg_startup command is issued.
.TP
.B wg_startup
Tell the WindowGram client to start accepting notices again; useful
after a wg_shutdown command has been issued.
.SH MACROS and SUBSCRIPTION FILES
There are three macros,
.I %host%, %canon%, \fRand\fI %me%. %host%
is converted to the current hostname, \fI%canon%\fR is converted to the
official hostname as returned by
.I gethostbyname(3),
and \fI%me%\fR is converted to your Kerberos principal. These macros can be
used in your \fI$HOME/.zephyr.subs\fR file or as arguments to commands
to specify the
.I class
or
.I instance
fields. A sample \fI$HOME/.zephyr.subs\fR file might contain the following:
.PP
.nf
message,urgent,%me%
syslog,%host%,*
mail,pop,%me%
.fi
.PP
.I Zctl
reads the environment variable \fBWGFILE\fR, to find the name of the
file where the windowgram port resides. If \fBWGFILE\fR is not set,
the file name defaults to /tmp/wg.\fIuid\fR, where \fIuid\fR is the
user's UNIX uid.
.SH UN-SUBSCRIPTIONS
The zephyr server,
.I zephyrd(8),
maintains default subscriptions which are automatically added to all
users' subscriptions at the time of their first subscription during a
login session. If you wish to automatically remove some of these
default subscriptions, you use
.B un-subscriptions.
When you
.B load
a subscription file containing
un-subscriptions, the un-subscriptions are automatically sent to the
server as if you had used the
.B unsubscribe
command.
.SH EXPOSURE LEVELS
The different exposure levels affect the operation of zephyr and its
interaction with the user, as follows:
.TP 10
.I none
This completely disables Zephyr for the user. The user is not
registered with Zephyr. No user location information is
retained by Zephyr. No login or logout announcements will be
sent. No subscriptions will be entered for the user, and no notices
will be displayed by
.I zwgc(1).
.TP
.I opstaff
The user is registered with Zephyr. No login or logout
announcements will be sent, and location information will only be
visible to Operations staff. Default subscriptions and any additional
personal subscriptions will be entered for the user.
.TP
.I realm-visible
The user is registered with Zephyr. User location information is retained by
Zephyr and made available only to users within the user's
Kerberos realm. No login or logout announcements will be sent. This
is the system default. Default subscriptions and any additional
personal subscriptions will be entered for the user.
.TP
.I realm-announced
The user is registered with Zephyr. User location information is retained by
Zephyr and made available only to users authenticated within the user's
Kerberos realm. Login and logout announcements will be sent, but only to
users within the user's Kerberos realm who have explicitly requested
such via subscriptions. Default subscriptions and any additional
personal subscriptions will be entered for the user.
.TP
.I net-visible
The user is registered with Zephyr. User location information is
retained by Zephyr and made available to any authenticated user who
requests such. Login and logout announcements will be sent only to users
within the user's Kerberos realm who have explicitly requested such via
subscriptions. Default subscriptions and any additional personal
subscriptions will be entered for the user.
.TP
.I net-announced
The user is registered with Zephyr. User location information is retained by
Zephyr and made available to any authenticated user who requests such. Login
and logout announcements will be sent to any user has requested such.
Default subscriptions and any additional personal
subscriptions will be entered for the user.
.SH EXAMPLES
.TP 25
.B zctl
Runs \fIzctl\fR in interactive mode.
.TP
.B zctl load
Load subscriptions and un-subscriptions from \fI$HOME/.zephyr.subs\fR file.
.TP
.B zctl sub message personal
Subscribe to personal messages, but don't add this to the
subscriptions file.
.TP
.B zctl save
Save all current subscriptions to the default subscriptions file.
.TP
.B zctl set exposure none
Set your exposure level to `none', effectively turning off Zephyr.
.SH SEE ALSO
zephyr(1), zwgc(1), zhm(8), zephyrd(8)
gethostbyname(3)
.br
Project Athena Technical Plan Section E.4.1, `Zephyr Notification
Service'
.SH FILES
/tmp/wg.*
.br
$HOME/.zephyr.subs
.br
$ZEPHYR_VARS or $HOME/.zephyr.vars
.br
@sysconfdir@/zephyr/zephyr.vars
.SH AUTHOR
.PP
Robert S. French (MIT-Project Athena)
.sp
.SH RESTRICTIONS
Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
All Rights Reserved.
.br
.I zephyr(1)
specifies the terms and conditions for redistribution.

1391
clients/zctl/zctl.c Normal file

File diff suppressed because it is too large Load Diff

101
clients/zctl/zctl_cmds.ct Normal file
View File

@ -0,0 +1,101 @@
# $Id$
#
command_table zctl_cmds;
request set_file, "Set default subscriptions file.",
file;
request cancel_subs, "Cancel all subscriptions.",
cancel;
request load_subs, "Subscribe to a subscriptions file.",
load, ld;
request load_subs, "Unsubscribe to a subscriptions file.",
unload, unld;
request load_subs, "List a subscriptions file.",
list, ls;
request subscribe, "Subscribe to a class/class instance.",
subscribe, sub;
request subscribe, "Unsubscribe to a class/class instance.",
unsubscribe, unsub;
request sub_file, "Subscribe and add to subscriptions file.",
add;
request sub_file, "Unsubscribe and add to subscriptions file\n as un-subscription.",
add_unsubscription, add_un;
request sub_file, "Unsubscribe and delete subscription from\n subscriptions file.",
delete, del, dl;
request sub_file, "Delete un-subscription from subscriptions file.",
delete_unsubscription, del_un;
request current, "Retrieve current subscriptions.",
retrieve, ret;
request current, "Retrieve system-wide default subscriptions.",
defaults, defs;
request current, "Save current subscriptions (replacing existing file).",
save;
request show_var, "Show a variable's value.",
show;
request set_var, "Set a variable's value.",
set;
request unset_var, "Delete a variable's value.",
unset;
request wgc_control, "Get the WindowGram to reread its description file.",
wg_read;
request wgc_control, "Tell the WindowGram not to react to incoming notices.",
wg_shutdown;
request wgc_control, "Tell the WindowGram to react to incoming notices.",
wg_startup;
request wgc_control, "Tell the WindowGram to exit completely.",
wg_exit;
request hm_control, "Tell the server to flush information about this host.",
hm_flush;
request hm_control, "Tell the HostManager to find a new server.",
new_server;
request flush_locations, "Flush all location information.",
flush_locs;
request flush_subscr, "Flush all subscription information.",
flush_subs;
request do_hide, "Hide your location.",
hide;
request do_hide, "Show (un-hide) your location.",
unhide;
request ss_list_requests, "List available commands.",
list_requests, lr, "?";
request ss_quit, "Quit.",
quit, exit, q;
#ifdef CMU_ZCTL_PUNT
request do_punt, "Ignore specified messages.",
punt;
request do_punt, "Stop ignoring specified messages.",
unpunt;
request list_punts, "List current messages to ignore.",
list_punts, lp;
#endif
end;

View File

@ -0,0 +1,56 @@
SHELL=@SHELL@
prefix=@prefix@
exec_prefix=@exec_prefix@
datadir=@datadir@
sysconfdir=@sysconfdir@
sbindir=@sbindir@
lsbindir=@lsbindir@
datarootdir=@datarootdir@
includedir=@includedir@
mandir=@mandir@
libdir=@libdir@
bindir=@bindir@
top_builddir=../..
srcdir=@srcdir@
top_srcdir=@top_srcdir@
BUILDTOP=../..
VPATH=@srcdir@
LIBTOOL=@LIBTOOL@
CC=@CC@
INSTALL=@INSTALL@
LIBZEPHYR=${BUILDTOP}/lib/libzephyr.la
CPPFLAGS=@CPPFLAGS@
CFLAGS=@CFLAGS@
ALL_CFLAGS=${CFLAGS} -I${top_srcdir}/h -I${BUILDTOP}/h ${CPPFLAGS}
LDFLAGS=@LDFLAGS@
LIBS=${LIBZEPHYR} @LIBS@ -lcom_err
OBJS= zleave.o
all: zleave
zleave: ${OBJS} ${LIBZEPHYR}
${LIBTOOL} --mode=link ${CC} ${LDFLAGS} -o $@ ${OBJS} ${LIBS}
.c.o:
${CC} -c ${ALL_CFLAGS} $<
check:
install: zleave
${LIBTOOL} --mode=install ${INSTALL} -m 755 zleave ${DESTDIR}${bindir}
${INSTALL} -m 644 ${srcdir}/zleave.1 ${DESTDIR}${mandir}/man1
clean:
${LIBTOOL} --mode=clean rm -f zleave
rm -f ${OBJS}
${OBJS}: ${top_srcdir}/h/sysdep.h ${BUILDTOP}/h/config.h
${OBJS}: ${BUILDTOP}/h/zephyr/zephyr.h ${BUILDTOP}/h/zephyr/zephyr_err.h
.PHONY: all check install clean

107
clients/zleave/zleave.1 Normal file
View File

@ -0,0 +1,107 @@
.\" $Id$
.\"
.\" Copyright (c) 1980 Regents of the University of California.
.\" All rights reserved. The Berkeley software License Agreement
.\" specifies the terms and conditions for redistribution.
.\"
.\"
.TH ZLEAVE 1 "July 1, 1988" "MIT Project Athena"
.ds ]W MIT Project Athena
.SH NAME
zleave \- notify you via Zephyr when you have to leave
.SH SYNOPSIS
.B zleave
[
.RI [+] hhmm
[
.I -m "Reminder Message"
] ]
.br
.B zleave
.I can\fR[\fIcel\fR]
.SH DESCRIPTION
.I Zleave
waits until the specified time, then reminds you that you
have to leave, using the \fIZephyr(1)\fR Notification Service.
You are reminded 5 minutes and 1 minute before the actual
time, at the time, and every minute thereafter.
When you log off,
.I zleave
exits just before it would have sent the next message.
.PP
The time of day is in the form hhmm where hh is a time in
hours (on a 12 or 24 hour clock).
All times are converted to a 12 hour clock, and assumed to
be in the next 12 hours.
.PP
If the time is preceded by `+', the alarm will go off in hours and minutes
from the current time.
.PP
If no argument is given,
.I zleave
prompts with "When do you
have to leave?". A reply of newline causes
.I zleave
to exit,
otherwise the reply is assumed to be a time.
This form is suitable for inclusion in a
.I .login
or
.I .profile.
.PP
The
.I cancel
option cancels the currently running \fIzleave\fR. If another
.I zleave
is running, it is automatically killed when a new time to leave is
set. The process id is stored in the file /tmp/zleave.\fIuid\fR, where
\fIuid\fR is the user's UNIX uid.
.PP
If the
.I -m
argument is specified, the next argument
is appended to the standard message
(a sentence describing how much time remains until the appointed hour)
sent at appropriate times.
If you want to append a multiple-word message, you normally must quote it with
double quotes (") (This is necessary for users of
.IR csh (1)
and
.IR sh (1).)
.PP
.I Zleave
automatically subscribes you to Zephyr class "MESSAGE",
instance "LEAVE". You do not have to add anything to your
default subscriptions file (see
.IR zctl (1)).
The reminder message is displayed by the WindowGram client (usually
.IR zwgc (1)).
.PP
If Zephyr is unavailable,
.I zleave
acts essentially like
.IR leave (1).
.PP
Zleave ignores SIGINT, SIGQUIT, and SIGTERM.
To get rid of it you should either log off or use the
.I cancel
option.
.SH FILES
/tmp/zleave.\fIuid\fR
/tmp/wg.*
.SH SEE ALSO
calendar(1), zephyr(1), leave(1), zwgc(1), zctl(1), csh(1), sh(1)
.br
Project Athena Technical Plan Section E.4.1, `Zephyr Notification
Service'
.SH RESTRICTIONS
Copyright (c) 1980, Regents of the University of California.
All rights reserved.
Redistribution and use in source and binary forms are permitted
provided that this notice is preserved and that due credit is given
to the University of California at Berkeley. The name of the University
may not be used to endorse or promote products derived from this
software without specific written prior permission. This software
is provided ``as is'' without express or implied warranty.
.sp
Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.

424
clients/zleave/zleave.c Normal file
View File

@ -0,0 +1,424 @@
/* This file is part of the Project Athena Zephyr Notification System.
* It contains code for the "zleave" command.
*
* Created by: David Jedlinsky
*
* $Id$
*
* Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
* For copying and distribution information, see the file
* "mit-copyright.h".
*/
#include <sysdep.h>
#include <zephyr/mit-copyright.h>
#include <zephyr/zephyr.h>
#ifndef lint
static const char rcsid_zlocate_c[] = "$Id$";
#endif /* lint */
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
* provided that this notice is preserved and that due credit is given
* to the University of California at Berkeley. The name of the University
* may not be used to endorse or promote products derived from this
* software without specific written prior permission. This software
* is provided ``as is'' without express or implied warranty.
*/
#ifndef lint
char copyright[] =
"@(#) Copyright (c) 1980 Regents of the University of California.\n\
All rights reserved.\n";
#endif /* not lint */
#define MESSAGE_CLASS "MESSAGE"
#define INSTANCE "LEAVE"
/*
* zleave [[+]hhmm [ -m "Reminder Message" ]]
* or
* zleave can[cel]
*
* Reminds you when you have to leave.
* Leave prompts for input and goes away if you hit return.
* Messages are sent through Zephyr. Subscriptions are handled automagically.
* It nags you like a mother hen.
*/
char origlogin[20];
char tempfile[40];
char *whenleave;
char *reminder_message = NULL;
char buff[100];
int use_zephyr=1, oldpid;
void usage(void);
void doalarm(long);
void bother(long, char *);
void delay(long);
int gethm(char *, int *, int*);
int
main(int argc,
char **argv)
{
time_t now;
long when, diff;
int hours, minutes;
char *cp;
FILE *fp;
struct tm *nv;
int port, c;
ZSubscription_t sub;
if (ZInitialize() != ZERR_NONE) {
fprintf(stderr,"No Zephyr! Will write directly to terminal.\n");
use_zephyr = 0;
}
(void) sprintf(tempfile, "/tmp/zleave.%d", (int) getuid());
if (use_zephyr) {
if ((port = ZGetWGPort()) == -1) {
fprintf(stderr,
"Can't find WindowGram subscription port.\n");
fprintf(stderr,"Will write directly to terminal.\n");
use_zephyr = 0;
} else {
sub.zsub_class = MESSAGE_CLASS;
sub.zsub_classinst = INSTANCE;
sub.zsub_recipient = ZGetSender();
if (ZSubscribeToSansDefaults(&sub,1,(u_short)port)
!= ZERR_NONE) {
fprintf(stderr,
"Subscription error! Writing to your terminal...\n");
use_zephyr = 0;
}
}
}
if (!use_zephyr) {
if ((cp = getlogin()) == NULL) {
fputs("leave: You are not logged in.\n", stderr);
exit(1);
}
(void) strcpy(origlogin, cp);
}
c = 1;
while ((c<argc) && (! reminder_message))
if (!strcmp(argv[c++],"-m")) {
if (argv[c])
reminder_message = argv[c];
else
usage();
}
if (!reminder_message)
reminder_message = "";
if (argc < 2) {
printf("When do you have to leave? ");
(void) fflush(stdout);
buff[read(0, buff, sizeof buff)] = 0;
cp = buff;
} else
cp = argv[1];
if (*cp == '\n')
exit(0);
if (*cp == '+') {
cp++;
if (!gethm(cp, &hours, &minutes))
usage();
if (minutes < 0 || minutes > 59)
usage();
diff = 60*hours+minutes;
doalarm(diff);
exit(0);
}
if (!strcmp(cp, "cancel") || !strcmp(cp, "can")) {
if (!(fp = fopen(tempfile,"r"))) {
printf("No zleave is currently running.\n");
exit(0);
}
if (fscanf(fp, "%d", &oldpid) != 1) {
printf("The zleave pid file is corrupted.\n");
(void) fclose(fp);
exit(0);
}
(void) fclose(fp);
if (kill(oldpid,9))
printf("No zleave is currently running.\n");
(void) unlink(tempfile);
exit(0);
}
if (!gethm(cp, &hours, &minutes))
usage();
if (hours > 12)
hours -= 12;
if (hours == 12)
hours = 0;
if (hours < 0 || hours > 12 || minutes < 0 || minutes > 59)
usage();
(void) time(&now);
nv = localtime(&now);
when = 60*hours+minutes;
if (nv->tm_hour > 12)
nv->tm_hour -= 12; /* do am/pm bit */
now = 60 * nv->tm_hour + nv->tm_min;
diff = when - now;
while (diff < 0)
diff += 12*60;
if (diff > 11*60) {
fprintf(stderr, "That time has already passed!\n");
exit(1);
}
doalarm(diff);
exit(0);
}
void
usage(void)
{
fprintf(stderr, "usage: zleave [[+]hhmm [-m \"Reminder Message\"]]\n\
\tor: zleave can[cel]\n");
exit(1);
}
int
gethm(char *cp,
int *hp,
int *mp)
{
char c;
int tod;
tod = 0;
while ((c = *cp++) != '\0') {
if (!isdigit(c))
return(0);
tod = tod * 10 + (c - '0');
}
*hp = tod / 100;
*mp = tod % 100;
return(1);
}
void
doalarm(long nmins)
{
time_t daytime;
char *msg1, *msg2, *msg3, *msg4;
register int i;
long slp1, slp2, slp3, slp4;
long seconds, gseconds;
FILE *fp;
#ifdef _POSIX_VERSION
struct sigaction sa;
#endif
seconds = 60 * nmins;
if (seconds <= 0)
seconds = 1;
gseconds = seconds;
msg1 = "You have to leave in 5 minutes";
if (seconds <= 60*5) {
slp1 = 0;
} else {
slp1 = seconds - 60*5;
seconds = 60*5;
}
msg2 = "Just one more minute!";
if (seconds <= 60) {
slp2 = 0;
} else {
slp2 = seconds - 60;
seconds = 60;
}
msg3 = "Time to leave!";
slp3 = seconds;
msg4 = "You're going to be late!";
slp4 = 60L;
(void) time(&daytime);
daytime += gseconds;
whenleave = ctime(&daytime);
fp = fopen(tempfile,"r");
if (fp) {
if (fscanf(fp, "%d", &oldpid) == 1)
if (!kill(oldpid,9))
printf("Old zleave process killed.\n");
(void) fclose(fp);
}
printf("Alarm set for %s", whenleave);
/* Subscribe to MESSAGE.LEAVE here */
switch(fork()) {
case -1:
perror("fork");
exit(-1);
break;
case 0:
break;
default:
exit(0);
break;
}
if (!(fp = fopen(tempfile, "w")))
fprintf(stderr, "Cannot open pid file.\n");
else {
fprintf(fp, "%d\n", getpid());
if (fclose(fp) == EOF)
(void) perror("fclose on pid file");
}
#ifdef _POSIX_VERSION
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = SIG_IGN;
sigaction(SIGINT, &sa, (struct sigaction *)0);
sigaction(SIGQUIT, &sa, (struct sigaction *)0);
sigaction(SIGTERM, &sa, (struct sigaction *)0);
sigaction(SIGTTOU, &sa, (struct sigaction *)0);
#else
(void) signal(SIGINT, SIG_IGN);
(void) signal(SIGQUIT, SIG_IGN);
(void) signal(SIGTERM, SIG_IGN);
(void) signal(SIGTTOU, SIG_IGN);
#endif
if (slp1)
bother(slp1, msg1);
if (slp2)
bother(slp2, msg2);
bother(slp3, msg3);
for (i = 0; i < 10; i++)
bother(slp4, msg4);
bother(0L, "That was the last time I'll tell you. Bye.");
(void) unlink(tempfile);
exit(0);
}
void
bother(long slp,
char *msg)
{
ZNotice_t notice;
ZNotice_t retnotice;
int retval;
char *real_message;
delay(slp);
if (use_zephyr) {
real_message = (char *) malloc(strlen(msg) +
strlen(reminder_message) + 3);
if (real_message == NULL) {
fprintf (stderr, "zleave: out of memory\n");
exit (1);
}
sprintf(real_message,"%c%s\n%s",'\0',msg,reminder_message);
(void) memset((char *)&notice, 0, sizeof(notice));
notice.z_kind = ACKED;
notice.z_port = 0;
notice.z_charset = ZCHARSET_UNKNOWN;
notice.z_class = MESSAGE_CLASS;
notice.z_class_inst = INSTANCE;
notice.z_recipient = ZGetSender();
notice.z_opcode = "";
notice.z_sender = (char *) 0;
notice.z_default_format = "\n$2";
notice.z_message = real_message;
/* +3: initial null, newline, final null */
notice.z_message_len = strlen(msg)+strlen(reminder_message)+3;
if (ZSendNotice(&notice, ZAUTH) != ZERR_NONE) {
printf("\7\7\7%s\n%s", msg, reminder_message);
use_zephyr = 0;
} else
if ((retval = ZIfNotice(&retnotice, (struct sockaddr_in *) 0,
ZCompareUIDPred,
(char *)&notice.z_uid)) != ZERR_NONE) {
fprintf(stderr,
"zleave: %s while waiting for acknowledgement\n",
error_message(retval));
use_zephyr = 0;
} else
if (retnotice.z_kind == SERVNAK) {
fprintf(stderr,
"zleave: authorization failure while sending\n");
use_zephyr = 0;
} else
if (retnotice.z_kind != SERVACK || !retnotice.z_message_len) {
fprintf(stderr, "zleave: Detected server failure while receiving acknowledgement\n");
use_zephyr = 0;
} else
if (strcmp(retnotice.z_message, ZSRVACK_SENT)) {
/* it wasn't sent */
exit(0);
}
if (!use_zephyr)
exit(1);
ZFreeNotice(&retnotice);
free(real_message);
} else
#ifdef __STDC__
printf("\a\a\a%s\n%s", msg, reminder_message);
#else
printf("\7\7\7%s\n%s", msg, reminder_message);
#endif
}
/*
* delay is like sleep but does it in 100 sec pieces and
* knows what zero means.
*/
void
delay(long secs)
{
long n;
register char *l;
while (secs > 0) {
n = 100;
if (secs < n)
n = secs;
secs -= n;
if (n > 0)
sleep((unsigned) n);
if (!use_zephyr) {
l = getlogin();
if (l == NULL)
exit(0);
if (strcmp(origlogin, l) != 0)
exit(0);
}
}
}
#ifndef HAVE_GETLOGIN
char *getlogin() {
#include <utmp.h>
static struct utmp ubuf;
int ufd;
ufd = open("/etc/utmp",0);
seek(ufd, ttyn(0)*sizeof(ubuf), 0);
read(ufd, &ubuf, sizeof(ubuf));
ubuf.ut_name[sizeof(ubuf.ut_name)] = 0;
return(&ubuf.ut_name);
}
#endif

View File

@ -0,0 +1,56 @@
SHELL=@SHELL@
prefix=@prefix@
exec_prefix=@exec_prefix@
datadir=@datadir@
sysconfdir=@sysconfdir@
sbindir=@sbindir@
lsbindir=@lsbindir@
datarootdir=@datarootdir@
includedir=@includedir@
mandir=@mandir@
libdir=@libdir@
bindir=@bindir@
top_builddir=../..
srcdir=@srcdir@
top_srcdir=@top_srcdir@
BUILDTOP=../..
VPATH=@srcdir@
LIBTOOL=@LIBTOOL@
CC=@CC@
INSTALL=@INSTALL@
LIBZEPHYR=${BUILDTOP}/lib/libzephyr.la
CPPFLAGS=@CPPFLAGS@
CFLAGS=@CFLAGS@
ALL_CFLAGS=${CFLAGS} -I${top_srcdir}/h -I${BUILDTOP}/h ${CPPFLAGS}
LDFLAGS=@LDFLAGS@
LIBS=${LIBZEPHYR} @LIBS@ -lcom_err
OBJS= zlocate.o
all: zlocate
zlocate: ${OBJS} ${LIBZEPHYR}
${LIBTOOL} --mode=link ${CC} ${LDFLAGS} -o $@ ${OBJS} ${LIBS}
.c.o:
${CC} -c ${ALL_CFLAGS} $<
check:
install: zlocate
${LIBTOOL} --mode=install ${INSTALL} -m 755 zlocate ${DESTDIR}${bindir}
${INSTALL} -m 644 ${srcdir}/zlocate.1 ${DESTDIR}${mandir}/man1
clean:
${LIBTOOL} --mode=clean rm -f zlocate
rm -f ${OBJS}
${OBJS}: ${top_srcdir}/h/sysdep.h ${BUILDTOP}/h/config.h
${OBJS}: ${BUILDTOP}/h/zephyr/zephyr.h ${BUILDTOP}/h/zephyr/zephyr_err.h
.PHONY: all check install clean

76
clients/zlocate/zlocate.1 Normal file
View File

@ -0,0 +1,76 @@
.\" $Id$
.\"
.\" Copyright 1987,1988 by the Massachusetts Institute of Technology
.\" All rights reserved. The file /usr/include/zephyr/mit-copyright.h
.\" specifies the terms and conditions for redistribution.
.\"
.\"
.TH ZLOCATE 1 "April 17, 1990" "MIT Project Athena"
.ds ]W MIT Project Athena
.SH NAME
zlocate \- find a user using Zephyr
.SH SYNOPSIS
.B zlocate
[
.B -a
|
.B -d
] [
.B -1
] [
.B -p
] user ...
.SH DESCRIPTION
.I Zlocate
uses the
.I Zephyr(1)
Notification Service to find where a user is currently logged in. If
the user is not logged in, or has set his location information such that
you do not have access to see it,
.I zlocate
prints "Hidden or not logged-in". Otherwise, each machine that the
user is currently logged into is printed, along with the time of
login and location. The location is usually the X window system display
name of the user's display, but may be the terminal name if he is not
using X or for some other reason is only using the terminal interface to
.I zwgc(1).
By default, all zlocate requests are authenticated using
.IR Kerberos .
If you do not have Kerberos tickets, or for some other reason do not
want to authenticate, the
.B -d
option will turn off authentication. The
.B -a
option is the default, authentication on.
When locating multiple users,
.I zlocate
will display the user name on a line by itself, followed by the locations for that user. To display the user name on the same line as the output, use the
.B -1
option (the numeral one).
To look up multiple users in parallel asynchronously, use the
.B -p
option.
.SH DIAGNOSTICS
.I zlocate
exits with status zero (0) if at least one user was found, and one (1)
if no users were found.
.SH SEE ALSO
zctl(1), zephyr(1), znol(1), zwgc(1), zhm(8), zephyrd(8), X(1)
.br
Project Athena Technical Plan Section E.4.1, `Zephyr Notification
Service'
.SH AUTHORS
.PP
Robert S. French (MIT-Project Athena)
.br
Marc Horowitz (MIT-Project Athena)
.SH RESTRICTIONS
Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
All Rights Reserved.
.br
.I zephyr(1)
specifies the terms and conditions for redistribution.

182
clients/zlocate/zlocate.c Normal file
View File

@ -0,0 +1,182 @@
/* This file is part of the Project Athena Zephyr Notification System.
* It contains code for the "zlocate" command.
*
* Created by: Robert French
*
* $Id$
*
* Copyright (c) 1987 by the Massachusetts Institute of Technology.
* For copying and distribution information, see the file
* "mit-copyright.h".
*/
#include <sysdep.h>
#include <zephyr/zephyr.h>
#include <sys/socket.h>
#if !defined(lint) && !defined(SABER)
static const char rcsid_zlocate_c[] = "$Id$";
#endif
int numusers=0, numleft=0, parallel=0, oneline=0;
char *whoami;
static RETSIGTYPE
timeout(int sig)
{
fprintf (stderr, "%s: no response from server\n", whoami);
exit(1);
}
static void
usage(void)
{
printf("Usage: %s [ -a | -d ] [ -p ] [ -1 ] user ... \n",whoami);
exit(1);
}
static void
print_locs(char *user,
int nlocs)
{
int one = 1, retval;
ZLocations_t locations;
if ((!oneline) && (numusers>1))
printf("\t%s:\n",user);
if ((!oneline) && (nlocs == 0))
printf("Hidden or not logged-in\n");
for (;nlocs;nlocs--) {
if ((retval = ZGetLocations(&locations,&one)) != ZERR_NONE) {
com_err(whoami,retval,"while getting location");
exit(1);
}
if (oneline) {
printf("%s:\t%s\t%s\t%s\n",user,locations.host,locations.tty,
locations.time);
} else {
printf("%-42s %-7s %s\n",locations.host, locations.tty, locations.time);
}
}
if ((!oneline) && (numusers > 1) && (numleft > 0))
printf("\n");
}
/*ARGSUSED*/
int
main(int argc,
char *argv[])
{
char user[BUFSIZ],*whichuser;
ZAsyncLocateData_t ald;
int retval,i,numlocs,numfound,loc,auth,rlen;
ZNotice_t notice;
#ifdef _POSIX_VERSION
struct sigaction sa;
#endif
whoami = argv[0];
auth = -1;
argv++;
argc--;
for (i=0; i < argc; i++)
if (argv[i][0] == '-')
switch (argv[i][1]) {
case 'a':
if (auth != -1) usage();
auth = 1;
break;
case 'd':
if (auth != -1) usage();
auth = 0;
break;
case 'p':
parallel = 1;
break;
case '1':
oneline = 1;
break;
default:
usage();
break;
}
else
numusers++;
if (numusers == 0)
usage();
if (auth == -1) auth = 1;
if ((retval = ZInitialize()) != ZERR_NONE) {
com_err(whoami,retval,"while initializing");
exit(1);
}
numleft = numusers;
numfound = 0;
rlen = strlen(ZGetRealm());
i = 0;
for (loc = 0; loc < argc; loc++) {
if (argv[loc][0] == '-') continue;
(void) strncpy(user,argv[loc],sizeof(user) - rlen - 2);
user[sizeof(user) - rlen - 2] = '\0';
if (!strchr(user,'@')) {
(void) strcat(user,"@");
(void) strcat(user,ZGetRealm());
}
if (parallel) {
if ((retval = ZRequestLocations(user, &ald, i ? UNSAFE : UNACKED,
auth?ZAUTH:ZNOAUTH)) != ZERR_NONE) {
com_err(whoami,retval,"requesting location of %s",user);
exit(1);
}
i = 1;
} else {
if ((retval = ZLocateUser(user,&numlocs,auth?ZAUTH:ZNOAUTH)) != ZERR_NONE) {
com_err(whoami,retval,"while locating user %s",user);
exit(1);
}
print_locs(user,numlocs);
numfound += numlocs;
}
}
if (parallel) {
#ifdef _POSIX_VERSION
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = timeout;
sigaction(SIGALRM, &sa, (struct sigaction *)0);
#else
signal (SIGALRM, timeout);
#endif
while (numleft-- > 0) {
alarm(SRV_TIMEOUT);
if ((retval = ZReceiveNotice(&notice, NULL)) != ZERR_NONE) {
com_err(whoami,retval,"while searching notice queue");
continue;
}
if ((retval = ZParseLocations(&notice, (ZAsyncLocateData_t *)NULL,
&numlocs, &whichuser)) != ZERR_NONE) {
com_err(whoami,retval,"while parsing locations");
continue;
}
if (numlocs >= 0) {
print_locs(whichuser,numlocs);
free(whichuser);
numfound += numlocs;
}
ZFreeNotice(&notice);
}
}
return((numfound > 0) ? 0 : 1);
}

56
clients/znol/Makefile.in Normal file
View File

@ -0,0 +1,56 @@
SHELL=@SHELL@
prefix=@prefix@
exec_prefix=@exec_prefix@
datadir=@datadir@
sysconfdir=@sysconfdir@
sbindir=@sbindir@
lsbindir=@lsbindir@
datarootdir=@datarootdir@
includedir=@includedir@
mandir=@mandir@
libdir=@libdir@
bindir=@bindir@
top_builddir=../..
srcdir=@srcdir@
top_srcdir=@top_srcdir@
BUILDTOP=../..
VPATH=@srcdir@
LIBTOOL=@LIBTOOL@
CC=@CC@
INSTALL=@INSTALL@
LIBZEPHYR=${BUILDTOP}/lib/libzephyr.la
CPPFLAGS=@CPPFLAGS@
CFLAGS=@CFLAGS@
ALL_CFLAGS=${CFLAGS} -I${top_srcdir}/h -I${BUILDTOP}/h ${CPPFLAGS}
LDFLAGS=@LDFLAGS@
LIBS=${LIBZEPHYR} @LIBS@ -lcom_err
OBJS= znol.o
all: znol
znol: ${OBJS} ${LIBZEPHYR}
${LIBTOOL} --mode=link ${CC} ${LDFLAGS} -o $@ ${OBJS} ${LIBS}
.c.o:
${CC} -c ${ALL_CFLAGS} $<
check:
install: znol
${LIBTOOL} --mode=install ${INSTALL} -m 755 znol ${DESTDIR}${bindir}
${INSTALL} -m 644 ${srcdir}/znol.1 ${DESTDIR}${mandir}/man1
clean:
${LIBTOOL} --mode=clean rm -f znol
rm -f ${OBJS}
${OBJS}: ${top_srcdir}/h/sysdep.h ${BUILDTOP}/h/config.h
${OBJS}: ${BUILDTOP}/h/zephyr/zephyr.h ${BUILDTOP}/h/zephyr/zephyr_err.h
.PHONY: all check install clean

109
clients/znol/znol.1 Normal file
View File

@ -0,0 +1,109 @@
.\" $Id$
.\"
.\" Copyright 1987,1988 by the Massachusetts Institute of Technology
.\" All rights reserved. The file /usr/include/zephyr/mit-copyright.h
.\" specifies the terms and conditions for redistribution.
.\"
.\" @(#)znol.1 6.1 (MIT) 7/9/87
.\"
.TH ZNOL 1 "July 1, 1988" "MIT Project Athena"
.ds ]W MIT Project Athena
.SH NAME
znol \- notify via Zephyr upon login or logout of interesting people
.SH SYNOPSIS
.B znol
[
.BI on|off
] [
.BI \-f \ file
] [
.BI \-u \ username
] [
.BI \-l
] [
.BI \-q
]
.SH DESCRIPTION
.I Znol
provides a way for you to be notified when "interesting" people log in
or out. It uses the
.I Zephyr(1)
Notification Service, which causes a message to appear on your screen
for every person specified in a namelist (which defaults to
$HOME/.anyone). The namelist should have one login name per line. Any
line starting with `#' is considered a comment and ignored.
Anyone in the namelist who is logged in when
.I znol
is executed is printed to stdout. The control arguments are as
follows:
.TP 12
.B on|off
Turns notification on or off.
.TP
.B \-f
The namelist file is taken to be
.I file.
If
.I file
is "-", then the standard input is used instead of a file. If
.I file
does not exist, an error message is printed, and
.I znol
exits.
This option may not be used in conjunction with the
.B \-u
option.
.TP
.B \-l
Causes
.I znol
to just list the people in the namelist who are currently logged in,
without subscribing to the login messages. This option may not be used
in conjunction with the
.BI \-q
option.
.TP
.B \-q
Disables printing who is currently logged in when subscribing. This
option may not be used in conjunction with the
.BI \-l
option.
.TP
.B \-u
Instead of reading a file to specify the "interesting" users, the next
argument is used as the only "interesting" user. This option may not be
used in conjunction with the
.B \-f
option.
.SH EXAMPLES
.nf
.in +.5in
znol
.in -.5in
.fi
reads the standard namelist file, prints the locations of any users
named therein which can be found on the system, and enters subscriptions
for notices about those users.
.nf
.in +.5in
znol \-l \-u foo
.in -.5in
.fi
prints the location (if visible) of the user 'foo'.
.SH FILES
$HOME/.anyone
.SH SEE ALSO
anyone(SIPB), nol(SIPB), zctl(1), zephyr(1), zwgc(1), zhm(8), zephyrd(8)
.br
Project Athena Technical Plan Section E.4.1, `Zephyr Notification
Service'
.SH AUTHOR
.PP
Robert S. French (MIT-Project Athena)
.sp
.SH RESTRICTIONS
Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
All Rights Reserved.
.br
.I zephyr(1)
specifies the terms and conditions for redistribution.

256
clients/znol/znol.c Normal file
View File

@ -0,0 +1,256 @@
/* This file is part of the Project Athena Zephyr Notification System.
* It contains code for the "znol" command.
*
* Created by: Robert French
*
* $Id$
*
* Copyright (c) 1987 by the Massachusetts Institute of Technology.
* For copying and distribution information, see the file
* "mit-copyright.h".
*/
#include <sysdep.h>
#include <zephyr/zephyr.h>
#include <pwd.h>
#ifndef lint
static const char rcsid_znol_c[] = "$Id$";
#endif
#define SUBSATONCE 7
#define ON 1
#define OFF 0
int
main(int argc, char *argv[])
{
register char *cp;
char *realm;
ZSubscription_t subs[SUBSATONCE];
ZLocations_t locations;
FILE *fp = NULL;
struct passwd *pwd;
char anyonename[BUFSIZ],name[BUFSIZ],cleanname[BUFSIZ],*envptr;
char *comment_ptr;
int onoff = ON,quiet = 0,justlist = 0,useronly = 0, filenamed = 0;
int retval,arg,ind,one,numlocs,i;
int wgport = 0;
if ((retval = ZInitialize()) != ZERR_NONE) {
com_err(argv[0],retval,"initializing");
exit (1);
}
for (arg=1;arg<argc;arg++) {
if (!strcmp(argv[arg],"on")) {
onoff = ON;
continue;
}
if (!strcmp(argv[arg],"off")) {
onoff = OFF;
continue;
}
if (argv[arg][0] == '-') {
char opt = argv[arg][1];
if (opt == 0 || argv[arg][2] != 0)
goto usage;
switch (argv[arg][1]) {
case 'q':
quiet = 1;
break;
case 'l':
justlist = 1;
break;
case 'f':
if (arg == argc-1) {
fprintf(stderr,"No file name specified\n");
goto usage;
}
(void) strcpy(anyonename,argv[++arg]);
filenamed = 1;
break;
case 'u':
if (arg == argc-1) {
fprintf(stderr,"No username specified\n");
goto usage;
}
(void) strcpy(cleanname,argv[++arg]);
useronly = 1;
break;
default:
goto usage;
}
continue;
}
usage:
fprintf(stderr,"Usage: %s [on|off] [-q | -l] [-f file | -u username]\n", argv[0]);
exit (1);
}
if (quiet && justlist) {
fprintf(stderr,"-q and -l cannot both be used\n");
goto usage;
}
if (useronly && filenamed) {
fprintf(stderr,"-u and -f cannot both be used\n");
goto usage;
}
if (!justlist)
if ((wgport = ZGetWGPort()) == -1) {
com_err(argv[0],errno,"while getting WindowGram port");
exit(1);
}
if (!useronly) {
/* If no filename specified, get the default */
if (!filenamed) {
envptr = getenv("HOME");
if (envptr)
(void) strcpy(anyonename,envptr);
else {
if (!(pwd = getpwuid((int) getuid()))) {
fprintf(stderr,"You are not listed in the password file.\n");
exit (1);
}
(void) strcpy(anyonename,pwd->pw_dir);
}
(void) strcat(anyonename,"/.anyone");
}
/* if the filename is "-", read stdin */
if (strcmp(anyonename,"-") == 0) {
fp = stdin;
} else if (!(fp = fopen(anyonename,"r"))) {
fprintf(stderr,"Can't open %s for input\n",anyonename);
exit (1);
}
}
ind = 0;
for (;;) {
if (!useronly) {
if (!fgets(cleanname,sizeof cleanname,fp))
break;
if (cleanname[0] == '#' || cleanname[0] == '\0' ||
cleanname[0] == '\n')
continue; /* ignore comment and empty lines */
comment_ptr = strchr(cleanname, '#');
if (comment_ptr)
*comment_ptr = '\0'; /* Ignore from # onwards */
/* Get rid of old-style nol entries, just in case */
cp = cleanname + strlen(cleanname) - 1;
*cp = '\0';
while(*--cp == ' ')
*cp = '\0';
if (*cleanname == '@' || !*cleanname)
continue;
} else if (ind)
break; /* only do the one name */
subs[ind].zsub_class = LOGIN_CLASS;
(void) strcpy(name,cleanname);
if (!strchr(name,'@')) {
cp = name + strlen(name);
*cp++ = '@';
(void) strcpy(cp,ZGetRealm());
}
cp = strchr(name,'@');
if (cp[0] && strcmp(cp+1,ZGetRealm())) {
realm = cp + 1;
*cp = '\0';
if ((subs[ind].zsub_classinst =
malloc((unsigned)(strlen(name) + strlen(realm) + 2)))
== NULL)
{
fprintf (stderr, "znol: out of memory");
exit (1);
}
(void) sprintf(subs[ind].zsub_classinst, "%s@%s", name,
realm);
(void) strcpy(name, subs[ind].zsub_classinst);
if ((subs[ind].zsub_recipient =
malloc((unsigned)(strlen(realm)+2))) == NULL) {
fprintf (stderr, "znol: out of memory");
exit (1);
}
(void) sprintf(subs[ind++].zsub_recipient, "@%s", realm);
} else {
if ((subs[ind].zsub_classinst =
malloc((unsigned)(strlen(name)+1))) == NULL)
{
fprintf (stderr, "znol: out of memory");
exit (1);
}
(void) strcpy(subs[ind].zsub_classinst, name);
subs[ind++].zsub_recipient = "";
}
if (!quiet && onoff == ON) {
if ((retval = ZLocateUser(name,&numlocs,ZAUTH))
!= ZERR_NONE) {
com_err(argv[0],retval,"locating user");
exit(1);
}
one = 1;
if (numlocs) {
for (i=0;i<numlocs;i++) {
if ((retval =
ZGetLocations(&locations,&one))
!= ZERR_NONE) {
com_err(argv[0],retval,
"getting location");
continue;
}
if (one != 1) {
printf("%s: internal failure while getting location\n",argv[0]);
exit(1);
}
printf("%s: %s\t%s\t%s\n",cleanname,
locations.host,
locations.tty,
locations.time);
}
}
}
if (ind == SUBSATONCE) {
if (!justlist)
if ((retval = (onoff==ON)?
ZSubscribeToSansDefaults(subs,ind,
(u_short)wgport):
ZUnsubscribeTo(subs,ind,(u_short)wgport)) !=
ZERR_NONE) {
com_err(argv[0],retval,(onoff==ON)?
"subscribing":
"unsubscribing");
exit(1);
}
for (ind=0;ind<SUBSATONCE;ind++)
{
if (subs[ind].zsub_recipient[0] != '\0')
free(subs[ind].zsub_recipient);
free(subs[ind].zsub_classinst);
}
ind = 0;
}
}
if (ind && !justlist)
if ((retval = (onoff==ON)?
ZSubscribeToSansDefaults(subs,ind,(u_short)wgport):
ZUnsubscribeTo(subs,ind,(u_short)wgport)) !=
ZERR_NONE) {
com_err(argv[0],retval,(onoff==ON)?
"subscribing":
"unsubscribing");
exit(1);
}
if (!useronly)
(void) fclose(fp); /* file is open read-only,
ignore errs */
exit(0);
}

View File

@ -0,0 +1,57 @@
SHELL=@SHELL@
prefix=@prefix@
exec_prefix=@exec_prefix@
datadir=@datadir@
sysconfdir=@sysconfdir@
sbindir=@sbindir@
lsbindir=@lsbindir@
datarootdir=@datarootdir@
includedir=@includedir@
mandir=@mandir@
libdir=@libdir@
bindir=@bindir@
top_builddir=../..
srcdir=@srcdir@
top_srcdir=@top_srcdir@
BUILDTOP=../..
VPATH=@srcdir@
LIBTOOL=@LIBTOOL@
CC=@CC@
INSTALL=@INSTALL@
LIBZEPHYR=${BUILDTOP}/lib/libzephyr.la
CPPFLAGS=@CPPFLAGS@
CFLAGS=@CFLAGS@
ALL_CFLAGS=${CFLAGS} -I${top_srcdir}/h -I${BUILDTOP}/h ${CPPFLAGS}
LDFLAGS=@LDFLAGS@
LIBS=${LIBZEPHYR} @LIBS@ -lcom_err
OBJS= zshutdown_notify.o
all: zshutdown_notify
zshutdown_notify: ${OBJS} ${LIBZEPHYR}
${LIBTOOL} --mode=link ${CC} ${LDFLAGS} -o $@ ${OBJS} ${LIBS}
.c.o:
${CC} -c ${ALL_CFLAGS} $<
check:
install: zshutdown_notify
${LIBTOOL} --mode=install ${INSTALL} -m 755 zshutdown_notify \
${DESTDIR}${lsbindir}
${INSTALL} -m 644 ${srcdir}/zshutdown_notify.8 ${DESTDIR}${mandir}/man8
clean:
${LIBTOOL} --mode=clean rm -f zshutdown_notify
rm -f ${OBJS}
${OBJS}: ${top_srcdir}/h/sysdep.h ${BUILDTOP}/h/config.h
${OBJS}: ${BUILDTOP}/h/zephyr/zephyr.h ${BUILDTOP}/h/zephyr/zephyr_err.h
.PHONY: all check install clean

View File

@ -0,0 +1,43 @@
.\" $Id$
.\"
.\" Copyright 1988 by the Massachusetts Institute of Technology
.\" All rights reserved. The file /usr/include/zephyr/mit-copyright.h
.\" specifies the terms and conditions for redistribution.
.\"
.TH ZSHUTDOWN_NOTIFY 8 "July 8, 1988" "MIT Project Athena"
.ds ]W MIT Project Athena
.SH NAME
zshutdown_notify \- notify users of impending shutdown via Zephyr
.SH SYNOPSIS
.B zshutdown_notify
.SH DESCRIPTION
.I zshutdown_notify
reads the standard input until EOF is reached, and then sends a Zephyr
notice with the official hostname, the collected input, and a warning
message as the message body of the notice.
The notice is sent to class FILSRV, instance
.I <hostname>,
recipient "*", where <hostname> is the official hostname of the sending host.
.PP
Any users who are using resources on the sending host are expected to
subscribe to these messages so they will be warned of any impending
shutdowns.
.PP
.I zshutdown_notify
is usually invoked from within
.I /etc/shutdown.
.SH SEE ALSO
attach(1), zephyr(1), zwgc(1), shutdown(8), zhm(8), zephyrd(8)
.br
Project Athena Technical Plan Section E.4.1, `Zephyr Notification
Service'
.SH AUTHOR
.PP
C. Anthony Della Fera (Digital Equipment Corporation-Project Athena)
.sp
.SH RESTRICTIONS
Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
All Rights Reserved.
.br
.I zephyr(1)
specifies the terms and conditions for redistribution.

View File

@ -0,0 +1,143 @@
/* This file is part of the Project Athena Zephyr Notification System.
* It contains code for "zshutdown_notify", a utility called by
* shutdown(8) to do Zephyr notification on shutdown.
*
* Created by: C. Anthony Della Fera
*
* $Id$
*
* Copyright (c) 1987, 1993 by the Massachusetts Institute of Technology.
* For copying and distribution information, see the file
* "mit-copyright.h".
*/
#include <sysdep.h>
#include <zephyr/mit-copyright.h>
#include <zephyr/zephyr.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/nameser.h>
#ifndef lint
static const char rcsid_zshutdown_notify_c[] =
"$Id$";
#endif
#define N_KIND UNSAFE
#define N_CLASS "FILSRV"
#define N_OPCODE "SHUTDOWN"
#define N_DEF_FORMAT "From $sender:\n@bold(Shutdown message from $1 at $time)\n@center(System going down, message is:)\n\n$2\n\n@center(@bold($3))"
#define N_FIELD_CNT 3
#ifdef HAVE_KRB4
#define SVC_NAME "rcmd"
#endif
/*
* Standard warning strings appended as extra fields to
* the message body.
*/
static char warning[] = "Please detach any filesystems you may have\nattached from this host by typing detach -host %s";
/*ARGSUSED*/
int
main(int argc,
char *argv[])
{
ZNotice_t notice;
struct hostent *hp;
int retval;
char hostname[NS_MAXDNAME];
char msgbuff[BUFSIZ], message[Z_MAXPKTLEN], *ptr;
char scratch[BUFSIZ];
char *msg[N_FIELD_CNT];
#ifdef HAVE_KRB4
char tkt_filename[MAXPATHLEN];
char rlm[REALM_SZ];
char hn2[NS_MAXDNAME];
char *cp;
#endif
if (gethostname(hostname, sizeof(hostname)) < 0) {
com_err(argv[0], errno, "while finding hostname");
exit(1);
}
if ((hp = gethostbyname(hostname)) != NULL)
(void) strcpy(hostname, hp->h_name);
msg[0] = hostname;
msg[1] = message;
sprintf(scratch, warning, hostname);
msg[2] = scratch;
#ifdef HAVE_KRB4
(void) sprintf(tkt_filename, "/tmp/tkt_zshut_%d", getpid());
krb_set_tkt_string(tkt_filename);
cp = krb_get_phost(hostname);
if (cp)
(void) strcpy(hn2, cp);
else {
fprintf(stderr, "%s: can't figure out canonical hostname\n",argv[0]);
exit(1);
}
retval = krb_get_lrealm(rlm, 1);
if (retval) {
fprintf(stderr, "%s: can't get local realm: %s\n",
argv[0], krb_get_err_text(retval));
exit(1);
}
retval = krb_get_svc_in_tkt(SVC_NAME, hn2, rlm,
SERVER_SERVICE, SERVER_INSTANCE, 1,
(char *)KEYFILE);
if (retval) {
fprintf(stderr, "%s: can't get tickets: %s\n",
argv[0], krb_get_err_text(retval));
exit(1);
}
#endif
if ((retval = ZInitialize()) != ZERR_NONE) {
com_err(argv[0], retval, "while initializing");
exit(1);
}
ptr = message;
for (;;) {
if (!fgets(msgbuff, sizeof(msgbuff), stdin))
break;
if ((strlen(msgbuff) + (ptr - message)) > Z_MAXPKTLEN){
break;
}
(void) strcpy(ptr, msgbuff);
ptr += strlen(ptr);
}
(void) memset((char *)&notice, 0, sizeof(notice));
notice.z_kind = N_KIND;
notice.z_port = 0;
notice.z_charset = ZCHARSET_UNKNOWN;
notice.z_class = N_CLASS;
notice.z_class_inst = hostname;
notice.z_opcode = N_OPCODE;
notice.z_sender = 0;
notice.z_message_len = 0;
notice.z_recipient = "";
notice.z_default_format = N_DEF_FORMAT;
retval = ZSendList(&notice, msg, N_FIELD_CNT, ZAUTH);
#ifdef HAVE_KRB4
(void) dest_tkt();
#endif
if (retval != ZERR_NONE) {
com_err(argv[0], retval, "while sending notice");
exit(1);
}
return 0;
}

56
clients/zstat/Makefile.in Normal file
View File

@ -0,0 +1,56 @@
SHELL=@SHELL@
prefix=@prefix@
exec_prefix=@exec_prefix@
datadir=@datadir@
sysconfdir=@sysconfdir@
sbindir=@sbindir@
lsbindir=@lsbindir@
datarootdir=@datarootdir@
includedir=@includedir@
mandir=@mandir@
libdir=@libdir@
bindir=@bindir@
top_builddir=../..
srcdir=@srcdir@
top_srcdir=@top_srcdir@
BUILDTOP=../..
VPATH=@srcdir@
LIBTOOL=@LIBTOOL@
CC=@CC@
INSTALL=@INSTALL@
LIBZEPHYR=${BUILDTOP}/lib/libzephyr.la
CPPFLAGS=@CPPFLAGS@
CFLAGS=@CFLAGS@
ALL_CFLAGS=${CFLAGS} -I${top_srcdir}/h -I${BUILDTOP}/h ${CPPFLAGS}
LDFLAGS=@LDFLAGS@
LIBS=${LIBZEPHYR} @LIBS@ -lcom_err
OBJS= zstat.o
all: zstat
zstat: ${OBJS} ${LIBZEPHYR}
${LIBTOOL} --mode=link ${CC} ${LDFLAGS} -o $@ ${OBJS} ${LIBS}
.c.o:
${CC} -c ${ALL_CFLAGS} $<
check:
install: zstat
${LIBTOOL} --mode=install ${INSTALL} -m 755 zstat ${DESTDIR}${bindir}
${INSTALL} -m 644 ${srcdir}/zstat.8 ${DESTDIR}${mandir}/man8
clean:
${LIBTOOL} --mode=clean rm -f zstat
rm -f ${OBJS}
${OBJS}: zserver.h ${top_srcdir}/h/sysdep.h ${BUILDTOP}/h/config.h
${OBJS}: ${BUILDTOP}/h/zephyr/zephyr.h ${BUILDTOP}/h/zephyr/zephyr_err.h
.PHONY: all check install clean

26
clients/zstat/zserver.h Normal file
View File

@ -0,0 +1,26 @@
#ifndef __ZSERVER_H__
#define __ZSERVER_H__
/* This file is part of the Project Athena Zephyr Notification System.
* It contains declarations for use in the server.
*
* Created by: John T. Kohl
*
* $Id$
*
* Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
* For copying and distribution information, see the file
* "mit-copyright.h".
*/
#define ADMIN_HELLO "HELLO" /* Opcode: hello, are you there */
#define ADMIN_IMHERE "IHEARDYOU" /* Opcode: yes, I am here */
#define ADMIN_SHUTDOWN "GOODBYE" /* Opcode: I am shutting down */
#define ADMIN_BDUMP "DUMP_AVAIL" /* Opcode: I will give you a dump */
#define ADMIN_DONE "DUMP_DONE" /* Opcode: brain dump for this server
is complete */
#define ADMIN_NEWCLT "NEXT_CLIENT" /* Opcode: this is a new client */
#define ADMIN_LOST_CLT "LOST_CLIENT" /* Opcode: client not ack'ing */
#define ADMIN_KILL_CLT "KILL_CLIENT" /* Opcode: client is dead, remove */
#define ADMIN_STATUS "STATUS" /* Opcode: please send status */
#endif /* !__ZSERVER_H__ */

51
clients/zstat/zstat.8 Normal file
View File

@ -0,0 +1,51 @@
.\" $Id$
.\"
.\" Copyright 1987,1988 by the Massachusetts Institute of Technology
.\" All rights reserved. The file /usr/include/zephyr/mit-copyright.h
.\" specifies the terms and conditions for redistribution.
.\"
.\"
.TH ZSTAT 8 "July 1, 1988" "MIT Project Athena"
.ds ]W MIT Project Athena
.SH NAME
zstat \- display Zephyr statistics
.SH SYNOPSIS
.B zstat
[
.BI -h
] [
.BI -s
] [
.BI host \ ...
]
.SH DESCRIPTION
.I Zstat
is used to display statistics reported by a HostManager,
.I zhm(8),
or a Zephyr Server
.I zephyrd(8),
or both.
.TP 12
.B \-h
is used to indicate that only HostManager statistics should be displayed.
.TP
.B \-s
is used to indicate that only server statistics should be displayed.
.TP
If no hosts are specified, the current host is assumed.
When both HostManager and server statistics are displayed,
statistics from the current server for each host are displayed.
.SH SEE ALSO
zephyr(1), zhm(8), zephyrd(8)
.br
Project Athena Technical Plan Section E.4.1, `Zephyr Notification
Service'
.SH AUTHOR
.PP
David C. Jedlinsky (MIT-Project Athena)
.SH RESTRICTIONS
Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
All Rights Reserved.
.br
.I zephyr(1)
specifies the terms and conditions for redistribution.

312
clients/zstat/zstat.c Normal file
View File

@ -0,0 +1,312 @@
/* This file is part of the Project Athena Zephyr Notification System.
* It contains the zstat program.
*
* Created by: David C. Jedlinsky
*
* $Id$
*
* Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
* For copying and distribution information, see the file
* "mit-copyright.h".
*/
/* There should be library interfaces for the operations in zstat; for now,
* however, zstat is more or less internal to the Zephyr system. */
#include <internal.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
#include "zserver.h"
#if !defined(lint) && !defined(SABER)
static const char rcsid_zstat_c[] = "$Id$";
#endif
const char *hm_head[] = {
"Current server =",
"Items in queue:",
"Client packets received:",
"Server packets received:",
"Server changes:",
"Version:",
"Looking for a new server:",
"Time running:",
"Size:",
"Machine type:"
};
#define HM_SIZE (sizeof(hm_head) / sizeof (char *))
const char *srv_head[] = {
"Current server version =",
"Packets handled:",
"Uptime:",
"Server states:",
};
#define SRV_SIZE (sizeof(srv_head) / sizeof (char *))
int outoftime = 0;
int serveronly = 0,hmonly = 0;
u_short srv_port;
void usage(char *);
void do_stat(char *);
int srv_stat(char *);
int hm_stat(char *, char *);
static RETSIGTYPE
timeout(int ignored)
{
outoftime = 1;
}
int
main(int argc,
char *argv[])
{
Code_t ret;
char hostname[NS_MAXDNAME];
int optchar;
struct servent *sp;
if ((ret = ZInitialize()) != ZERR_NONE) {
com_err("zstat", ret, "initializing");
exit(-1);
}
if ((ret = ZOpenPort((u_short *)0)) != ZERR_NONE) {
com_err("zstat", ret, "opening port");
exit(-1);
}
while ((optchar = getopt(argc, argv, "sh")) != EOF) {
switch(optchar) {
case 's':
serveronly++;
break;
case 'h':
hmonly++;
break;
case '?':
default:
usage(argv[0]);
exit(1);
}
}
if (serveronly && hmonly) {
fprintf(stderr,"Only one of -s and -h may be specified\n");
exit(1);
}
sp = getservbyname(SERVER_SVCNAME,"udp");
srv_port = (sp) ? sp->s_port : SERVER_SVC_FALLBACK;
if (optind == argc) {
do_stat("127.0.0.1");
exit(0);
}
for (;optind<argc;optind++)
do_stat(argv[optind]);
exit(0);
}
void
do_stat(char *host)
{
char srv_host[NS_MAXDNAME];
if (serveronly) {
(void) srv_stat(host);
return;
}
if (hm_stat(host,srv_host))
return;
if (!hmonly)
(void) srv_stat(srv_host);
}
int
hm_stat(char *host,
char *server)
{
struct in_addr inaddr;
Code_t code;
char *line[20],*mp;
unsigned int i,nf;
struct hostent *hp;
time_t runtime;
struct tm *tim;
ZNotice_t notice;
if ((inaddr.s_addr = inet_addr(host)) == (unsigned)(-1)) {
if ((hp = gethostbyname(host)) == NULL) {
fprintf(stderr,"Unknown host: %s\n",host);
exit(-1);
}
(void) memcpy((char *) &inaddr, hp->h_addr, hp->h_length);
printf("Hostmanager stats: %s\n", hp->h_name);
} else {
printf("Hostmanager stats: %s\n", host);
}
if ((code = ZhmStat(&inaddr, &notice)) != ZERR_NONE) {
com_err("zstat", code, "getting hostmanager status");
exit(-1);
}
mp = notice.z_message;
for (nf=0;mp<notice.z_message+notice.z_message_len;nf++) {
line[nf] = mp;
mp += strlen(mp)+1;
}
(void) strcpy(server,line[0]);
printf("HostManager protocol version = %s\n",notice.z_version);
for (i=0; (i < nf) && (i < HM_SIZE); i++) {
if (!strncmp("Time",hm_head[i],4)) {
runtime = atol(line[i]);
tim = gmtime(&runtime);
printf("%s %d days, %02d:%02d:%02d\n", hm_head[i],
tim->tm_yday,
tim->tm_hour,
tim->tm_min,
tim->tm_sec);
}
else
printf("%s %s\n",hm_head[i],line[i]);
}
printf("\n");
ZFreeNotice(&notice);
return(0);
}
int
srv_stat(char *host)
{
char *line[20],*mp;
int sock,i,nf,ret;
struct hostent *hp;
struct sockaddr_in sin;
ZNotice_t notice;
time_t runtime;
struct tm *tim;
#ifdef _POSIX_VERSION
struct sigaction sa;
#endif
(void) memset((char *) &sin, 0, sizeof(struct sockaddr_in));
sin.sin_port = srv_port;
if ((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket:");
exit(-1);
}
sin.sin_family = AF_INET;
if ((sin.sin_addr.s_addr = inet_addr(host)) == (unsigned)(-1)) {
if ((hp = gethostbyname(host)) == NULL) {
fprintf(stderr,"Unknown host: %s\n",host);
exit(-1);
}
(void) memcpy((char *) &sin.sin_addr, hp->h_addr, hp->h_length);
printf("Server stats: %s\n", hp->h_name);
} else {
printf("Server stats: %s\n", host);
}
(void) memset((char *)&notice, 0, sizeof(notice));
notice.z_kind = UNSAFE;
notice.z_port = 0;
notice.z_charset = ZCHARSET_UNKNOWN;
notice.z_class = ZEPHYR_ADMIN_CLASS;
notice.z_class_inst = "";
notice.z_opcode = ADMIN_STATUS;
notice.z_sender = "";
notice.z_recipient = "";
notice.z_default_format = "";
notice.z_message_len = 0;
if ((ret = ZSetDestAddr(&sin)) != ZERR_NONE) {
com_err("zstat", ret, "setting destination");
exit(-1);
}
if ((ret = ZSendNotice(&notice, ZNOAUTH)) != ZERR_NONE) {
com_err("zstat", ret, "sending notice");
exit(-1);
}
#ifdef _POSIX_VERSION
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = timeout;
(void) sigaction(SIGALRM, &sa, (struct sigaction *)0);
#else
(void) signal(SIGALRM,timeout);
#endif
outoftime = 0;
(void) alarm(10);
if (((ret = ZReceiveNotice(&notice, (struct sockaddr_in *) 0))
!= ZERR_NONE) &&
ret != EINTR) {
com_err("zstat", ret, "receiving notice");
return (1);
}
(void) alarm(0);
if (outoftime) {
fprintf(stderr,"No response after 10 seconds.\n");
return (1);
}
mp = notice.z_message;
for (nf=0;mp<notice.z_message+notice.z_message_len;nf++) {
line[nf] = mp;
mp += strlen(mp)+1;
}
printf("Server protocol version = %s\n",notice.z_version);
for (i=0; i < nf; i++) {
if (i < 2)
printf("%s %s\n",srv_head[i],line[i]);
else if (i == 2) { /* uptime field */
runtime = atol(line[i]);
tim = gmtime(&runtime);
printf("%s %d days, %02d:%02d:%02d\n",
srv_head[i],
tim->tm_yday,
tim->tm_hour,
tim->tm_min,
tim->tm_sec);
} else if (i == 3) {
printf("%s\n",srv_head[i]);
printf("%s\n",line[i]);
} else printf("%s\n",line[i]);
}
printf("\n");
(void) close(sock);
ZFreeNotice(&notice);
return(0);
}
void
usage(char *s)
{
fprintf(stderr,"usage: %s [-s] [-h] [host ...]\n",s);
exit(1);
}

View File

@ -0,0 +1,56 @@
SHELL=@SHELL@
prefix=@prefix@
exec_prefix=@exec_prefix@
datadir=@datadir@
sysconfdir=@sysconfdir@
sbindir=@sbindir@
lsbindir=@lsbindir@
datarootdir=@datarootdir@
includedir=@includedir@
mandir=@mandir@
libdir=@libdir@
bindir=@bindir@
top_builddir=../..
srcdir=@srcdir@
top_srcdir=@top_srcdir@
BUILDTOP=../..
VPATH=@srcdir@
LIBTOOL=@LIBTOOL@
CC=@CC@
INSTALL=@INSTALL@
LIBZEPHYR=${BUILDTOP}/lib/libzephyr.la
CPPFLAGS=@CPPFLAGS@
CFLAGS=@CFLAGS@
ALL_CFLAGS=${CFLAGS} -I${top_srcdir}/h -I${BUILDTOP}/h ${CPPFLAGS}
LDFLAGS=@LDFLAGS@
LIBS=${LIBZEPHYR} @LIBS@ -lcom_err
OBJS= zwrite.o
all: zwrite
zwrite: ${OBJS} ${LIBZEPHYR}
${LIBTOOL} --mode=link ${CC} ${LDFLAGS} -o $@ ${OBJS} ${LIBS}
.c.o:
${CC} -c ${ALL_CFLAGS} $<
check:
install: zwrite
${LIBTOOL} --mode=install ${INSTALL} -m 755 zwrite ${DESTDIR}${bindir}
${INSTALL} -m 644 ${srcdir}/zwrite.1 ${DESTDIR}${mandir}/man1
clean:
${LIBTOOL} --mode=clean rm -f zwrite
rm -f ${OBJS}
${OBJS}: ${top_srcdir}/h/sysdep.h ${BUILDTOP}/h/config.h
${OBJS}: ${BUILDTOP}/h/zephyr/zephyr.h ${BUILDTOP}/h/zephyr/zephyr_err.h
.PHONY: all check install clean

290
clients/zwrite/zwrite.1 Normal file
View File

@ -0,0 +1,290 @@
.\" $Id$
.\"
.\" Copyright 1987,1988 by the Massachusetts Institute of Technology
.\" All rights reserved. The file /usr/include/zephyr/mit-copyright.h
.\" specifies the terms and conditions for redistribution.
.\"
.\"
.TH ZWRITE 1 "October 26, 1989" "MIT Project Athena"
.ds ]W MIT Project Athena
.SH NAME
zwrite \- write to another user via Zephyr
.SH SYNOPSIS
.B zwrite
[
.BI \-a
] [
.BI \-d
] [
.BI \-v
] [
.BI \-q
] [
.BI \-t
] [
.BI \-u
] [
.BI \-o
] [
.BI \-n
] [
.BI \-l
] [
.BI \-C
] [
.BI \-U
] [
.BI \-O
opcode ] [
.BI \-s
signature ] [
.BI \-c
class ] [
.BI \-i
instance ] [
.BI \-r
realm ] [
.BI \-f
arg ] [
.BI \-S
sender ] [
.BI user \ ...
] [
.BI \-m
.BI message
]
.SH DESCRIPTION
.I Zwrite
sends a message from you to another user through the
.I zephyr(1)
notification service. The user must have subscribed to messages of
the appropriate class and instance using the
.I zctl(1)
program.
.PP
.I Zwrite
understands the following options.
.TP 12
.B \-a
Causes
.I zwrite
to send the message authenticated, using
.I Kerberos
to perform the authentication. This is the default.
.TP
.B \-d
Causes
.I zwrite
to send the message unauthenticated.
.TP
.B \-v
Causes
.I zwrite
to print what type of message it is sending, and whether or not it was
successful.
.TP
.B \-q
Forces
.I zwrite
to suppress information about whether or not the message was sent.
.TP
.B \-t
Prevents
.I zwrite
from expanding tabs in the message into appropriate spaces. Normally
.I zwrite
will expand any tabs it finds into the appropriate number of spaces to
maintain separation based on 8-character tab stops.
.TP
.B \-l
Causes
.I zwrite
to ignore `.' on a line by itself in the input and only end a typed
message when the user types the end-of-file character (usually
control-D). When the input is not a terminal, this is the default action.
.TP
.B \-u
Sends an urgent message. This changes the
.I zephyr
instance of the message to ``URGENT''.
.TP
.B \-o
Causes
.I zwrite
to ignore the Zephyr variables
.IR zwrite-class ,
.IR zwrite-inst ,
and
.I zwrite-opcode
when picking a default class, instance, and opcode.
.TP
.B \-n
prevents
.I zwrite
from sending a PING message to verify the recipient is subscribing to
messages. By default,
.I zwrite
will send a notice to the destination class, instance, and recipient,
with opcode ``PING'' before sending the message. If the PING is sent,
and the server response indicates there are no recipients subscribed to
your message,
.I zwrite
exits without sending a message.
When the
.B \-n
option is used, no PING is sent.
.TP
.B \-C
prepends a "CC:" line to the body of the message indicating the
recipients of the message. This is strictly a convenience: the
presence of a "CC:" line at the top of a zephyr body does not
necessarily indicate that this option was used, or that the message
really was sent to the listed users, and its lack doesn't indicate
that the message was not sent to multiple users.
.TP
.B \-U
Send an unacked message.
.I zwrite
will not wait for acknowledgement that the message was sent, nor will
it issue a PING before sending.
.TP
.B \-s \fIsignature\fR
sets the signature to be included in the message. This overrides both
the user's name (as found in the password file) and any
setting of the Zephyr variable
.IR zwrite-signature .
.I signature
must
be a single argument, hence when using a shell it should be quoted with
double quotes. A
.I signature
argument of "" leaves the signature in
the message empty.
.TP
.B \-c \fIclass\fR
Allows a user to specify a different class for the message. This allows
a message to be sent to a large group of people with some degree of
security. See
.I zephyr(1)
and
.I zephyrd(8)
for a description of how to restrict access to classes. When this option
is specified, the message is sent to recipient "*" unless an additional
list of recipients is specified.
.br
This argument may not be used in conjunction with the \-f option.
.TP
.B \-i \fIinstance\fR
Allows a user to specify a different instance than the default.
When this option is used, the message is sent to recipient "*" unless an
additional list of recipients is specified. This allows a message to be
sent to a large group of people (e.g. a development group) just by having
the members subscribe to messages of class "MESSAGE", the specified instance,
and recipient "*".
.br
This argument may not be used in conjunction with the \-f option.
.TP
.B \-r \fIrealm\fR
Allows a user to specify a different realm for the message, if the
server supports interrealm Zephyr.
.TP
.B \-S \fIsender\fR
Specify a sender. The message will be sent unauthenticated.
.TP
.B \-F \fIformat\fR
Allows a user to specify a different default format for the message.
.TP
.B \-O \fIopcode\fR
Allows a user to specify a different opcode for the message.
Some Zephyr notice display programs may use the opcode to decide how
to display a notice.
.TP
.B \-f \fIarg\fR
Allows a user to specify an argument to be interpreted as a filesystem
specification. The class is set to
.BR FILSRV .
he instance is set
to
.I arg
as modified:
If
.I arg
contains no colons (`:'), it is assumed to
be a host name, and it is converted into an official host name via
.I gethostbyname(3).
If
.I arg
contains a colon, the portion preceding the colon is
treated as a host name, and the colon and any trailing characters are
appended to the offical host name returned by
.I gethostbyname.
If the name fails to resolve into an official host name, the instance is
set to
.I arg
unmodified.
.br
This option may not be used in conjunction with the \-c or \-i option.
.TP
.B \-m
.I Zwrite
sends the remaining arguments on the command line as the message.
.PP
If the
.I \-m
option is not specified, the user is prompted for the message to be
sent. The message may be terminated by typing ^D or ``.'' on a line
by itself.
.PP
The default class for messages is ``MESSAGE'', the default instance
is ``PERSONAL'', andthe default opcode is ``'' (an empty string).
These defaults can be overridden by setting the Zephyr
variables
.IR zwrite-class ,
.IR zwrite-inst ,
and
.IR zwrite-opcode ,
respectively.
Command-line options can override the defaults.
.PP
If the class is ``MESSAGE'' and the instance is either ``PERSONAL'' or
``URGENT'', a recipient must be specified. These comparisons are
case-sensitive.
.PP
Unless the
.B \-s
option is used, the contents of the Zephyr variable
.I zwrite-signature
are used to augment the user's username in the
message. If
.I zwrite-signature
is not set and the
.B \-s
option is not specified, the user's full name (as specified in the
password file) is used instead.
.SH BUGS
Tab expansion should really be done by the receiver of the message.
.br
The \-u option is provided for compatibility with old versions of
.I zwrite
and is not necessarily useful for sending messages to users who do not
have old subscription files.
.SH SEE ALSO
kerberosintro(1), zctl(1), zephyr(1), zwgc(1), zhm(8), zephyrd(8),
gethostbyname(3)
.br
Project Athena Technical Plan Section E.4.1, `Zephyr Notification
Service'
.SH FILES
/etc/passwd
.br
$ZEPHYR_VARS or $HOME/.zephyr.vars
.SH AUTHOR
.PP
.br
Robert S. French (MIT-Project Athena)
.SH RESTRICTIONS
Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
All Rights Reserved.
.br
.I zephyr(1)
specifies the terms and conditions for redistribution.

568
clients/zwrite/zwrite.c Normal file
View File

@ -0,0 +1,568 @@
/* This file is part of the Project Athena Zephyr Notification System.
* It contains code for the "zwrite" command.
*
* Created by: Robert French
*
* $Id$
*
* Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
* For copying and distribution information, see the file
* "mit-copyright.h".
*/
#include <sysdep.h>
#include <zephyr/mit-copyright.h>
#include <zephyr/zephyr.h>
#include <netdb.h>
#include <pwd.h>
#ifndef lint
static const char rcsid_zwrite_c[] = "$Id$";
#endif /* lint */
#define DEFAULT_CLASS "MESSAGE"
#define DEFAULT_INSTANCE "PERSONAL"
#define URGENT_INSTANCE "URGENT"
#define DEFAULT_OPCODE ""
#define FILSRV_CLASS "FILSRV"
#define MAXRECIPS 100
int nrecips, msgarg, verbose, quiet, nodot, cc;
char *whoami, *inst, *class, *opcode, *realm, *recips[MAXRECIPS], *sender = 0;
Z_AuthProc auth;
ZNotice_Kind_t kind = ACKED;
void un_tabify(char **, int *);
char *fix_filsrv_inst(char *);
void usage(char *);
void send_off(ZNotice_t *, int);
int
main(int argc, char *argv[])
{
int retval, arg, nocheck, nchars, msgsize, filsys, tabexpand;
char *message, *signature = NULL, *format = NULL;
static char bfr[BUFSIZ], classbfr[BUFSIZ], instbfr[BUFSIZ], sigbfr[BUFSIZ];
static char opbfr[BUFSIZ];
static ZNotice_t notice;
char *charset = NULL;
whoami = argv[0];
if ((retval = ZInitialize()) != ZERR_NONE) {
com_err(whoami, retval, "while initializing");
exit(1);
}
if (argc < 2)
usage(whoami);
auth = ZAUTH;
verbose = quiet = msgarg = nrecips = nocheck = filsys = nodot = 0;
tabexpand = 1;
class = ZGetVariable("zwrite-class");
if (class) {
(void) strcpy(classbfr, class);
class = classbfr;
}
else
class = DEFAULT_CLASS;
inst = ZGetVariable("zwrite-inst");
if (inst) {
(void) strcpy(instbfr, inst);
inst = instbfr;
}
else
inst = DEFAULT_INSTANCE;
opcode = ZGetVariable("zwrite-opcode");
if (opcode)
opcode = strcpy(opbfr, opcode);
else
opcode = DEFAULT_OPCODE;
signature = ZGetVariable("zwrite-signature");
if (signature) {
(void) strcpy(sigbfr, signature);
signature = sigbfr;
}
arg = 1;
for (;arg<argc && !msgarg; arg++) {
if (*argv[arg] != '-') {
recips[nrecips++] = argv[arg];
continue;
}
if (strlen(argv[arg]) > 2)
usage(whoami);
switch (argv[arg][1]) {
case 'a': /* Backwards compatibility */
auth = ZAUTH;
break;
case 'o':
class = DEFAULT_CLASS;
inst = DEFAULT_INSTANCE;
opcode = DEFAULT_OPCODE;
break;
case 'd':
auth = ZNOAUTH;
break;
case 'v':
verbose = 1;
break;
case 'q':
quiet = 1;
break;
case 'n':
nocheck = 1;
break;
case 't':
tabexpand = 0;
break;
case 'u':
inst = URGENT_INSTANCE;
break;
case 'O':
if (arg == argc-1)
usage(whoami);
arg++;
opcode = argv[arg];
break;
case 'i':
if (arg == argc-1 || filsys == 1)
usage(whoami);
arg++;
inst = argv[arg];
filsys = -1;
break;
case 'c':
if (arg == argc-1 || filsys == 1)
usage(whoami);
arg++;
class = argv[arg];
filsys = -1;
break;
case 'f':
if (arg == argc-1 || filsys == -1)
usage(whoami);
arg++;
class = FILSRV_CLASS;
inst = fix_filsrv_inst(argv[arg]);
filsys = 1;
nocheck = 1; /* implied -n (no ping) */
break;
case 's':
if (arg == argc-1)
usage(whoami);
arg++;
signature = argv[arg];
break;
case 'm':
if (arg == argc-1)
usage(whoami);
nocheck = 1; /* implied -n (no ping) */
msgarg = arg+1;
break;
case 'l': /* literal */
nodot = 1;
break;
case 'F':
if (arg == argc-1)
usage(whoami);
arg++;
format = argv[arg];
break;
case 'r':
if (arg == argc-1)
usage(whoami);
arg++;
realm = argv[arg];
break;
case 'C':
cc = 1;
break;
case 'x':
if (arg == argc-1)
usage(whoami);
arg++;
charset = argv[arg];
break;
case 'S':
if (arg == argc-1)
usage(whoami);
arg++;
sender = argv[arg];
auth = ZNOAUTH;
break;
case 'U':
kind = UNACKED;
nocheck = 1; /* implied -n (no ping) */
break;
default:
usage(whoami);
}
}
if (!nrecips && !(strcmp(class, DEFAULT_CLASS) ||
(strcmp(inst, DEFAULT_INSTANCE) &&
strcmp(inst, URGENT_INSTANCE)))) {
/* must specify recipient if using default class and
(default instance or urgent instance) */
fprintf(stderr, "No recipients specified.\n");
usage(whoami);
}
if (!signature) {
/* try to find name in the password file */
register struct passwd *pwd;
register char *cp = sigbfr;
register char *cp2, *pp;
pwd = getpwuid(getuid());
if (pwd) {
cp2 = pwd->pw_gecos;
for (; *cp2 && *cp2 != ',' ; cp2++) {
if (*cp2 == '&') {
pp = pwd->pw_name;
*cp++ = islower(*pp) ? toupper(*pp) : *pp;
pp++;
while (*pp)
*cp++ = *pp++;
} else
*cp++ = *cp2;
}
signature = sigbfr;
}
}
memset(&notice, 0, sizeof(ZNotice_t));
notice.z_kind = kind;
notice.z_port = 0;
notice.z_class = class;
notice.z_class_inst = inst;
notice.z_opcode = "PING";
notice.z_sender = sender;
notice.z_message_len = 0;
notice.z_recipient = "";
notice.z_charset = ZGetCharset(charset);
if (format)
notice.z_default_format = format;
else
notice.z_default_format = "http://zephyr.1ts.org/wiki/df";
if (!nocheck && nrecips)
send_off(&notice, 0);
if (!msgarg && isatty(0)) {
if (nodot)
printf("Type your message now. End with the end-of-file character.\n");
else
printf("Type your message now. End with control-D or a dot on a line by itself.\n");
}
message = NULL;
msgsize = 0;
if (signature) {
message = malloc((unsigned)(strlen(signature)+2));
(void) strcpy(message, signature);
msgsize = strlen(message);
message[msgsize++] = '\0';
} else {
message = malloc(1);
message[msgsize++] = '\0';
}
if (cc && nrecips > 1) {
int size = msgsize;
for (arg=0;arg<nrecips;arg++)
size += (strlen(recips[arg]) + 2);
size += 6; /* for the newlines and "cc: " */
message = realloc(message, (unsigned) size);
(void) strcpy(message+msgsize, "CC: ");
msgsize += 4;
for (arg=0;arg<nrecips;arg++) {
(void) strcpy(message+msgsize, recips[arg]);
msgsize += strlen(recips[arg]);
if (arg != nrecips-1) {
message[msgsize] = ' ';
msgsize++;
}
}
message[msgsize] = '\n';
msgsize += 1;
}
if (msgarg) {
int size = msgsize;
for (arg=msgarg;arg<argc;arg++)
size += (strlen(argv[arg]) + 1);
size++; /* for the newline */
message = realloc(message, (unsigned) size);
for (arg=msgarg;arg<argc;arg++) {
(void) strcpy(message+msgsize, argv[arg]);
msgsize += strlen(argv[arg]);
if (arg != argc-1) {
message[msgsize] = ' ';
msgsize++;
}
}
message[msgsize] = '\n';
msgsize += 1;
} else {
if (isatty(0)) {
for (;;) {
unsigned int l;
if (!fgets(bfr, sizeof bfr, stdin))
break;
if (!nodot && bfr[0] == '.' &&
(bfr[1] == '\n' || bfr[1] == '\0'))
break;
l = strlen(bfr);
message = realloc(message, msgsize+l+1);
(void) strcpy(message+msgsize, bfr);
msgsize += l;
}
if (ferror(stdin)) /* drop the message */
exit(1);
message = realloc(message, (unsigned)(msgsize+1));
}
else { /* Use read so you can send binary messages... */
while ((nchars = read(fileno(stdin), bfr, sizeof bfr))) {
if (nchars == -1) {
fprintf(stderr, "Read error from stdin! Can't continue!\n");
exit(1);
}
message = realloc(message, (unsigned)(msgsize+nchars));
(void) memcpy(message+msgsize, bfr, nchars);
msgsize += nchars;
}
/* end of msg */
message = realloc(message, (unsigned)(msgsize+1));
}
}
notice.z_opcode = opcode;
if (tabexpand)
un_tabify(&message, &msgsize);
notice.z_message = message;
notice.z_message_len = msgsize;
send_off(&notice, 1);
exit(0);
}
void
send_off(ZNotice_t *notice, int real)
{
int i, success, retval;
char realm_recip[BUFSIZ], dest[3 * BUFSIZ];
ZNotice_t retnotice;
success = 0;
for (i=0;i<nrecips || i==0;i++) {
if (realm) {
sprintf(realm_recip, "%s@%s", (nrecips) ? recips[i] : "", realm);
notice->z_recipient = realm_recip;
} else {
notice->z_recipient = (nrecips) ? recips[i] : "";
}
if (nrecips)
strcpy(dest, recips[i]);
else if (!strcmp(class, DEFAULT_CLASS))
sprintf(dest, "instance \"%s\"", inst);
else if (!strcmp(inst, DEFAULT_INSTANCE))
sprintf(dest, "class \"%s\"", class);
else
sprintf(dest, "class \"%s\", instance \"%s\"", class, inst);
if (verbose && real)
printf("Sending %smessage, class %s, instance %s, to %s\n",
auth?"authenticated ":"",
class, inst,
nrecips?notice->z_recipient:"everyone");
if ((retval = ZSendNotice(notice, auth)) != ZERR_NONE) {
com_err(whoami, retval, "while sending notice to %s", dest);
break;
}
if (kind == UNACKED)
continue;
if (real && !quiet) {
if (verbose)
printf("Queued... ");
else
printf("Message queued for %s... ", dest);
fflush(stdout);
}
if ((retval = ZIfNotice(&retnotice, (struct sockaddr_in *) 0,
ZCompareUIDPred,
(char *)&notice->z_uid)) != ZERR_NONE) {
com_err(whoami, retval, "while waiting for acknowledgement for %s",
dest);
continue;
}
if (retnotice.z_kind == SERVNAK) {
if (!quiet) {
printf("Received authorization failure while sending to %s\n",
dest);
}
ZFreeNotice(&retnotice);
break; /* if auth fails, punt */
}
if (retnotice.z_kind != SERVACK || !retnotice.z_message_len) {
if (!quiet) {
printf("Detected server failure while receiving acknowledgement for %s\n",
dest);
}
ZFreeNotice(&retnotice);
continue;
}
if (!strcmp(retnotice.z_message, ZSRVACK_SENT)) {
success = 1;
if (real && !quiet)
printf("sent\n");
} else if (!strcmp(retnotice.z_message, ZSRVACK_NOTSENT)) {
if (verbose && real && !quiet) {
if (strcmp(class, DEFAULT_CLASS)) {
fprintf(stderr, "Not logged in or not subscribing to class %s, instance %s\n",
class, inst);
} else {
fprintf(stderr,
"Not logged in or not subscribing to messages\n");
}
}
else if (!quiet) {
if (!nrecips) {
fprintf(stderr,
"No one subscribing to class %s, instance %s\n",
class, inst);
} else {
if (strcmp(class, DEFAULT_CLASS)) {
fprintf(stderr, "%s: Not logged in or not subscribing to class %s, instance %s\n",
notice->z_recipient, class, inst);
} else {
fprintf(stderr, "%s: Not logged in or not subscribing to messages\n",
notice->z_recipient);
}
}
}
}
else
printf("Internal failure - illegal message field in server response\n");
ZFreeNotice(&retnotice);
}
if (!success)
exit(1);
}
void
usage(char *s)
{
fprintf(stderr,
"Usage: %s [-a] [-o] [-d] [-v] [-q] [-n] [-t] [-u] [-l]\n\
\t[-c class] [-i inst] [-O opcode] [-f fsname] [-s signature] [-C]\n\
\t[user ...] [-F format] [-r realm] [-x charset] [-m message]\n", s);
fprintf(stderr,"\t-f and -c are mutually exclusive\n\
\t-f and -i are mutually exclusive\n\
\trecipients must be specified unless -c or -f specifies a class\n\
\tother than the default class or -i or -f specifies an instance\n\
\tother than the default or urgent instance\n");
exit(1);
}
/*
if the -f option is specified, this routine is called to canonicalize
an instance of the form hostname[:pack]. It turns the hostname into the
name returned by gethostbyname(hostname)
*/
char *
fix_filsrv_inst(char *str)
{
static char fsinst[BUFSIZ];
char *ptr;
struct hostent *hp;
ptr = strchr(str,':');
if (ptr)
*ptr = '\0';
hp = gethostbyname(str);
if (!hp) {
if (ptr)
*ptr = ':';
return(str);
}
(void) strcpy(fsinst, hp->h_name);
if (ptr) {
(void) strcat(fsinst, ":");
ptr++;
(void) strcat(fsinst, ptr);
}
return(fsinst);
}
/* convert tabs in the buffer into appropriate # of spaces.
slightly tricky since the buffer can have NUL's in it. */
#ifndef TABSTOP
#define TABSTOP 8 /* #chars between tabstops */
#endif /* ! TABSTOP */
void
un_tabify(char **bufp,
int *sizep)
{
register char *cp, *cp2;
char *cp3;
register int i;
register int column; /* column of next character */
register int size = *sizep;
for (cp = *bufp, i = 0; size; size--, cp++)
if (*cp == '\t')
i++; /* count tabs in buffer */
if (!i)
return; /* no tabs == no work */
/* To avoid allocation churning, allocate enough extra space to convert
every tab into TABSTOP spaces */
/* only add (TABSTOP-1)x because we re-use the cell holding the
tab itself */
cp = malloc((unsigned)(*sizep + (i * (TABSTOP-1))));
if (!cp) /* XXX */
return; /* punt expanding if memory fails */
cp3 = cp;
/* Copy buffer, converting tabs to spaces as we go */
for (cp2 = *bufp, column = 1, size = *sizep; size; cp2++, size--) {
switch (*cp2) {
case '\n':
case '\0':
/* newline or null: reset column */
column = 1;
*cp++ = *cp2; /* copy the newline */
break;
default:
/* copy the character */
*cp = *cp2;
cp++;
column++;
break;
case '\t':
/* it's a tab, compute how many spaces to expand into. */
i = TABSTOP - ((column - 1) % TABSTOP);
for (; i > 0; i--) {
*cp++ = ' '; /* fill in the spaces */
column++;
(*sizep)++; /* increment the size */
}
(*sizep)--; /* remove one (we replaced the tab) */
break;
}
}
free(*bufp); /* free the old buf */
*bufp = cp3;
return;
}

414
configure.ac Normal file
View File

@ -0,0 +1,414 @@
dnl Process this file with autoconf to produce a configure script.
AC_INIT([zephyr],[__DEV__])
AC_CONFIG_MACRO_DIR([m4])
test -d h || mkdir h
test -d h/zephyr || mkdir h/zephyr
test -z "$lbindir" && lbindir='${bindir}'
test -z "$lsbindir" && lsbindir='${sbindir}'
AC_SUBST(lbindir)
AC_SUBST(lsbindir)
AC_CANONICAL_SYSTEM
AC_CANONICAL_TARGET
AC_DEFINE_UNQUOTED(MACHINE_TYPE, "$host", [Define to the type of the host system.])
dnl Checks for programs.
AC_PROG_CC
AC_PROG_YACC
AC_PROG_LEX
AC_PROG_INSTALL
AC_PROG_LIBTOOL
AC_MSG_CHECKING(location of temporary directory)
if test -d /var/tmp; then
found_tmp=/var/tmp/
elif test -d /usr/tmp; then
found_tmp=/usr/tmp/
else
found_tmp=/tmp/
fi
AC_DEFINE_UNQUOTED(FOUND_TMP, "${found_tmp}", [Define to a temporary directory on your system.])
AC_MSG_RESULT(${found_tmp})
dnl Checks for header files.
AC_PATH_XTRA
AC_HEADER_STDC
AC_HEADER_SYS_WAIT
AC_CHECK_HEADERS(fcntl.h paths.h sgtty.h unistd.h malloc.h)
AC_CHECK_HEADERS(sys/filio.h sys/ioctl.h sys/time.h sys/file.h sys/utsname.h)
AC_CHECK_HEADERS(sys/select.h sys/msgbuf.h sys/cdefs.h krb5_err.h termcap.h)
AC_CHECK_HEADERS(arpa/nameser_compat.h stdbool.h termio.h curses.h)
AC_CHECK_HEADERS([term.h], [], [],
[#ifdef HAVE_CURSES_H
#include <curses.h>
#endif
])
if test "$no_x" != "yes"; then
ZWGC_LIBX11=-lX11
fi
AC_SUBST(XCLIENTS)
AC_SUBST(ZWGC_LIBX11)
dnl Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_SIGNAL
AC_TYPE_UID_T
AC_CHECK_SIZEOF(short)
AC_CHECK_SIZEOF(int)
AC_CHECK_SIZEOF(long)
AC_MSG_CHECKING(for 32-bit integer type)
if test "$ac_cv_sizeof_long" = 4; then
int32=long
elif test "$ac_cv_sizeof_int" = 4; then
int32=int
elif test "$ac_cv_sizeof_short" = 4; then
int32=short
else
AC_WARN([Can't find 32-bit type, using long])
int32=long
fi
AC_DEFINE_UNQUOTED(ZEPHYR_INT32, ${int32}, [Define to a signed 32-bit integral type.])
AC_MSG_RESULT(${int32})
AC_CHECK_LIB(w, wslen)
# XXX? AC_CHECK_LIB(dl, dlopen)
AC_CHECK_MEMBER([struct sockaddr_in.sin_len],
[AC_DEFINE(HAVE_SOCKADDR_IN_SIN_LEN, 1,
[sockaddr_in has sin_len member])],
[], [
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
])
AC_CHECK_MEMBER([struct sockaddr_in6.sin6_len],
[AC_DEFINE(HAVE_SOCKADDR_IN6_SIN6_LEN, 1,
[sockaddr_in6 has sin6_len member])],
[], [
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
])
AC_SEARCH_LIBS(gethostbyname, nsl)
AC_SEARCH_LIBS(socket, socket)
AC_CHECK_LIB(44bsd, strerror)
AC_ARG_WITH(libiconv,
[ --with-libiconv=PREFIX Location for libiconv],
[libiconv="$withval"], [libiconv=no])
if test "$libiconv" != no; then
CPPFLAGS="$CPPFLAGS -I$libiconv/include"
LDFLAGS="$LDFLAGS -L$libiconv/lib"
AC_CHECK_LIB(iconv, iconv_open, [LIBICONV=-liconv; AC_SUBST(LIBICONV)])
else
AC_CHECK_FUNC(iconv_open, :,
AC_CHECK_LIB(iconv, iconv_open, [LIBICONV=-liconv; AC_SUBST(LIBICONV)]))
fi
AC_SUBST(LIBICONV)
AC_CHECK_LIB(curses, tgetstr, [TLIB=-lcurses], [TLIB=-ltermcap])
AC_SUBST(TLIB)
AC_ARG_WITH(krb4,
[ --with-krb4=PREFIX Use Kerberos 4],
[krb4="$withval"], [krb4=no])
if test "$krb4" != no; then
AC_CHECK_FUNC(gethostbyname, :, AC_CHECK_LIB(nsl, gethostbyname))
AC_CHECK_FUNC(socket, :, AC_CHECK_LIB(socket, socket))
AC_CHECK_LIB(gen, compile)
if test "$krb4" != yes; then
CPPFLAGS="$CPPFLAGS -I$krb4/include"
if test -d "$krb4/include/kerberosIV"; then
CPPFLAGS="$CPPFLAGS -I$krb4/include/kerberosIV"
fi
LDFLAGS="$LDFLAGS -L$krb4/lib"
fi
AC_CHECK_LIB(krb4, krb_rd_req,
[KRB4_LIBS="-lkrb4 -ldes425 -lkrb5 -lk5crypto -lcom_err"],
[AC_CHECK_LIB(des, des_quad_cksum,
[KRB4_DES_LIBS="-ldes"],,,)
AC_CHECK_LIB(krb, krb_rd_req,
[KRB4_LIBS="-lkrb $KRB4_DES_LIBS"],
[AC_MSG_ERROR(Kerberos 4 libraries not found)],
$KRB4_DES_LIBS)],
-ldes425 -lkrb5 -lk5crypto -lcom_err)
AC_DEFINE(HAVE_KRB4, 1, [Define to compile with Kerberos support.])
LIBZEPHYR_LIBS="$LIBZEPHYR_LIBS $KRB4_LIBS"
fi
AC_SUBST(KRB4_LIBS)
AC_ARG_WITH(krb5,
[ --with-krb5=PREFIX Use Kerberos 5],
[krb5="$withval"], [krb5=no])
if test "$krb5" != no; then
AC_SEARCH_LIBS(gethostbyname, nsl)
AC_SEARCH_LIBS(socket, socket)
AC_CHECK_LIB(gen, compile)
if test "$krb5" != yes; then
PATH="$krb5/bin:$PATH"
fi
AC_CHECK_PROG(krb5config, krb5-config,yes)
if test "$krb5config" = yes; then
CPPFLAGS="$CPPFLAGS $(krb5-config --cflags krb5)"
KRB5_LIBS="$(krb5-config --libs krb5)"
else
if test "$krb5" != yes; then
CPPFLAGS="$CPPFLAGS -I$krb5/include"
LDFLAGS="$LDFLAGS -L$krb5/lib"
fi
KRB5_LIBS="-lkrb5 -lk5crypto -lcom_err"
fi
AC_CHECK_HEADER(krb5.h, :, [AC_MSG_ERROR(Kerberos 5 headers not found)])
local_save_LIBS=$LIBS
LIBS="$libs $KRB5_LIBS"
AC_CHECK_FUNC(krb5_init_context, :,
[AC_MSG_ERROR(Kerberos 5 libraries not found)])
LIBS="$local_save_LIBS"
AC_DEFINE(HAVE_KRB5, 1, [Define to compile with Kerberos 5 support.])
LIBZEPHYR_LIBS="$LIBZEPHYR_LIBS $KRB5_LIBS"
case "$target_os" in
darwin*) KRB5_LIBS="$KRB5_LIBS -framework Kerberos" ;;
esac
fi
AC_ARG_WITH(hesiod,
[ --with-hesiod=PREFIX Use Hesiod],
[hesiod="$withval"], [hesiod=no])
if test "$krb5" != no || test "$hesiod" != no; then
# the zephyr library needs -lresolv if it's built with krb5 or hesiod
AC_CHECK_LIB([resolv], [res_mkquery], [], [
AC_MSG_CHECKING([if res_mkquery is provided by libresolv with mangled symbols])
save_LIBS="$LIBS"
LIBS="-lresolv $LIBS"
AC_TRY_LINK([#include <resolv.h>],
[res_mkquery(0,NULL,0,0,NULL,0,NULL,NULL,0);], [
AC_DEFINE(HAVE_LIBRESOLV, [1], [Define if your libresolv provides res_mkquery.])
LIBZEPHYR_LIBS="-lresolv $LIBZEPHYR_LIBS"
AC_MSG_RESULT(yes)], [
LIBS="$save_LIBS"
AC_MSG_RESULT(no)
AC_MSG_ERROR(Zephyr requires libresolv along with Kerberos V or Hesiod.)
])])
fi
AC_SUBST(KRB5_LIBS)
AC_SUBST(LIBZEPHYR_LIBS)
if test "$hesiod" != no; then
if test "$hesiod" != yes; then
CPPFLAGS="$CPPFLAGS -I$hesiod/include"
LDFLAGS="$LDFLAGS -L$hesiod/lib"
fi
AC_CHECK_FUNC(hes_resolve, :,
AC_CHECK_LIB(hesiod, hes_resolve, HESIOD_LIBS="-lhesiod",
[AC_MSG_ERROR(Hesiod library not found)],$LIBS))
AC_DEFINE(HAVE_HESIOD, 1, [Define to compile with Hesiod support.])
fi
AC_SUBST(HESIOD_LIBS)
AC_ARG_WITH(regex,
[ --with-regex=PREFIX Use installed regex library],
[regex="$withval"], [regex=no])
if test "$regex" != no; then
if test "$regex" != yes; then
CPPFLAGS="$CPPFLAGS -I$regex/include"
LDFLAGS="$LDFLAGS -L$regex/lib"
fi
AC_CHECK_LIB(regex, regcomp, REGEX_LIBS=-lregex,
[AC_MSG_ERROR(regex library not found)])
else
AC_CHECK_FUNC(regcomp, :,
[AC_MSG_ERROR(can't find POSIX regexp support)])
fi
AC_SUBST(REGEX_LIBS)
AC_ARG_WITH(com_err,
[ --with-com_err=PREFIX Specify location of com_err],
[com_err="$withval"], [com_err=yes])
if test "$com_err" != no; then
if test "$com_err" != yes; then
CPPFLAGS="$CPPFLAGS -I$com_err/include"
LDFLAGS="$LDFLAGS -L$com_err/lib"
fi
AC_CHECK_LIB(com_err, com_err, :,
[AC_MSG_ERROR(com_err library not found)])
else
AC_MSG_ERROR(This package requires com_err.)
fi
AC_ARG_WITH(ss,
[ --with-ss=PREFIX Specify location of ss (requires com_err)],
[ss="$withval"], [ss=maybe])
if test "$ss" != no; then
if test "$ss" != yes -a "$ss" != maybe; then
CPPFLAGS="$CPPFLAGS -I$ss/include"
LDFLAGS="$LDFLAGS -L$ss/lib"
fi
AC_CHECK_LIB(ss, ss_perror,
[SS_LIBS="-lss"
AC_DEFINE(HAVE_SS, 1, [Define if we are building with the ss library])],
AS_IF([test "x$ss" != "xmaybe"], AC_MSG_ERROR(ss library not found)),
-lcom_err)
SS_OBJS='${SS_OBJS}'
fi
AC_SUBST(SS_LIBS)
AC_SUBST(SS_OBJS)
LIBS="$KRB5_LIBS $KRB4_LIBS $LIBS"
dnl Checks for library functions.
#XXX more looking for res_send
#AC_CHECK_FUNC(res_send, :, AC_CHECK_LIB(resolv, res_send))
AC_ARG_WITH([cares], AS_HELP_STRING([--with-cares], [Use libcares]))
if test "x$with_ares" != "xno"; then
AC_CHECK_LIB(cares, ares_getnameinfo,
[ARES_LIBS="-lcares"
AC_DEFINE(HAVE_ARES, 1, [Define to compile with c-ares support.])],
AS_IF([test "x$with_ares" = "xyes"],
AC_MSG_ERROR(libcares not found)))
fi
AC_SUBST(ARES_LIBS)
AC_PROG_GCC_TRADITIONAL
AC_FUNC_VPRINTF
AC_FUNC_GETPGRP
AC_FUNC_SETPGRP
AC_CHECK_FUNCS(putenv strchr memcpy memmove waitpid getlogin strerror random)
AC_CHECK_FUNCS(lrand48 gethostid getsid getpgid etext)
AC_CHECK_FUNCS(krb_get_err_text krb_log)
AC_CHECK_FUNCS(krb5_free_data krb5_c_make_checksum krb5_cc_set_default_name)
AC_CHECK_FUNCS(krb5_crypto_init krb5_c_decrypt krb5_free_unparsed_name)
AC_MSG_CHECKING(krb5_auth_con_getauthenticator out argument type)
AC_CACHE_VAL(ac_cv_krb5_auth_con_getauthenticator_takes_double_pointer, [
local_save_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="${CPPFLAGS} ${KRB5_INC_FLAGS}"
AC_TRY_COMPILE(
[#include <krb5.h>
krb5_error_code
krb5_auth_con_getauthenticator(krb5_context context,
krb5_auth_context auth_context,
krb5_authenticator *authenticator);],
[krb5_error_code foo = krb5_auth_con_getauthenticator(0, 0, 0);],
ac_cv_krb5_auth_con_getauthenticator_takes_double_pointer=no,
[AC_TRY_COMPILE(
[#include <krb5.h>
krb5_error_code
krb5_auth_con_getauthenticator(krb5_context context,
krb5_auth_context auth_context,
krb5_authenticator **authenticator);],
[krb5_error_code foo = krb5_auth_con_getauthenticator(0, 0, 0);],
ac_cv_krb5_auth_con_getauthenticator_takes_double_pointer=yes,
[AC_MSG_ERROR([Cannot identify krb5_auth_con_getauthenticator function signature])]
)])
CPPFLAGS="${local_save_CPPFLAGS}"
])
krb5_authent_type='krb5_authenticator *'
if test "$ac_cv_krb5_auth_con_getauthenticator_takes_double_pointer" = yes; then
AC_DEFINE(KRB5_AUTH_CON_GETAUTHENTICATOR_TAKES_DOUBLE_POINTER, 1,
[Define if `krb5_auth_con_getauthenticator' takes a double pointer third arg.])dnl
krb5_authent_type='krb5_authenticator **'
fi
AC_MSG_RESULT($krb5_authent_type)
AC_CACHE_CHECK([krb5_auth_con_getflags out argument type],
[ac_cv_krb5_auth_con_flags_type], [
local_save_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="${CPPFLAGS} ${KRB5_INC_FLAGS}"
for t in krb5_flags int32_t ; do
AC_TRY_COMPILE(
[#include <krb5.h>
extern krb5_error_code
krb5_auth_con_getflags(krb5_context, krb5_auth_context, $t *);],
[krb5_error_code foo = krb5_auth_con_getflags(0, 0, 0);],
[ac_cv_krb5_auth_con_flags_type=$t; break])
done
CPPFLAGS="${local_save_CPPFLAGS}"
if test "x$ac_cv_krb5_auth_con_flags_type" = x ; then
AC_MSG_ERROR([Cannot identify krb5_auth_con_getflags function signature])
fi
])
AC_DEFINE_UNQUOTED([KRB5_AUTH_CON_FLAGS_TYPE],
[$ac_cv_krb5_auth_con_flags_type],
[krb5_auth_con_getflags() output arg type])
AC_MSG_CHECKING(for enc_part2 in struct krb5_ticket)
AC_CACHE_VAL(ac_cv_have_krb5_ticket_enc_part2, [
local_save_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="${CPPFLAGS} ${KRB5_INC_FLAGS}"
AC_TRY_COMPILE(
[#include <krb5.h>], [krb5_ticket _tkt; _tkt.enc_part2;],
ac_cv_have_krb5_ticket_enc_part2=yes,
ac_cv_have_krb5_ticket_enc_part2=no)
])
CPPFLAGS="${local_save_CPPFLAGS}"
if test "$ac_cv_have_krb5_ticket_enc_part2" = yes; then
AC_DEFINE(HAVE_KRB5_TICKET_ENC_PART2, 1,
[Define to 1 if `enc_part2' is member of `krb5_ticket'.])dnl
fi
AC_MSG_RESULT($ac_cv_have_krb5_ticket_enc_part2)
AC_MSG_CHECKING(for enctype in struct krb5_keyblock)
AC_CACHE_VAL(ac_cv_have_krb5_creds_keyblock_enctype, [
local_save_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="${CPPFLAGS} ${KRB5_INC_FLAGS}"
AC_TRY_COMPILE(
[#include <krb5.h>], [krb5_creds _creds; _creds.keyblock.enctype;],
ac_cv_have_krb5_creds_keyblock_enctype=yes,
ac_cv_have_krb5_creds_keyblock_enctype=no)
])
CPPFLAGS="${local_save_CPPFLAGS}"
if test "$ac_cv_have_krb5_creds_keyblock_enctype" = yes; then
AC_DEFINE(HAVE_KRB5_CREDS_KEYBLOCK_ENCTYPE, 1,
[Define if `keyblock.enctype' is member of `krb5_creds'.])dnl
fi
AC_MSG_RESULT($ac_cv_have_krb5_creds_keyblock_enctype)
AC_ARG_ENABLE(cmu-zwgcplus,
[ --enable-cmu-zwgcplus enable CMU zwgcplus extensions],[
if test "$enableval" = "yes"; then
AC_DEFINE(CMU_ZWGCPLUS, 1, [Define to enable zwgcplus support])
fi
])
AC_ARG_ENABLE(cmu-zctl-punt,
[ --enable-cmu-zctl-punt enable CMU zctl punt extensions],[
if test "$enableval" = "yes"; then
AC_DEFINE(CMU_ZCTL_PUNT, 1,
[Define to pull in CMU zctl punt backward compat foo])
fi
])
AC_ARG_ENABLE(cmu-hm-flush-restrict,
[ --enable-cmu-hm-flush-restrict enable CMU zctl hm flush restriction],[
if test "$enableval" = "yes"; then
AC_DEFINE(HM_FLUSH_RESTRICT, 1,
[Define to get hm_flush restrictions in zctl])
fi
])
AC_ARG_ENABLE(cmu-opstaff-locate-self,
[ --enable-cmu-opstaff-locate-self enable CMU opstaff locate-self ability],[
if test "$enableval" = "yes"; then
AC_DEFINE(OPSTAFF_LOCATE_SELF, 1,
[Define to allow users to locate themselves if they are opstaff])
fi
])
AC_CONFIG_HEADER(h/config.h)
AC_OUTPUT(Makefile clients/Makefile clients/zaway/Makefile
clients/zctl/Makefile clients/zleave/Makefile
clients/zlocate/Makefile clients/znol/Makefile
clients/zshutdown_notify/Makefile clients/zstat/Makefile
clients/zwrite/Makefile lib/Makefile
server/Makefile zhm/Makefile zwgc/Makefile
zephyr.pc
)

View File

@ -0,0 +1,233 @@
-- Wireshark dissector for Zephyr
-- Place in ~/.local/lib/wireshark/plugins/2.6/
zephyr_protocol = Proto("Zephyr", "Zephyr IM Protocol")
local kind_names = {
[0] = "UNSAFE",
[1] = "UNACKED",
[2] = "ACKED",
[3] = "HMACK",
[4] = "HMCTL",
[5] = "SERVACK",
[6] = "SERVNAK",
[7] = "CLIENTACK",
[8] = "STAT"
}
zephyr_protocol.fields.version = ProtoField.stringz("zephyr.version", "Version")
zephyr_protocol.fields.numfields = ProtoField.uint32("zephyr.fields", "Field Count")
zephyr_protocol.fields.z_kind = ProtoField.uint32("zephyr.z_kind", "Kind", base.DEC, kind_names)
zephyr_protocol.fields.z_uid = ProtoField.stringz("zephyr.z_uid", "UID")
zephyr_protocol.fields.z_uid_addr = ProtoField.ipv4("zephyr.z_uid.zuid_addr", "Address")
zephyr_protocol.fields.z_uid_tv = ProtoField.absolute_time("zephyr.z_uid.tv", "Time")
zephyr_protocol.fields.z_port = ProtoField.uint16("zephyr.z_port", "Port")
zephyr_protocol.fields.z_auth = ProtoField.uint32("zephyr.z_auth", "Auth")
zephyr_protocol.fields.z_authent_len = ProtoField.uint32("zephyr.z_authent_len", "Authenticator Length")
zephyr_protocol.fields.z_ascii_authent = ProtoField.stringz("zephyr.z_ascii_authent", "Authenticator")
zephyr_protocol.fields.z_class = ProtoField.stringz("zephyr.z_class", "Class")
zephyr_protocol.fields.z_class_inst = ProtoField.stringz("zephyr.z_class_inst", "Instance")
zephyr_protocol.fields.z_opcode = ProtoField.stringz("zephyr.z_opcode", "Opcode")
zephyr_protocol.fields.z_sender = ProtoField.stringz("zephyr.z_sender", "Sender")
zephyr_protocol.fields.z_recipient = ProtoField.stringz("zephyr.z_recipient", "Recipient")
zephyr_protocol.fields.z_default_format = ProtoField.stringz("zephyr.z_default_format", "Default Format")
zephyr_protocol.fields.z_ascii_checksum = ProtoField.stringz("zephyr.z_ascii_checksum", "ASCII Checksum")
zephyr_protocol.fields.z_checksum = ProtoField.uint32("zephyr.z_checksum", "Checksum")
zephyr_protocol.fields.z_multinotice = ProtoField.stringz("zephyr.z_multinotice", "Multinotice")
zephyr_protocol.fields.z_multiuid = ProtoField.stringz("zephyr.z_multiuid", "MultiUID")
zephyr_protocol.fields.z_multiuid_addr = ProtoField.ipv4("zephyr.z_multiuid.zuid_addr", "Address")
zephyr_protocol.fields.z_multiuid_tv = ProtoField.absolute_time("zephyr.z_multiuid.tv", "Time")
zephyr_protocol.fields.z_sender_sockaddr = ProtoField.ipv4("zephyr.z_sender_sockaddr", "Sender sockaddr")
zephyr_protocol.fields.z_charset = ProtoField.uint16("zephyr.z_charset", "Character Set")
zephyr_protocol.fields.z_message = ProtoField.string("zephyr.z_message", "Message")
zephyr_protocol.fields.z_message_len = ProtoField.uint32("zephyr.z_message_len", "Message Length")
function parse_ascii(range)
local v = range(2):string()
return tonumber(string.match(v, "[0-9A-F]+"), 16)
end
function parse_ascii_ip(range)
local ip = "" .. tonumber(range(2, 2):string(), 16) .. "." .. tonumber(range(4, 2):string(), 16) .. "." .. tonumber(range(6, 2):string(), 16) .. "." .. tonumber(range(8, 2):string(), 16)
return Address.ip(ip)
end
function parse_zcode_ip(range)
local bytes = {}
local str = range(1,range:len()-2):bytes()
local i = 0
while i < str:len() do
local byte = str:get_index(i)
info(i .. ": " .. byte)
if (byte == 0xFF) then
if (str:get_index(i+1) == 0xF0) then
table.insert(bytes, 0)
elseif (str:get_index(i+1) == 0xF1) then
table.insert(bytes, 0xFF)
end
i = i + 2
else
table.insert(bytes, byte)
i = i + 1
end
end
info(bytes[1])
info(table.concat(bytes, "."))
return Address.ip(table.concat(bytes, "."))
end
function parse_ascii_tv(range)
info(range:string())
local seconds = parse_ascii(range)
local microseconds = parse_ascii(range(11))
return NSTime.new(seconds, microseconds*1000)
end
function zephyr_protocol.dissector(buffer, pinfo, tree)
length = buffer:len()
if length == 0 then return end
pinfo.cols.protocol = zephyr_protocol.name
local subtree = tree:add(zephyr_protocol, buffer(), "Zephyr")
local range = buffer()
local length = range:strsize()
local v = range:stringz()
subtree:add(zephyr_protocol.fields.version, range)
if v == "ZEPH0.2" then
range = buffer(range:offset()+range:len())
range = range(0, range:strsize())
local numfields = parse_ascii(range)
subtree:add(zephyr_protocol.fields.numfields, range, numfields)
numfields = numfields - 2
range = buffer(range:offset()+range:len())
range = range(0, range:strsize())
local kind = parse_ascii(range)
subtree:add(zephyr_protocol.fields.z_kind, range, kind)
numfields = numfields - 1
range = buffer(range:offset()+range:len())
range = range(0, range:strsize())
local z_uid = subtree:add(zephyr_protocol.fields.z_uid, range)
local addr = parse_ascii_ip(range)
local tv = parse_ascii_tv(range(11))
z_uid:add(zephyr_protocol.fields.z_uid_addr, range(0, 11), addr)
z_uid:add(zephyr_protocol.fields.z_uid_tv, range(11), tv)
z_uid:set_text("UID: " .. tostring(addr) .. " " .. tostring(tv))
numfields = numfields - 1
range = buffer(range:offset()+range:len())
range = range(0, range:strsize())
subtree:add(zephyr_protocol.fields.z_port, range, parse_ascii(range))
numfields = numfields - 1
range = buffer(range:offset()+range:len())
range = range(0, range:strsize())
subtree:add(zephyr_protocol.fields.z_auth, range, parse_ascii(range))
numfields = numfields - 1
range = buffer(range:offset()+range:len())
range = range(0, range:strsize())
local authent_length = parse_ascii(range)
subtree:add(zephyr_protocol.fields.z_authent_len, range, authent_length)
numfields = numfields - 1
function add(field)
range = buffer(range:offset()+range:len())
subtree:add(field, range)
numfields = numfields - 1
end
add(zephyr_protocol.fields.z_ascii_authent)
add(zephyr_protocol.fields.z_class)
local class = range:stringz()
add(zephyr_protocol.fields.z_class_inst)
local instance = range:stringz()
add(zephyr_protocol.fields.z_opcode)
local opcode = range:stringz()
add(zephyr_protocol.fields.z_sender)
add(zephyr_protocol.fields.z_recipient)
add(zephyr_protocol.fields.z_default_format)
if (numfields > 0) then
range = buffer(range:offset()+range:len())
range = range(0, range:strsize())
subtree:add(zephyr_protocol.fields.z_ascii_checksum, range)
local status, value = pcall(function() return parse_ascii(range) end)
if status then
subtree:add(zephyr_protocol.fields.z_checksum, range, value)
end
numfields = numfields - 1
-- TODO: validate checksum and flag if wrong
end
if (numfields > 0) then
range = buffer(range:offset()+range:len())
subtree:add(zephyr_protocol.fields.z_multinotice, range)
numfields = numfields - 1
end
if (numfields > 0) then
range = buffer(range:offset()+range:len())
range = range(0, range:strsize())
local z_multiuid = subtree:add(zephyr_protocol.fields.z_multiuid, range)
local addr = parse_ascii_ip(range)
local tv = parse_ascii_tv(range(11))
z_multiuid:add(zephyr_protocol.fields.z_multiuid_addr, range(0, 11), addr)
z_multiuid:add(zephyr_protocol.fields.z_multiuid_tv, range(11), tv)
z_multiuid:set_text("MultiUID: " .. tostring(addr) .. " " .. tostring(tv))
numfields = numfields - 1
-- else z_multiuid = z_uid
end
if (numfields > 0) then
range = buffer(range:offset()+range:len())
range = range(0, range:strsize())
if (range:string():byte(1) == 90) then
-- TODO: parse Zcode address for real
subtree:add(zephyr_protocol.fields.z_sender_sockaddr, range, parse_zcode_ip(range)):append_text(" (Zcode)")
else
subtree:add(zephyr_protocol.fields.z_sender_sockaddr, range, parse_ascii_ip(range)):append_text(" (NetASCII)")
end
numfields = numfields - 1
end
if (numfields > 0) then
range = buffer(range:offset()+range:len())
range = range(0, range:strsize())
subtree:add(zephyr_protocol.fields.z_charset, range, parse_ascii(range))
numfields = numfields - 1
end
if (numfields > 0) then
local otherfields = subtree:add("Other Fields")
for i = 1,numfields do
range = buffer(range:offset()+range:len())
range = range(0, range:strsize())
otherfields:add(range)
numfields = numfields - 1
end
end
range = buffer(range:offset()+range:len())
if (range:len() > 0) then
subtree:add(zephyr_protocol.fields.z_message_len, range:len())
subtree:add(zephyr_protocol.fields.z_message, range)
end
local info = kind_names[kind] .. " " .. class .. " " .. instance .. " " .. opcode
pinfo.columns.info = info
subtree.text = "Zephyr, " .. info
end
end
local udp_port = DissectorTable.get("udp.port")
udp_port:add(2102, zephyr_protocol)
udp_port:add(2103, zephyr_protocol)
udp_port:add(2104, zephyr_protocol)

1
debian/.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
zephyr.vars ident

1
debian/README.krb4-5 vendored Normal file
View File

@ -0,0 +1 @@
Placehold that will explain how to build an agile server goes here.

9
debian/acl/class-registry.acl vendored Normal file
View File

@ -0,0 +1,9 @@
wg_ctl:
hm_ctl:
hm_stat:
locate:
login:
zephyr_admin:
zephyr_ctl:
zmatch_all:
operations:

1
debian/acl/iui-hm_ctl.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/iui-hm_stat.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/iui-login.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/iui-operations.acl vendored Normal file
View File

@ -0,0 +1 @@
*.*@*

1
debian/acl/iui-user_locate.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/iui-wg_ctl.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/iui-zephyr_admin.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/iui-zephyr_ctl.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/iws-hm_ctl.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/iws-hm_stat.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/iws-login.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/iws-operations.acl vendored Normal file
View File

@ -0,0 +1 @@
*.*@*

1
debian/acl/iws-user_locate.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/iws-wg_ctl.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/iws-zephyr_admin.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/iws-zephyr_ctl.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/sub-hm_ctl.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/sub-hm_stat.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/sub-login.acl vendored Normal file
View File

@ -0,0 +1 @@
*.*@*

1
debian/acl/sub-operations.acl vendored Normal file
View File

@ -0,0 +1 @@
*.*@*

1
debian/acl/sub-user_locate.acl vendored Normal file
View File

@ -0,0 +1 @@
*.*@*

1
debian/acl/sub-wg_ctl.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/sub-zephyr_admin.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/sub-zephyr_ctl.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/xmt-hm_ctl.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/xmt-hm_stat.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/xmt-login.acl vendored Normal file
View File

@ -0,0 +1 @@
*.*@*

1
debian/acl/xmt-operations.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/xmt-user_locate.acl vendored Normal file
View File

@ -0,0 +1 @@
*.*@*

1
debian/acl/xmt-wg_ctl.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/xmt-zephyr_admin.acl vendored Normal file
View File

@ -0,0 +1 @@

1
debian/acl/xmt-zephyr_ctl.acl vendored Normal file
View File

@ -0,0 +1 @@
*.*@*

89
debian/changelog vendored Normal file
View File

@ -0,0 +1,89 @@
zephyr (1:3.1.999-trunk) unstable; urgency=low
* The next actual release on this branch will be 3.2... someday
-- Karl Ramm <kcr@1ts.org> Mon, 28 Oct 2013 00:32:21 -0400
zephyr (1:3.1.1-trunk) unstable; urgency=low
* release 3.1.1
-- Karl Ramm <kcr@1ts.org> Fri, 25 Oct 2013 01:15:29 -0400
zephyr (1:3.1-trunk) unstable; urgency=low
* release 3.1
-- Karl Ramm <kcr@1ts.org> Sat, 12 Oct 2013 13:15:58 -0400
zephyr (1:3.1~rc2-trunk) unstable; urgency=low
* release 3.1~rc2
-- Karl Ramm <kcr@1ts.org> Sun, 06 Oct 2013 20:53:42 -0400
zephyr (1:3.1~rc1-trunk) unstable; urgency=low
* release 3.1~rc1
-- Karl Ramm <kcr@1ts.org> Sat, 28 Sep 2013 19:45:21 -0400
zephyr (1:3.1~rc0-trunk) unstable; urgency=low
* release 3.1~rc0
-- Karl Ramm <kcr@1ts.org> Sat, 28 Sep 2013 15:18:25 -0400
zephyr (1:3.1~beta1-trunk) unstable; urgency=low
* release 3.1~beta1
-- Karl Ramm <kcr@1ts.org> Thu, 08 Aug 2013 02:23:32 -0400
zephyr (1:3.1-beta0-trunk) unstable; urgency=low
* release 3.1-beta0
-- Karl Ramm <kcr@1ts.org> Sun, 07 Jul 2013 22:08:01 -0400
zephyr (1:3.0.999-trunk) UNRELEASED; urgency=low
* Any further revisions to 3.0.x go on the 3.0.x branch; the mainline is for 3.1 stuff
-- Karl Ramm <kcr@1ts.org> Sat, 11 Feb 2012 10:53:49 -0500
zephyr (1:3.0.2-trunk) unstable; urgency=low
* release 3.0.2
-- Karl Ramm <kcr@1ts.org> Sun, 22 Jan 2012 02:12:41 -0500
zephyr (1:3.0.1) unstable; urgency=low
* 80% more nelhage proof
-- Karl Ramm <kcr@1ts.org> Sun, 06 Mar 2011 10:54:46 -0500
zephyr (1:3.0.1~rc.HEAD) unstable; urgency=low
* bugfixes ahoy.
-- Karl Ramm <kcr@1ts.org> Wed, 07 Jul 2010 16:26:49 -0400
zephyr (1:3.0) unstable; urgency=low
* Might as well let it escape.
-- Karl Ramm <kcr@1ts.org> Mon, 05 Oct 2009 19:56:17 -0400
zephyr (1:3.0~rc.HEAD) unstable; urgency=low
* It's Release Candidate Time!
-- Karl Ramm <kcr@1ts.org> Mon, 03 Aug 2009 01:27:46 -0400
zephyr (1:3.0~beta.HEAD) inconceivable; urgency=low
* Mark version for upstream trunk
-- Karl Ramm <kcr@1ts.org> Sat, 28 Mar 2009 12:59:14 -0400

1
debian/compat vendored Normal file
View File

@ -0,0 +1 @@
5

191
debian/control vendored Normal file
View File

@ -0,0 +1,191 @@
Source: zephyr
Section: net
Priority: optional
Maintainer: Karl Ramm <kcr@1ts.org>
Build-Depends: debhelper (>= 5), libc-ares-dev, libkrb5-dev (>= 1.2.2-4),
comerr-dev, ss-dev, libreadline-dev | libreadline5-dev,
libx11-dev, libxt-dev, x11proto-core-dev, libncurses5-dev,
bison, libhesiod-dev, autotools-dev, python (>= 2.5), python-central,
autoconf, libtool, automake, git-core | git, devscripts
Build-Conflicts: autoconf2.13
Standards-Version: 3.9.2.0
Homepage: http://zephyr.1ts.org/
Vcs-Svn: git://zephyr.1ts.org/zephyr.git
Vcs-Browser: http://zephyr.1ts.org/browser/zephyr
XS-Python-Version: 2.5
Package: libzephyr4
Section: libs
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Conflicts: libzephyr4-krb, libzephyr4-krb5, libzephyr4-krb45
Description: Project Athena's notification service - non-Kerberos libraries
Zephyr is derived from the original Project Athena 'Instant Message' system
and allows users to send messages to other users or to groups of users.
Users can view incoming Zephyr messages as windowgrams (transient X
windows) or as text on a terminal.
.
This package provides the libraries without Kerberos support.
Package: libzephyr4-krb
Section: libs
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, krb4-config
Conflicts: libzephyr4, libzephyr4-krb5, libzephyr4-krb45
Replaces: libzephyr4, libzephyr4-krb5, libzephyr4-krb45
Provides: libzephyr4
Description: Project Athena's notification service - libraries with Kerberos
Zephyr is derived from the original Project Athena 'Instant Message' system
and allows users to send messages to other users or to groups of users.
Users can view incoming Zephyr messages as windowgrams (transient X
windows) or as text on a terminal.
.
This package provides libraries that use Kerberos.
Package: libzephyr4-krb5
Section: libs
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, krb5-config
Conflicts: libzephyr4, libzephyr4-krb, libzephyr4-krb45
Replaces: libzephyr4, libzephyr4-krb, libzephyr4-krb45
Provides: libzephyr4
Description: The original "Instant Message" system libraries with Kerberos 5
This version of the library uses Kerberos for message authentication.
.
This is the Project Athena Zephyr notification system.
Zephyr allows users to send messages to other users or to groups of
users. Users can view incoming Zephyr messages as windowgrams
(transient X windows) or as text on a terminal.
Package: libzephyr4-krb45
Section: libs
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, krb5-config
Conflicts: libzephyr4, libzephyr4-krb, libzephyr4-krb5
Replaces: libzephyr4, libzephyr4-krb, libzephyr4-krb5
Provides: libzephyr4
Description: The original "Instant Message" system libraries with Kerberos 4+5
This version of the library uses Kerberos for message authentication.
.
This is the Project Athena Zephyr notification system.
Zephyr allows users to send messages to other users or to groups of
users. Users can view incoming Zephyr messages as windowgrams
(transient X windows) or as text on a terminal.
Package: libzephyr-python
Section: python
Architecture: any
Depends: ${python:Depends}, ${misc:Depends}, libzephyr4
Provides: ${python:Provides}
XB-Python-Version: ${python:Verions}
Description: Python bindings for zephyr library
Get at the zephyr library from python.
Package: zephyr-clients
Section: net
Replaces: zephyr-client
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, debianutils (>= 1.6), debconf | debconf-2.0
Description: Project Athena's notification service - client programs
Zephyr is derived from the original Project Athena 'Instant Message' system
and allows users to send messages to other users or to groups of users.
Users can view incoming Zephyr messages as windowgrams (transient X
windows) or as text on a terminal.
.
This package provides client programs for the messaging service.
Package: zephyr-server
Section: net
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, debconf | debconf-2.0
Conflicts: zephyr-server-krb, zephyr-server-krb5, zephyr-server-krb45
Description: Project Athena's notification service - non-Kerberos server
Zephyr is derived from the original Project Athena 'Instant Message' system
and allows users to send messages to other users or to groups of users.
Users can view incoming Zephyr messages as windowgrams (transient X
windows) or as text on a terminal.
.
This package provides the server for the messaging service, which
maintains a location and subscription database for all the receiving
clients. All zephyrgrams are sent to the server to be routed to the
intended recipient. Only one server is required for a group of clients.
Package: zephyr-server-krb
Section: net
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, debconf | debconf-2.0, libzephyr4-krb
Conflicts: zephyr-server, zephyr-server-krb5, zephyr-server-krb45
Replaces: zephyr-server, zephyr-server-krb5, zephyr-server-krb45
Provides: zephyr-server
Description: Project Athena's notification service - server with Kerberos
Zephyr is derived from the original Project Athena 'Instant Message' system
and allows users to send messages to other users or to groups of users.
Users can view incoming Zephyr messages as windowgrams (transient X
windows) or as text on a terminal.
.
This package provides the server for the messaging service. Only one
server is needed for a group of client. The program consumes much memory,
especially for very large sites.
.
The server maintains a location and subscription database for all the
receiving clients. All zephyrgrams are sent to the server to be routed
to the intended recipient.
.
This version of the server uses Kerberos.
Package: zephyr-server-krb5
Section: net
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, debconf | debconf-2.0, libzephyr4-krb5
Conflicts: zephyr-server, zephyr-server-krb, zephyr-server-krb45
Replaces: zephyr-server, zephyr-server-krb, zephyr-server-krb45
Provides: zephyr-server
Description: The original "Instant Message" system-server with Kerberos 5
You probably only need one server for a group of clients.
This can be a memory-intensive server, especially for very large sites.
.
The server maintains a location and subscription database for all the
receiving clients. All zephyrgrams are sent to the server to be routed
to the intended recipient.
.
This version of the server uses Kerberos for message authentication.
.
This is the Project Athena Zephyr notification system.
Zephyr allows users to send messages to other users or to groups of
users. Users can view incoming Zephyr messages as windowgrams
(transient X windows) or as text on a terminal.
Package: zephyr-server-krb45
Section: net
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, debconf | debconf-2.0, libzephyr4-krb45
Conflicts: zephyr-server, zephyr-server-krb, zephyr-server-krb5
Replaces: zephyr-server, zephyr-server-krb, zephyr-server-krb5
Provides: zephyr-server
Description: The original "Instant Message" system-server with Kerberos 4+5
You probably only need one server for a group of clients.
This can be a memory-intensive server, especially for very large sites.
.
The server maintains a location and subscription database for all the
receiving clients. All zephyrgrams are sent to the server to be routed
to the intended recipient.
.
This version of the server uses Kerberos for message authentication.
.
This is the Project Athena Zephyr notification system.
Zephyr allows users to send messages to other users or to groups of
users. Users can view incoming Zephyr messages as windowgrams
(transient X windows) or as text on a terminal.
Package: libzephyr-dev
Section: libdevel
Architecture: any
Depends: libzephyr4 (= ${binary:Version}) | libzephyr4-krb (= ${binary:Version}) | libzephyr4-krb5 (= ${binary:Version}) | libzephyr4-krb45 (= ${binary:Version}), ${misc:Depends}, libc6-dev
Description: Project Athena's notification service - development files
Zephyr is derived from the original Project Athena 'Instant Message' system
and allows users to send messages to other users or to groups of users.
Users can view incoming Zephyr messages as windowgrams (transient X
windows) or as text on a terminal.
.
This package provides development libraries and files, which are
needed to compile alternative Zephyr clients.

125
debian/copyright vendored Normal file
View File

@ -0,0 +1,125 @@
This package was debianized by Karl Ramm <kcr@1ts.org> on
Mon, 4 Dec 2000 05:28:22 -0500.
It was downloaded from ftp://athena-dist.mit.edu/pub/ATHENA/zephyr
Copyright:
/*
Copyright 1987,1988,1995 by the Massachusetts Institute of Technology
All rights reserved.
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of the Massachusetts
Institute of Technology (M.I.T.) not be used in advertising or publicity
pertaining to distribution of the software without specific, written
prior permission.
M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
*/
/*
* lib/quad_cksum.c
*
* Copyright 1985, 1986, 1987, 1988,1990 by the Massachusetts Institute
* of Technology.
* All Rights Reserved.
*
* Export of this software from the United States of America may
* require a specific license from the United States Government.
* It is the responsibility of any person or organization contemplating
* export to obtain such a license before exporting.
*
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
* distribute this software and its documentation for any purpose and
* without fee is hereby granted, provided that the above copyright
* notice appear in all copies and that both that copyright notice and
* this permission notice appear in supporting documentation, and that
* the name of M.I.T. not be used in advertising or publicity pertaining
* to distribution of the software without specific, written prior
* permission. Furthermore if you modify this software you must label
* your software as modified software and not distribute it in such a
* fashion that it might be confused with the original M.I.T. software.
* M.I.T. makes no representations about the suitability of
* this software for any purpose. It is provided "as is" without express
* or implied warranty.
*/
server/utf8proc.[ch]:
/*
* Copyright (c) 2006-2007 Jan Behrens, FlexiGuided GmbH, Berlin
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
server/utf8proc_data.c:
/*
* This file contains derived data from a modified version of the
* Unicode data files.
*
* The original data files are available at
* http://www.unicode.org/Public/UNIDATA/
*
*
* COPYRIGHT AND PERMISSION NOTICE
*
* Copyright (c) 1991-2007 Unicode, Inc. All rights reserved. Distributed
* under the Terms of Use in http://www.unicode.org/copyright.html.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of the Unicode data files and any associated documentation (the "Data
* Files") or Unicode software and any associated documentation (the
* "Software") to deal in the Data Files or Software without restriction,
* including without limitation the rights to use, copy, modify, merge,
* publish, distribute, and/or sell copies of the Data Files or Software, and
* to permit persons to whom the Data Files or Software are furnished to do
* so, provided that (a) the above copyright notice(s) and this permission
* notice appear with all copies of the Data Files or Software, (b) both the
* above copyright notice(s) and this permission notice appear in associated
* documentation, and (c) there is clear notice in each modified Data File or
* in the Software as well as in the documentation associated with the Data
* File(s) or Software that the data or software has been modified.
*
* THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
* KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR
* CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THE DATA FILES OR SOFTWARE.
*
* Except as contained in this notice, the name of a copyright holder shall
* not be used in advertising or otherwise to promote the sale, use or other
* dealings in these Data Files or Software without prior written
* authorization of the copyright holder.
*/

3
debian/default.subscriptions vendored Normal file
View File

@ -0,0 +1,3 @@
operations,message,*
message,personal,%me%
message,urgent,%me%

2
debian/dirs vendored Normal file
View File

@ -0,0 +1,2 @@
usr/bin
usr/sbin

6
debian/libzephyr-dev.files vendored Normal file
View File

@ -0,0 +1,6 @@
usr/lib/libzephyr.a
usr/lib/libzephyr.so
usr/lib/pkgconfig/zephyr.pc
usr/include/zephyr/mit-copyright.h
usr/include/zephyr/zephyr.h
usr/include/zephyr/zephyr_err.h

1
debian/libzephyr-python.files vendored Normal file
View File

@ -0,0 +1 @@
usr/lib/python2.5/site-packages/zephyr_ctypes.py

15
debian/libzephyr4-krb5.templates vendored Normal file
View File

@ -0,0 +1,15 @@
Template: libzephyr4-krb5/no-more-krb4
Type: boolean
Default: true
Description: Potentially incompatible upgrade
You appear to be upgrading from a version of zephyr that uses
Kerberos version 4 to authenticate. Kerberos version 4 support has
been removed from Debian, and accordingly from zephyr. This version
of zephyr uses Kerberos 5 to authenticate, and thus your servers must
have been upgraded for it to be useful.
.
A server that authenticates both ways can be built for lenny from the
zephyr source package, see:
/usr/share/doc/libzephyr4-krb5/README.krb4-5
.
Continue with the upgrade?

1
debian/libzephyr4.files vendored Normal file
View File

@ -0,0 +1 @@
usr/lib/libzephyr.so.*

2
debian/po/POTFILES.in vendored Normal file
View File

@ -0,0 +1,2 @@
[type: gettext/rfc822deb] zephyr-clients.templates
[type: gettext/rfc822deb] zephyr-server.templates

91
debian/po/cs.po vendored Normal file
View File

@ -0,0 +1,91 @@
#
# Translators, if you are not familiar with the PO format, gettext
# documentation is worth reading, especially sections dedicated to
# this format, e.g. by running:
# info -n '(gettext)PO Files'
# info -n '(gettext)Header Entry'
#
# Some information specific to po-debconf are available at
# /usr/share/doc/po-debconf/README-trans
# or http://www.debian.org/intl/l10n/po-debconf/README-trans
#
# Developers do not need to manually edit POT or PO files.
#
msgid ""
msgstr ""
"Project-Id-Version: zephyr\n"
"Report-Msgid-Bugs-To: Source: zephyr@packages.debian.org\n"
"POT-Creation-Date: 2007-12-05 09:47+0530\n"
"PO-Revision-Date: 2007-12-08 17:00+0100\n"
"Last-Translator: Miroslav Kure <kurem@debian.cz>\n"
"Language-Team: Czech <debian-l10n-czech@lists.debian.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid "Zephyr servers:"
msgstr "Zephyr servery:"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"Please specify the full names of the Zephyr servers, as a space-separated "
"list."
msgstr ""
"Zadejte prosím plná jména Zephyr serverů; jednotlivá jména oddělte mezerami."
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"The list configured on clients can be a subset of the list configured on "
"servers."
msgstr ""
"Seznam definovaný na klientech může být podmnožinou seznamu definovaného na "
"serverech."
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001
msgid "This can be left empty if Hesiod is used to advertise Zephyr servers."
msgstr ""
"Pokud pro oznamování Zephyr serverů používáte Hesiod, můžete ponechat "
"prázdné."
#~ msgid ""
#~ "We want to try and capture user changes when they edit a config file "
#~ "manually. To do this we look at the file in the config script. However, "
#~ "in the case of preconfigure, the config script is run twice before the "
#~ "postinst is run. Thus we may read the wrong value before the edited "
#~ "value is written out in postinst. If this is false we skip reading config "
#~ "files until postinst runs."
#~ msgstr ""
#~ "Snažíme se rozpoznat a zachytit uživatelovy ruční změny v konfiguračním "
#~ "souboru, což se děje v konfiguračním skriptu. Ovšem v případě "
#~ "předkonfigurace je konfigurační skript spuštěn dvakrát před spuštěním "
#~ "poinstalačního skriptu a tudíž můžeme přečíst chybnou hodnotu před tím, "
#~ "než je upravená hodnota zapsána v poinstalačním kroku. Pokud je to "
#~ "chybně, přeskočíme čtení kofiguračních souborů až do poinstalační fáze."
#~ msgid "You have no zephyr servers specified for the client"
#~ msgstr "Pro klienta jste nezadali žádné zephyr servery"
#~ msgid ""
#~ "The zephyr-clients package for whatever reason does not have any zephyr "
#~ "servers configured. Please edit the file /etc/default/zephyr-clients and "
#~ "add the names of your zephyr servers, separated by spaces to the zhm_args "
#~ "variable."
#~ msgstr ""
#~ "Balíček zephyr-clients nemá z nějakého důvodu nakonfigurován žádný zephyr "
#~ "server. Upravte prosím soubor /etc/default/zephyr-clients a přidejte do "
#~ "něj do proměnné zhm_args mezerami oddělená jména zephyr serverů."
#~ msgid "What are your zephyr servers?"
#~ msgstr "Jaké jsou vaše zephyr servery?"
#~ msgid "You should never see this"
#~ msgstr "Toto jste nikdy neměli vidět"

65
debian/po/es.po vendored Normal file
View File

@ -0,0 +1,65 @@
# zephyr debconf translation to spanish
# Copyright (C) 2001, 2006, 2007 Software in the Public Interest
# This file is distributed under the same license as the zephyr package.
#
# Changes:
# - Initial translation
# Carlos Valdivia Yagüe <valyag@dat.etsit.upm.es>, 2001, 2006, 2007
#
# Translators, if you are not familiar with the PO format, gettext
# documentation is worth reading, especially sections dedicated to
# this format, e.g. by running:
# info -n '(gettext)PO Files'
# info -n '(gettext)Header Entry'
#
# Some information specific to po-debconf are available at
# /usr/share/doc/po-debconf/README-trans
# or http://www.debian.org/intl/l10n/po-debconf/README-trans
#
# Developers do not need to manually edit POT or PO files.
#
msgid ""
msgstr ""
"Project-Id-Version: zephyr 2.1.20070719.SNAPSHOT-4\n"
"Report-Msgid-Bugs-To: Source: zephyr@packages.debian.org\n"
"POT-Creation-Date: 2007-12-05 09:47+0530\n"
"PO-Revision-Date: 2007-12-05 15:50+0100\n"
"Last-Translator: Carlos Valdivia Yagüe <valyag@dat.etsit.upm.es>\n"
"Language-Team: Debian L10n Spanish <debian-l10n-spanish@lists.debian.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid "Zephyr servers:"
msgstr "Servidores Zephyr:"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"Please specify the full names of the Zephyr servers, as a space-separated "
"list."
msgstr ""
"Por favor, introduzca el nombre completo de los servidores Zephyr como una "
"lista separada por espacios."
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"The list configured on clients can be a subset of the list configured on "
"servers."
msgstr ""
"La lista configurada en los clientes puede ser un subconjunto de la lista "
"configurada en los servidores."
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001
msgid "This can be left empty if Hesiod is used to advertise Zephyr servers."
msgstr ""
"Puede dejarlo en blanco si se utiliza Hesiod para anunciar los servidores "
"Zephyr."

56
debian/po/fr.po vendored Normal file
View File

@ -0,0 +1,56 @@
# translation of fr.po to French
#
# Translators, if you are not familiar with the PO format, gettext
# documentation is worth reading, especially sections dedicated to
# this format, e.g. by running:
# info -n '(gettext)PO Files'
# info -n '(gettext)Header Entry'
# Some information specific to po-debconf are available at
# /usr/share/doc/po-debconf/README-trans
# or http://www.debian.org/intl/l10n/po-debconf/README-trans#
# Developers do not need to manually edit POT or PO files.
#
msgid ""
msgstr ""
"Project-Id-Version: zephyr_2.1.20070913.SNAPSHOT-3\n"
"Report-Msgid-Bugs-To: Source: zephyr@packages.debian.org\n"
"POT-Creation-Date: 2007-12-05 09:47+0530\n"
"PO-Revision-Date: 2007-12-23 15:01+0100\n"
"Last-Translator: Michel Grentzinger <mic.grentz@online.fr>\n"
"Language-Team: French <debian-l10n-french@lists.debian.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-15\n"
"Content-Transfer-Encoding: 8bit\n"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid "Zephyr servers:"
msgstr "Serveurs Zephyr :"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"Please specify the full names of the Zephyr servers, as a space-separated "
"list."
msgstr ""
"Veuillez indiquer le nom complet des serveurs Zephyr, séparés par un espace."
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"The list configured on clients can be a subset of the list configured on "
"servers."
msgstr ""
"La liste configurée sur les clients peut être un sous-ensemble de la liste "
"configurée sur les serveurs."
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001
msgid "This can be left empty if Hesiod is used to advertise Zephyr servers."
msgstr ""
"Ce champ peut être laissé vide si Hesiod est employé pour annoncer les "
"serveurs Zephyr."

100
debian/po/gl.po vendored Normal file
View File

@ -0,0 +1,100 @@
# Galician translation of zephyr's debconf templates
# This file is distributed under the same license as the zephyr package.
# Jacobo Tarrio <jtarrio@debian.org>, 2007.
#
msgid ""
msgstr ""
"Project-Id-Version: zephyr\n"
"Report-Msgid-Bugs-To: Source: zephyr@packages.debian.org\n"
"POT-Creation-Date: 2007-12-05 09:47+0530\n"
"PO-Revision-Date: 2007-12-05 20:45+0000\n"
"Last-Translator: Jacobo Tarrio <jtarrio@debian.org>\n"
"Language-Team: Galician <proxecto@trasno.net>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid "Zephyr servers:"
msgstr "Servidores zephyr:"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"Please specify the full names of the Zephyr servers, as a space-separated "
"list."
msgstr ""
"Indique os nomes completos dos servidores Zephyr, nunha lista de nomes "
"separados por comas."
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"The list configured on clients can be a subset of the list configured on "
"servers."
msgstr ""
"A lista configurada nos clientes pode ser un subconxunto da lista "
"configurada nos servidores."
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001
msgid "This can be left empty if Hesiod is used to advertise Zephyr servers."
msgstr ""
"Pódese deixar baleiro se se emprega Hesiod para anunciar os servidores "
"Zephyr."
#, fuzzy
#~ msgid ""
#~ "Please type the full names of your zephyr servers, separated by spaces. "
#~ "(note that this can be a subset of what you're telling the servers) If "
#~ "you are using hesiod to advertise your zephyr servers, leave this blank."
#~ msgstr ""
#~ "Escriba os nomes completos dos seus servidores zephyr, separados por "
#~ "espazos. (Teña en conta que isto pode ser un subconxunto do que lles "
#~ "conta aos servidores)"
#~ msgid ""
#~ "Please type the full names of your zephyr servers, separated by spaces. "
#~ "(Note that this can be a superset of that you're telling the clients.)"
#~ msgstr ""
#~ "Escriba os nomes completos dos seus servidores zephyr, separados por "
#~ "espazos. (Teña en conta que pode ser un superconxunto do que lles di aos "
#~ "clientes)."
#~ msgid "for internal use"
#~ msgstr "para uso interno"
#~ msgid ""
#~ "We want to try and capture user changes when they edit a config file "
#~ "manually. To do this we look at the file in the config script. However, "
#~ "in the case of preconfigure, the config script is run twice before the "
#~ "postinst is run. Thus we may read the wrong value before the edited "
#~ "value is written out in postinst. If this is false we skip reading config "
#~ "files until postinst runs."
#~ msgstr ""
#~ "Preténdes capturar os cambios que fan os usuarios cando modifican "
#~ "manualmente un ficheiro de configuración. Para facelo consúltase o "
#~ "ficheiro no script de configuración. Nembargantes, no caso da "
#~ "preconfiguración, o script de configuración execútase dúas veces antes de "
#~ "executar o script de post-instalación. Polo tanto, pódese ler o valor "
#~ "incorrecto antes de que se grave o valor editado na post-instalación. Se "
#~ "isto é falso omítese a lectura de ficheiros de configuración ata que se "
#~ "execute o script de post-instalación."
#~ msgid "You have no zephyr servers specified for the client"
#~ msgstr "Non especificou servidores zephyr para o cliente"
#~ msgid ""
#~ "The zephyr-clients package for whatever reason does not have any zephyr "
#~ "servers configured. Please edit the file /etc/default/zephyr-clients and "
#~ "add the names of your zephyr servers, separated by spaces to the zhm_args "
#~ "variable."
#~ msgstr ""
#~ "Por algún motivo, o paquete zephyr-clients non ten configurado ningún "
#~ "servidor zephyr. Edite o ficheiro /etc/default/zephyr-clients e engada os "
#~ "nomes dos servidores zephyr, separados por espazos, á variable zhm_args."

45
debian/po/ja.po vendored Normal file
View File

@ -0,0 +1,45 @@
# Copyright (C) 2008 Karl Ramm <kcr@debian.org>
# This file is distributed under the same license as the zephyr package.
# Hideki Yamane (Debian-JP) <henrich@debian.or.jp>, 2008.
#
msgid ""
msgstr ""
"Project-Id-Version: zephyr 2.1.20070719.SNAPSHOT-1.2\n"
"Report-Msgid-Bugs-To: Source: zephyr@packages.debian.org\n"
"POT-Creation-Date: 2007-12-05 09:47+0530\n"
"PO-Revision-Date: 2008-12-28 22:26+0900\n"
"Last-Translator: Hideki Yamane (Debian-JP) <henrich@debian.or.jp>\n"
"Language-Team: Japanese <debian-japanese@lists.debian.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid "Zephyr servers:"
msgstr "Zephyr サーバ:"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"Please specify the full names of the Zephyr servers, as a space-separated "
"list."
msgstr ""
"Zephyr サーバの名前を全て、スペースで区切ったリストで指定してください。"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"The list configured on clients can be a subset of the list configured on "
"servers."
msgstr ""
"クライアント上で設定されたリストは、サーバ上で設定されたリストのサブセットになります。"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001
msgid "This can be left empty if Hesiod is used to advertise Zephyr servers."
msgstr "Hesiod を Zephyr サーバの広報に利用している場合は、ここは空のままで構いません。"

112
debian/po/nl.po vendored Normal file
View File

@ -0,0 +1,112 @@
#
# Translators, if you are not familiar with the PO format, gettext
# documentation is worth reading, especially sections dedicated to
# this format, e.g. by running:
# info -n '(gettext)PO Files'
# info -n '(gettext)Header Entry'
#
# Some information specific to po-debconf are available at
# /usr/share/doc/po-debconf/README-trans
# or http://www.debian.org/intl/l10n/po-debconf/README-trans
#
# Developers do not need to manually edit POT or PO files.
#
msgid ""
msgstr ""
"Project-Id-Version: zephyr\n"
"Report-Msgid-Bugs-To: Source: zephyr@packages.debian.org\n"
"POT-Creation-Date: 2007-12-05 09:47+0530\n"
"PO-Revision-Date: 2007-12-09 14:00+0100\n"
"Last-Translator: Bart Cornelis <cobaco@skolelinux.no>\n"
"Language-Team: debian-l10n-dutch <debian-l10n-dutch@lists.debian.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Poedit-Language: Dutch\n"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid "Zephyr servers:"
msgstr "Zephyr-servers:"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"Please specify the full names of the Zephyr servers, as a space-separated "
"list."
msgstr ""
"Gelieve hier een (met spaties gescheiden) lijst van de de volledige namen "
"van de Zephyr-servers op te geven."
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"The list configured on clients can be a subset of the list configured on "
"servers."
msgstr ""
"De op de clients ingestelde lijst mag een subset zijn van de op de servers "
"ingestelde lijst."
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001
msgid "This can be left empty if Hesiod is used to advertise Zephyr servers."
msgstr ""
"Als u Hesiod gebruikt om Zephyr-servers te adverteren kunt u dit veld "
"leeglaten."
#, fuzzy
#~ msgid ""
#~ "Please type the full names of your zephyr servers, separated by spaces. "
#~ "(note that this can be a subset of what you're telling the servers) If "
#~ "you are using hesiod to advertise your zephyr servers, leave this blank."
#~ msgstr ""
#~ "Gelieve de volledige naam van uw zephyr-servers op te geven gescheiden "
#~ "door spaties (merk op dat dit een subset kan zijn van wat u aan de "
#~ "servers vertelt)."
#, fuzzy
#~ msgid ""
#~ "Please type the full names of your zephyr servers, separated by spaces. "
#~ "(Note that this can be a superset of that you're telling the clients.)"
#~ msgstr ""
#~ "Gelieve de volledige namen van uw zephyr-servers op te geven, gescheiden "
#~ "door spaties (merk op dat dit een superset kan zijn van wat u de clients "
#~ "verteld)."
#~ msgid "for internal use"
#~ msgstr "voor intern gebruik"
#~ msgid ""
#~ "We want to try and capture user changes when they edit a config file "
#~ "manually. To do this we look at the file in the config script. However, "
#~ "in the case of preconfigure, the config script is run twice before the "
#~ "postinst is run. Thus we may read the wrong value before the edited "
#~ "value is written out in postinst. If this is false we skip reading config "
#~ "files until postinst runs."
#~ msgstr ""
#~ "Er wordt geprobeerd om gebruikersaanpassingen op te vangen wanneer een "
#~ "configuratiebestand handmatig aangepast wordt. Hiertoe kijkt het "
#~ "'config'-script in het configuratiebestand, maar in het geval van "
#~ "preconfigure wordt dit script tweemaal uitgevoerd voordat het 'postinst'-"
#~ "script gedraaid wordt. Dit kan er toe leiden dat de verkeerde waarde "
#~ "wordt uitgeschreven voordat de aangepaste waarde uitgeschreven wordt in "
#~ "het 'postinst'-script. Als dit onwaar is slaan we het lezen van "
#~ "configuratiebestanden over totdat het 'postinst'-script uitgevoerd is."
#~ msgid "You have no zephyr servers specified for the client"
#~ msgstr "U heeft geen zephyr-servers opgegeven voor de client."
#~ msgid ""
#~ "The zephyr-clients package for whatever reason does not have any zephyr "
#~ "servers configured. Please edit the file /etc/default/zephyr-clients and "
#~ "add the names of your zephyr servers, separated by spaces to the zhm_args "
#~ "variable."
#~ msgstr ""
#~ "Het 'zephyr-clients'-pakket heeft om wat voor reden dan ook geen zephyr-"
#~ "servers ingesteld. Gelieve het bestand /etc/default/zephyr-clients aan te "
#~ "passen en de namen van uw zephyr-servers gescheiden door spaties toe te "
#~ "voegen aan de 'zhm_args'-variabele."

98
debian/po/pt.po vendored Normal file
View File

@ -0,0 +1,98 @@
# Portuguese translation for zephyr's debconf messages
# Ricardo Silva <ardoric@gmail.com>, 2007
#
msgid ""
msgstr ""
"Project-Id-Version: zephyr 2.1.20070719.SNAPSHOT-3\n"
"Report-Msgid-Bugs-To: Source: zephyr@packages.debian.org\n"
"POT-Creation-Date: 2007-12-05 09:47+0530\n"
"PO-Revision-Date: 2007-12-19 22:05+0000\n"
"Last-Translator: Ricardo Silva <ardoric@gmail.com>\n"
"Language-Team: Portuguese <traduz@debianpt.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid "Zephyr servers:"
msgstr "Servidores Zephyr:"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"Please specify the full names of the Zephyr servers, as a space-separated "
"list."
msgstr ""
"Por favor especifique o nome completo dos servidores Zephyr, numa lista "
"separada por espaços."
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"The list configured on clients can be a subset of the list configured on "
"servers."
msgstr ""
"A lista configurada nos clientes pode ser um sub-conjunto da lista "
"configurada nos servidores."
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001
msgid "This can be left empty if Hesiod is used to advertise Zephyr servers."
msgstr ""
"Esta opção pode ser deixada vazia se o Hesiod for utilizado para anunciar os "
"servidores Zephyr."
#~ msgid ""
#~ "Please type the full names of your zephyr servers, separated by spaces. "
#~ "(note that this can be a subset of what you're telling the servers) If "
#~ "you are using hesiod to advertise your zephyr servers, leave this blank."
#~ msgstr ""
#~ "Por favor escreva os nomes completos dos seus servidores zephyr, "
#~ "separados por espaços. (note que esta lista pode ser um subconjunto do "
#~ "que diz aos servidores)"
#~ msgid ""
#~ "Please type the full names of your zephyr servers, separated by spaces. "
#~ "(Note that this can be a superset of that you're telling the clients.)"
#~ msgstr ""
#~ "Por favor escreva os nomes completos dos seus servidores zephyr, "
#~ "separados por espaços. (Note que esta lista pode ser um super-conjunto "
#~ "do que diz aos clientes.)"
#~ msgid "for internal use"
#~ msgstr "para uso interno"
#~ msgid ""
#~ "We want to try and capture user changes when they edit a config file "
#~ "manually. To do this we look at the file in the config script. However, "
#~ "in the case of preconfigure, the config script is run twice before the "
#~ "postinst is run. Thus we may read the wrong value before the edited "
#~ "value is written out in postinst. If this is false we skip reading config "
#~ "files until postinst runs."
#~ msgstr ""
#~ "Tentamos determinar que alterações os utilizadores fazem quando editam "
#~ "um ficheiro de configuração manualmente. Para tal analisamos o ficheiro "
#~ "no script de configuração. No entanto quando há pré-configuração, o "
#~ "script de configuração é corrido duas vezes antes do pós-instalaçÃ"
#~ "£o. Assim podemos ler os valores errados antes que o valor editado seja "
#~ "escrito no pós-instalação. Se esta opção for falsa não analisamos "
#~ "os ficheiros de configuração até que o pós-instalação corra."
#~ msgid "You have no zephyr servers specified for the client"
#~ msgstr "Não tem nenhum servidor zephyr especificado para o cliente"
#~ msgid ""
#~ "The zephyr-clients package for whatever reason does not have any zephyr "
#~ "servers configured. Please edit the file /etc/default/zephyr-clients and "
#~ "add the names of your zephyr servers, separated by spaces to the zhm_args "
#~ "variable."
#~ msgstr ""
#~ "O pacote zephyr-clients por alguma razão não tem nenhum servidor zephyr "
#~ "configurado. Por favor edite o ficheiro /etc/default/zephyr-clients e "
#~ "adicione os nomes dos seus servidores zephyr, separados por espaços à "
#~ "variável zhm_args."

111
debian/po/pt_BR.po vendored Normal file
View File

@ -0,0 +1,111 @@
# Translators, if you are not familiar with the PO format, gettext
# documentation is worth reading, especially sections dedicated to
# this format, e.g. by running:
# info -n '(gettext)PO Files'
# info -n '(gettext)Header Entry'
# Some information specific to po-debconf are available at
# /usr/share/doc/po-debconf/README-trans
# or http://www.debian.org/intl/l10n/po-debconf/README-trans
# Developers do not need to manually edit POT or PO files.
#
#
#
msgid ""
msgstr ""
"Project-Id-Version: zephyr 2.1\n"
"Report-Msgid-Bugs-To: Source: zephyr@packages.debian.org\n"
"POT-Creation-Date: 2007-12-05 09:47+0530\n"
"PO-Revision-Date: 2008-10-06 02:33-0300\n"
"Last-Translator: Felipe Augusto van de Wiel (faw) <faw@debian.org>\n"
"Language-Team: Brazilian Portuguese <debian-l10n-portuguese@lists.debian."
"org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"pt_BR\n"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid "Zephyr servers:"
msgstr "Servidores Zephyr:"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"Please specify the full names of the Zephyr servers, as a space-separated "
"list."
msgstr ""
"Por favor, especifique os nomes completos dos servidores Zephyr, use uma "
"lista separada por espaços."
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"The list configured on clients can be a subset of the list configured on "
"servers."
msgstr ""
"A lista configurada nos clientes pode ser um subconjunto da lista "
"configurada nos servidores."
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001
msgid "This can be left empty if Hesiod is used to advertise Zephyr servers."
msgstr ""
"É possível deixar este campo vazio se o Hesiod for usado para anunciar os "
"servidores Zephyr."
#~ msgid ""
#~ "Please type the full names of your zephyr servers, separated by spaces. "
#~ "(note that this can be a subset of what you're telling the servers) If "
#~ "you are using hesiod to advertise your zephyr servers, leave this blank."
#~ msgstr ""
#~ "Por favor digite o nome completo dos seus servidores zephyr, separado por "
#~ "espaços. (note que isso pode ser um subconjunto daquilo que você está "
#~ "dizendo aos servidores)"
#~ msgid ""
#~ "Please type the full names of your zephyr servers, separated by spaces. "
#~ "(Note that this can be a superset of that you're telling the clients.)"
#~ msgstr ""
#~ "Por favor digite os nomes completos de seus servidores zephyr, separado "
#~ "por espaços. (Note que isso pode ser um subconjunto daquilo que você está "
#~ "dizendo aos clientes.)"
#~ msgid ""
#~ "We want to try and capture user changes when they edit a config file "
#~ "manually. To do this we look at the file in the config script. However, "
#~ "in the case of preconfigure, the config script is run twice before the "
#~ "postinst is run. Thus we may read the wrong value before the edited "
#~ "value is written out in postinst. If this is false we skip reading config "
#~ "files until postinst runs."
#~ msgstr ""
#~ "Nós queremos tentar e capturar mudanças de usuários quando eles editam um "
#~ "arquivo de configuração manualmente. Para fazer isso nós olhamos no "
#~ "arquivo do script de configuração. De qualquer forma, no caso de pré-"
#~ "configuração, o script de configuração é executado duas vezes antes do "
#~ "\"postinst\" ser executado. Se isso for falso nós continuamos lendo os "
#~ "arquivos de configuração até que o \"postinst\" seja executado."
#~ msgid "You have no zephyr servers specified for the client"
#~ msgstr "Você não tem servidores zephyr especificados para o cliente"
#~ msgid ""
#~ "The zephyr-clients package for whatever reason does not have any zephyr "
#~ "servers configured. Please edit the file /etc/default/zephyr-clients and "
#~ "add the names of your zephyr servers, separated by spaces to the zhm_args "
#~ "variable."
#~ msgstr ""
#~ "Por uma razão qualquer o pacote zephyr-clients não possui qualquer "
#~ "servidor zephyr configurado. Por favor edite o arquivo /etc/default/"
#~ "zephyr-clients e adicione os nomes dos seus servidores zephyr, separado "
#~ "por espaços na variável zhm_args."
#~ msgid "What are your zephyr servers?"
#~ msgstr "Quais são os seus servidores zephyr?"
#~ msgid "You should never see this"
#~ msgstr "Você nunca deveria ter visto isso"

61
debian/po/ru.po vendored Normal file
View File

@ -0,0 +1,61 @@
# translation of ru.po to Russian
#
# Translators, if you are not familiar with the PO format, gettext
# documentation is worth reading, especially sections dedicated to
# this format, e.g. by running:
# info -n '(gettext)PO Files'
# info -n '(gettext)Header Entry'
#
# Some information specific to po-debconf are available at
# /usr/share/doc/po-debconf/README-trans
# or http://www.debian.org/intl/l10n/po-debconf/README-trans
#
# Developers do not need to manually edit POT or PO files.
#
# Unknown, 2003,.
# Yuri Kozlov <kozlov.y@gmail.com>, 2006, 2007.
msgid ""
msgstr ""
"Project-Id-Version: 2.1.20070719.SNAPSHOT-3\n"
"Report-Msgid-Bugs-To: Source: zephyr@packages.debian.org\n"
"POT-Creation-Date: 2007-12-05 09:47+0530\n"
"PO-Revision-Date: 2007-12-19 20:35+0300\n"
"Last-Translator: Yuri Kozlov <kozlov.y@gmail.com>\n"
"Language-Team: Russian <debian-l10n-russian@lists.debian.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: KBabel 1.11.4\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid "Zephyr servers:"
msgstr "Серверы Zephyr:"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"Please specify the full names of the Zephyr servers, as a space-separated "
"list."
msgstr "Введите список полных имён серверов Zephyr через пробел."
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"The list configured on clients can be a subset of the list configured on "
"servers."
msgstr ""
"На клиентах можно указывать подмножество списка, настроенного на серверах."
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001
msgid "This can be left empty if Hesiod is used to advertise Zephyr servers."
msgstr ""
"Можно ничего не вводить, если для объявления серверов Zephyr используется "
"Hesiod."

57
debian/po/sv.po vendored Normal file
View File

@ -0,0 +1,57 @@
# translation of zephyr_2.1.20070719.SNAPSHOT-1.1_sv.po to Swedish
# Translators, if you are not familiar with the PO format, gettext
# documentation is worth reading, especially sections dedicated to
# this format, e.g. by running:
# info -n '(gettext)PO Files'
# info -n '(gettext)Header Entry'
# Some information specific to po-debconf are available at
# /usr/share/doc/po-debconf/README-trans
# or http://www.debian.org/intl/l10n/po-debconf/README-trans
# Developers do not need to manually edit POT or PO files.
#
# Martin Ågren <martin.agren@gmail.com>, 2008.
msgid ""
msgstr ""
"Project-Id-Version: zephyr_2.1.20070719.SNAPSHOT-1.1_sv\n"
"Report-Msgid-Bugs-To: Source: zephyr@packages.debian.org\n"
"POT-Creation-Date: 2007-12-05 09:47+0530\n"
"PO-Revision-Date: 2008-07-20 10:41+0200\n"
"Last-Translator: Martin Ågren <martin.agren@gmail.com>\n"
"Language-Team: Swedish <debian-l10n-swedish@lists.debian.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: KBabel 1.11.4\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid "Zephyr servers:"
msgstr "Zephyr-servrar:"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"Please specify the full names of the Zephyr servers, as a space-separated "
"list."
msgstr "Ange hela namnen på Zephyr-servrarna som en blankstegsseparerad lista."
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"The list configured on clients can be a subset of the list configured on "
"servers."
msgstr ""
"Den lista som konfigureras på klienter kan vara en delmängd av listan som "
"konfigureras på servrar."
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001
msgid "This can be left empty if Hesiod is used to advertise Zephyr servers."
msgstr ""
"Detta fält kan lämnas tomt om Hesiod används för att tillkännage Zephyr-"
"servrar."

45
debian/po/templates.pot vendored Normal file
View File

@ -0,0 +1,45 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: Source: zephyr@packages.debian.org\n"
"POT-Creation-Date: 2007-12-05 09:47+0530\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid "Zephyr servers:"
msgstr ""
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"Please specify the full names of the Zephyr servers, as a space-separated "
"list."
msgstr ""
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001 ../zephyr-server.templates:2001
msgid ""
"The list configured on clients can be a subset of the list configured on "
"servers."
msgstr ""
#. Type: string
#. Description
#: ../zephyr-clients.templates:2001
msgid "This can be left empty if Hesiod is used to advertise Zephyr servers."
msgstr ""

177
debian/rules vendored Executable file
View File

@ -0,0 +1,177 @@
#!/usr/bin/make -f
# Sample debian/rules that uses debhelper.
# GNU copyright 1997 by Joey Hess.
#
# This version is for a hypothetical package that builds an
# architecture-dependant package, as well as an architecture-independent
# package.
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
VARIETALS=krb5
#VARIETALS=krb krb45 krb5
PACKAGES:=-plibzephyr4 -pzephyr-clients -pzephyr-server -plibzephyr-dev -plibzephyr-python $(foreach i,$(VARIETALS),-plibzephyr4-$(i) -pzephyr-server-$(i))
# This has to be exported to make some magic below work.
export DH_OPTIONS
CONFIGURE_ROOT=--prefix=/usr --mandir=\$${prefix}/share/man \
--infodir=\$${prefix}/share/info --sysconfdir=/etc --datadir=/etc \
--with-cares=/usr --with-hesiod=/usr --enable-cmu-zwgcplus
CONFIGURE_krb5=--with-krb5=/usr
CONFIGURE_krb45=--with-krb4=/usr --with-krb5=/usr
CONFIGURE_krb=--with-krb4=/usr
CONFIGURE_no-krb=
CFLAGS=-g -O
CHECK=
# see /usr/share/doc/autotools-dev/README.Debian.gz
export DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
export DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
# FOR AUTOCONF 2.52 AND NEWER ONLY
ifeq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE))
CONFIGURE_ROOT += --build $(DEB_HOST_GNU_TYPE)
else
CONFIGURE_ROOT += --build $(DEB_BUILD_GNU_TYPE) --host $(DEB_HOST_GNU_TYPE)
endif
BUILD_VARIETALS=$(VARIETALS) no-krb
configure: configure-stamp
configure-stamp:
dh_testdir
# Add here commands to configure the package.
libtoolize
aclocal
automake -a || true # we only want this for install-sh
autoreconf
mkdir -p $(BUILD_VARIETALS)
$(foreach VARIETY,$(BUILD_VARIETALS),(cd $(VARIETY) && CFLAGS="$(CFLAGS)" ../configure $(CONFIGURE_$(VARIETY)) $(CONFIGURE_ROOT));)
touch configure-stamp
build-arch: build-stamp
build-indep: build-stamp
build: build-stamp
build-stamp: configure-stamp
dh_testdir
# Add here commands to compile the package.
set -e; \
for dir in $(VARIETALS) ; do \
$(MAKE) -C $$dir h/zephyr_version.h; $(MAKE) -C $$dir/lib all $(CHECK); $(MAKE) -C $$dir/server; \
done
$(MAKE) -C no-krb all $(CHECK)
touch build-stamp
clean:
dh_testdir
dh_testroot
-rm -f build-stamp configure-stamp
# Add here commands to clean up after the build process.
-rm -rf autom4te.cache m4
-rm aclocal.m4 config.guess config.sub configure h/config.h.in \
install-sh ltmain.sh
-rm -rf $(VARIETALS) no-krb debian/tmp-krb*
-rm debian/zephyr-server-krb.files
-rm debian/zephyr-server-krb.templates
-rm debian/zephyr-server-krb.config
-rm debian/zephyr-server-krb.postinst
-rm debian/zephyr-server-krb5.README.Debian \
debian/zephyr-server-krb5.docs debian/zephyr-server-krb5.files \
debian/zephyr-server-krb5.postinst debian/zephyr-server-krb5.postrm \
debian/zephyr-server-krb5.templates
-rm debian/zephyr-server-krb45.*
-rm debian/libzephyr4-krb.files debian/libzephyr4-krb5.files \
debian/libzephyr4-krb45.files
dh_clean -XTAGS
install: DH_OPTIONS=
install: build
dh_testdir
dh_testroot
dh_prep -XTAGS
-rm -rf debian/tmp-krb*
dh_installdirs
# Add here commands to install the package into debian/tmp.
$(MAKE) -C no-krb DESTDIR=$(CURDIR)/debian/tmp install
for dir in $(VARIETALS); do \
$(MAKE) -C $$dir SUBDIRS="lib server" DESTDIR=$(CURDIR)/debian/tmp-$$dir install; \
done
mkdir -p debian/tmp/etc/zephyr/acl
set -x; for i in debian/acl/*; do install -c -m 644 -o root $$i debian/tmp/etc/zephyr/acl; done; set +x
install -c -m 644 debian/zephyr.vars debian/tmp/etc/zephyr
install -c -m 644 debian/default.subscriptions debian/tmp/etc/zephyr
for dir in $(VARIETALS); do \
cp -rp debian/tmp/etc/zephyr/acl debian/tmp-$$dir/etc/zephyr; \
done
mkdir -p debian/tmp/usr/lib/python2.5/site-packages
install -c -m 644 python/zephyr_ctypes.py debian/tmp/usr/lib/python2.5/site-packages
# Build architecture-independent files here.
# Pass -i to all debhelper commands in this target to reduce clutter.
binary-indep: build install
# Build architecture-dependent files here.
# Pass -a to all debhelper commands in this target to reduce clutter.
binary-arch: build install
dh_testdir
dh_testroot
set -e; \
for file in files templates postinst docs; do \
for dir in $(VARIETALS); do \
cp debian/zephyr-server.$$file debian/zephyr-server-$$dir.$$file; \
done; \
done
for file in config init; do \
for dir in $(filter-out krb5,$(VARIETALS)); do \
cp debian/zephyr-server.$$file debian/zephyr-server-$$dir.$$file; \
done; \
done
for file in README.Debian docs postrm; do \
for dir in $(filter-out krb,$(VARIETALS)); do \
cp debian/zephyr-server-krb.$$file debian/zephyr-server-$$dir.$$file; \
done; \
done
for dir in $(VARIETALS); do \
cp debian/libzephyr4.files debian/libzephyr4-$$dir.files; \
done
dh_movefiles -plibzephyr4 -pzephyr-clients -pzephyr-server -plibzephyr-dev -plibzephyr-python
for dir in $(VARIETALS); do \
dh_movefiles --sourcedir=debian/tmp-$$dir -plibzephyr4-$$dir -pzephyr-server-$$dir; \
done
dh_installdebconf
dh_installdocs
dh_installinit -pzephyr-clients --init-script=zhm --no-start
dh_installinit -pzephyr-server --init-script=zephyrd
for dir in $(VARIETALS); do \
dh_installinit -pzephyr-server-$$dir --init-script=zephyrd; \
done
dh_installchangelogs
dh_pycentral -plibzephyr-python
dh_python -plibzephyr-python
dh_strip
dh_compress
dh_fixperms
dh_makeshlibs
# sigh
for dir in $(VARIETALS); do \
cp debian/libzephyr4/DEBIAN/shlibs debian/libzephyr4-$$dir/DEBIAN/shlibs; \
done
dh_shlibdeps $(PACKAGES)
dh_installdeb $(PACKAGES)
dh_gencontrol $(PACKAGES)
dh_md5sums $(PACKAGES)
dh_builddeb $(PACKAGES)
for dir in $(VARIETALS); do \
dh_builddeb --sourcedir=debian/tmp-$$dir -plibzephyr4-$$dir -pzephyr-server-$$dir; \
done
binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install

42
debian/zephyr-clients.config vendored Normal file
View File

@ -0,0 +1,42 @@
#!/bin/sh -e
. /usr/share/debconf/confmodule
db_version 2.0
db_get zephyr-clients/servers || true
if test -z "$RET"
then
# If there's an /etc/zephyr/server.list file lying around, read it
if test -f /etc/zephyr/server.list
then
z="`cat /etc/zephyr/server.list`"
if test -n "$z"
then
db_set zephyr-clients/servers "`echo $z`"
fi
else
# if there happens to be zephyr server decconf on this machine,
# see what its debconf knows about zephyr servers...
if db_get zephyr-server/servers && test -n "$RET"
then
db_set zephyr-clients/servers $RET
fi
fi
fi
db_get zephyr-clients/read_conf
if test -f /etc/default/zephyr-clients -a \( "$RET" = true \)
then
zhm_args=""
. /etc/default/zephyr-clients
if test -n "$zhm_args"
then
db_set zephyr-clients/read_conf false
db_set zephyr-clients/servers "$zhm_args"
fi
fi
db_input high zephyr-clients/servers || true
db_go || true

1
debian/zephyr-clients.docs vendored Normal file
View File

@ -0,0 +1 @@
USING

24
debian/zephyr-clients.files vendored Normal file
View File

@ -0,0 +1,24 @@
usr/bin/zaway
usr/bin/zctl
usr/bin/zleave
usr/bin/zlocate
usr/bin/znol
usr/bin/zstat
usr/bin/zwrite
usr/bin/zwgc
usr/sbin/zshutdown_notify
usr/sbin/zhm
usr/share/man/man1/zephyr.1
usr/share/man/man1/zaway.1
usr/share/man/man1/zctl.1
usr/share/man/man1/zleave.1
usr/share/man/man1/zlocate.1
usr/share/man/man1/znol.1
usr/share/man/man1/zwrite.1
usr/share/man/man1/zwgc.1
usr/share/man/man8/zshutdown_notify.8
usr/share/man/man8/zstat.8
usr/share/man/man8/zhm.8
etc/zephyr/zwgc.desc
etc/zephyr/zwgc_resources
etc/zephyr/zephyr.vars

74
debian/zephyr-clients.init vendored Normal file
View File

@ -0,0 +1,74 @@
#! /bin/sh
#
# skeleton example file to build /etc/init.d/ scripts.
# This file should be used to construct scripts for /etc/init.d.
#
# Written by Miquel van Smoorenburg <miquels@cistron.nl>.
# Modified for Debian GNU/Linux
# by Ian Murdock <imurdock@gnu.ai.mit.edu>.
#
# Version: @(#)skeleton 1.8 03-Mar-1998 miquels@cistron.nl
#
# This file was automatically customized by dh-make on Mon, 4 Dec 2000 05:28:22 -0500
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/zhm
NAME=zhm
DESC="zephyr host manager"
test -f $DAEMON || exit 0
set -e
if test -f /etc/default/zephyr-clients
then
. /etc/default/zephyr-clients
fi
case "$1" in
start)
echo -n "Starting $DESC: "
start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
--exec $DAEMON -- $zhm_args
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon --oknodo --stop --quiet --pidfile /var/run/$NAME.pid \
--name $NAME
echo "$NAME."-
;;
restart|force-reload)
#
# If the "reload" option is implemented, move the "force-reload"
# option to the "reload" entry above. If not, "force-reload" is
# just the same as "restart".
#
echo -n "Restarting $DESC: "
start-stop-daemon --oknodo --stop --retry 5 --quiet --pidfile \
/var/run/$NAME.pid --name $NAME
start-stop-daemon --start --quiet --pidfile \
/var/run/$NAME.pid --exec $DAEMON -- -N $zhm_args
echo "$NAME."
;;
*)
N=/etc/init.d/$NAME
# echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $N {start|stop|restart|force-reload}" >&2
exit 1
;;
esac
exit 0
### BEGIN INIT INFO
# Provides: zhm
# Required-Start: $syslog $network $remote_fs
# Required-Stop: $syslog $remote_fs
# Should-Stop: $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start the zephyr host manager daemon.
# Description: Start the zephyr host manager daemon.
### END INIT INFO

84
debian/zephyr-clients.postinst vendored Normal file
View File

@ -0,0 +1,84 @@
#! /bin/sh
# postinst script for zephyr
#
# see: dh_installdeb(1)
set -e
# summary of how this script can be called:
# * <postinst> `configure' <most-recently-configured-version>
# * <old-postinst> `abort-upgrade' <new version>
# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
# <new-version>
# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
# <failed-install-package> <version> `removing'
# <conflicting-package> <version>
# for details, see /usr/share/doc/packaging-manual/
#
# quoting from the policy:
# Any necessary prompting should almost always be confined to the
# post-installation script, and should be protected with a conditional
# so that unnecessary prompting doesn't happen if a package's
# installation fails and the `postinst' is called with `abort-upgrade',
# `abort-remove' or `abort-deconfigure'.
case "$1" in
configure)
. /usr/share/debconf/confmodule
db_version 2.0
db_set zephyr-clients/read_conf true
if test -f /etc/zephyr/zephyr.conf
then
if test ! -f /etc/default/zephyr-clients
then
mv /etc/zephyr/zephyr.conf /etc/default/zephyr-clients
fi
fi
# if /etc/default/zephyr-clients already exists and has a zhm_args
# line, the config script should have sucked it into debconf
db_get zephyr-clients/servers || true
tmpfile=/etc/default/zephyr-client.dpkg-new
if test -f /etc/default/zephyr-clients
then
grep -v ^zhm_args /etc/default/zephyr-clients > $tmpfile || true
else
cat > $tmpfile << EOF
# This file is automatically rewritten by the zephyr-clients post-install
# script. So treat it right.
EOF
fi
echo zhm_args=\"${RET}\" >> $tmpfile
cat $tmpfile > /etc/default/zephyr-clients
rm $tmpfile
;;
abort-upgrade|abort-remove|abort-deconfigure)
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 0
;;
esac
if [ -x "/etc/init.d/zhm" ]; then
# this script does not necessarily fail if these do
if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then
invoke-rc.d zhm restart
else
/etc/init.d/zhm restart
fi
fi
# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.
#DEBHELPER#
exit 0

Some files were not shown because too many files have changed in this diff Show More