Use err(3). Add prototypes. Document that startup scripts are rc.i386 and

rc.conf (enable/disable) not rc.local.
Use full pathname in SYNOPSIS section.
This commit is contained in:
Philippe Charnier 1997-12-04 07:25:19 +00:00
parent 8cda9fcc0d
commit 14d460e1b4
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=31525
5 changed files with 92 additions and 61 deletions

View File

@ -27,10 +27,13 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id$
*/
#ifndef lint
static const char rcsid[] =
"$Id$";
#endif /* not lint */
#include <stdio.h>
#include <sys/time.h>
#include "xtend.h"
@ -55,6 +58,7 @@ char *X10cmdnames[] = {
* Log a packet and update device status accordingly
*/
void
logpacket(p)
unsigned char *p;
{
@ -72,6 +76,7 @@ unsigned char *p;
* in core and on disk.
*/
void
processpacket(p)
unsigned char *p;
{

View File

@ -27,10 +27,13 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id$
*/
#ifndef lint
static const char rcsid[] =
"$Id$";
#endif /* not lint */
#include <stdio.h>
#include <unistd.h>
#include <sys/param.h>
@ -39,14 +42,15 @@
#include "xten.h"
#include "paths.h"
void printstatus __P((FILE *, STATUS *));
/*
* Initialize the status table from the status files
*/
void
initstatus()
{
int h, i;
if(lseek(status, 0, SEEK_SET) != 0) {
fprintf(Log, "%s: Seek error on status file\n", thedate());
return;
@ -62,6 +66,7 @@ initstatus()
* and notify anyone monitoring those devices.
*/
void
checkpoint_status()
{
int h, i, k, offset;

View File

@ -27,11 +27,17 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: user.c,v 1.5 1997/02/22 14:22:42 peter Exp $
*/
#ifndef lint
static const char rcsid[] =
"$Id$";
#endif /* not lint */
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/param.h>
#include <sys/time.h>
#include "xtend.h"
@ -40,15 +46,19 @@
MONENTRY Monitor[MAXMON];
int find __P((char *, char *[]));
void printstatus __P((FILE *, STATUS *));
/*
* Process a user command
*/
int
user_command()
{
char h;
char *m;
int i, k, c, n, error;
int i, k, n, error;
char cmd[512], dumppath[MAXPATHLEN+1], pkt[3];
FILE *dumpf;
@ -137,6 +147,7 @@ user_command()
return(0);
}
int
find(s, tab)
char *s;
char *tab[];
@ -149,6 +160,7 @@ char *tab[];
return(-1);
}
void
printstatus(f, s)
FILE *f;
STATUS *s;

View File

@ -27,16 +27,17 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" $Id: xtend.8,v 1.6 1997/02/22 14:22:43 peter Exp $
.\" $Id: xtend.8,v 1.7 1997/06/24 03:52:15 stark Exp $
.\"
.Th XTEND 8 "30 Oct 1993"
.Dd Oct 30, 1993
.Dt XTEND 8
.Os BSD FreeBSD
.Sh NAME
xtend \- X-10 daemon
.Sh SYNOPSIS
.Nm xtend
.Nd X-10 daemon
.Sh SYNOPSIS
.Nm /usr/libexec/xtend
.Sh DESCRIPTION
.Nm Xtend
interfaces between user-level programs and the TW523 X-10 controller.
@ -45,26 +46,29 @@ status of all X-10 devices, and accepts socket connections from user-level
client programs that need to manipulate X-10 devices.
.Pp
When
.Nm xtend
.Nm
is started, it forks, releases the controlling terminal, then opens
its log file, where it subsequently records all X-10 activity and
diagnostic messages. It then begins processing packets received from
the TW523 and accepting connections one at a time from clients
wishing to issue X-10 commands. The usual place to start xtend would
be from the
.Pa /etc/rc.local
startup script.
wishing to issue X-10 commands.
.Nm Xtend
is started from
.Pa /etc/rc.i386
startup script if enabled in
.Pa /etc/rc.conf
script.
.Pp
Sending
.Nm xtend
.Nm
a SIGHUP causes it to close and reopen its log file. This is useful
in shell scripts that rotate the log files to keep them from growing
indefinitely.
If
.Nm xtend
.Nm
receives a SIGTERM, it shuts down gracefully and exits.
A SIGPIPE causes
.Nm xtend
.Nm
to abort the current client connection.
.Pp
.Nm Xtend
@ -73,16 +77,16 @@ command is sent by the client, and is acknowledged by a one-line response
from the daemon.
.Pp
.Nm Xtend
understands four types of commands. The command
understands four types of commands. The command:
.Bl -tag
.It status H U
.El
.Pp
where H is a single letter house code, and U is a numeric unit code,
causes
.Nm xtend
.Nm
to respond with one line of status information about the specified device.
The command
The command:
.Bl -tag
.It send H U N
.El
@ -93,7 +97,7 @@ or a function code (see source file
) for a list, and N is a number indicating the number of times (usually 2)
the packet is to be transmitted without gaps,
causes
.Nm xtend
.Nm
to perform the specified X-10 transmission. If the transmission was apparently
successful, a single-line response containing
.B
@ -102,25 +106,27 @@ is issued, otherwise a single-line response containing
.B
ERROR
is produced.
The command
The command:
.Bl -tag
.It dump
.El
.Pp
causes
.Nm xtend
to dump the current status of all devices to an ASCII file in the spool
.Nm
to dump the current status of all devices to an
.Tn ASCII
file in the spool
directory. The response
.B
OK
is issued, regardless of whether the status dump was successful.
The command
The command:
.Bl -tag
.It monitor H U
.El
.Pp
causes
.Nm xtend
.Nm
to add the current client socket connection to a list of clients that are to
be notified about activity concerning the specified X-10 device.
The single-line acknowledgement
@ -135,7 +141,7 @@ is returned.
then returns to its normal mode of accepting connections from clients.
However, each subsequent change in the status of the specified device will
cause
.Nm xtend
.Nm
to write one line of status information for the device (in the same
format as produced by the
.B
@ -161,7 +167,8 @@ log file
.It Pa /var/spool/xten/Status
device status file (binary)
.It Pa /var/spool/xten/status.out
ASCII dump of device status
.Tn ASCII
dump of device status
.El
.Sh BUGS
There is currently no timeout on client socket connections, so a hung
@ -173,4 +180,4 @@ usually no way it can tell when a device has been operated manually.
This is due to the fact that most X-10 devices are not able to
respond to queries about their status.
.Sh AUTHOR
Eugene W. Stark (stark@cs.sunysb.edu)
.An Eugene W. Stark Aq stark@cs.sunysb.edu

View File

@ -27,22 +27,28 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id$
*/
#ifndef lint
static const char rcsid[] =
"$Id$";
#endif /* not lint */
/*
* xtend - X-10 daemon
* Eugene W. Stark (stark@cs.sunysb.edu)
* January 14, 1993
*/
#include <stdio.h>
#include <time.h>
#include <err.h>
#include <pwd.h>
#include <setjmp.h>
#include <signal.h>
#include <pwd.h>
#include <grp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <sys/param.h>
#include <sys/file.h>
#include <sys/types.h>
@ -52,6 +58,7 @@
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <grp.h>
#include "xtend.h"
#include "xten.h"
@ -68,6 +75,13 @@ void onhup(); /* SIGHUP handler */
void onterm(); /* SIGTERM handler */
void onpipe(); /* SIGPIPE handler */
void checkpoint_status __P((void));
void initstatus __P((void));
void logpacket __P((unsigned char *));
void processpacket __P((unsigned char *));
int user_command __P((void));
int
main(argc, argv)
int argc;
char *argv[];
@ -82,28 +96,21 @@ char *argv[];
struct group *gr;
struct stat sb;
int user;
int fd;
FILE *pidf;
/*
* Make sure we start out running as root
*/
if(geteuid() != 0) {
fprintf(stderr, "You must be root to run %s\n", argv[0]);
exit(1);
}
if(geteuid() != 0)
errx(1, "you must be root");
/*
* Find out what UID/GID we are to run as
*/
if((pw = getpwnam(XTENUNAME)) == NULL) {
fprintf(stderr, "%s: No such user '%s'\n", argv[0], XTENUNAME);
exit(1);
}
if((gr = getgrnam(XTENGNAME)) == NULL) {
fprintf(stderr, "%s: No such group '%s'\n", argv[0], XTENGNAME);
exit(1);
}
if((pw = getpwnam(XTENUNAME)) == NULL)
errx(1, "no such user '%s'", XTENUNAME);
if((gr = getgrnam(XTENGNAME)) == NULL)
errx(1, "no such group '%s'", XTENGNAME);
/*
* Open the log file before doing anything else
@ -113,16 +120,13 @@ char *argv[];
if(mkdir(logpath, 0755) != -1) {
chown(logpath, pw->pw_uid, gr->gr_gid);
} else {
fprintf(stderr, "%s: Can't create directory '%s'\n", argv[0], logpath);
exit(1);
errx(1, "can't create directory '%s'", logpath);
}
}
strcat(logpath, "/");
strcat(logpath, X10LOGNAME);
if((Log = fopen(logpath, "a")) == NULL) {
fprintf(stderr, "Can't open log file %s\n", logpath);
exit(1);
}
if((Log = fopen(logpath, "a")) == NULL)
errx(1, "can't open log file '%s'", logpath);
chown(logpath, pw->pw_uid, gr->gr_gid);
/*
@ -334,10 +338,8 @@ void onhup()
strcpy(logpath, X10DIR);
strcat(logpath, "/");
strcat(logpath, X10LOGNAME);
if((Log = fopen(logpath, "a")) == NULL) {
fprintf(stderr, "Can't open log file %s\n", logpath);
exit(1);
}
if((Log = fopen(logpath, "a")) == NULL)
errx(1, "can't open log file '%s'", logpath);
longjmp(mainloop, 1);
/* No return */
}