summaryrefslogtreecommitdiffstats
path: root/libexec/xtend/xtend.c
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2003-04-27 05:43:42 +0000
committerimp <imp@FreeBSD.org>2003-04-27 05:43:42 +0000
commit733bde7ebea48a6da8197aaf7eaa6ff3cda2f015 (patch)
treee3f1a8110e7fa984a4a04256ae7db4662e1540f0 /libexec/xtend/xtend.c
parenta22a4734016282417f667c893bf9c56404c54708 (diff)
downloadFreeBSD-src-733bde7ebea48a6da8197aaf7eaa6ff3cda2f015.zip
FreeBSD-src-733bde7ebea48a6da8197aaf7eaa6ff3cda2f015.tar.gz
This is no longer needed after tw is gone.
Approved by: re@ (scottl)
Diffstat (limited to 'libexec/xtend/xtend.c')
-rw-r--r--libexec/xtend/xtend.c403
1 files changed, 0 insertions, 403 deletions
diff --git a/libexec/xtend/xtend.c b/libexec/xtend/xtend.c
deleted file mode 100644
index 62f76d1..0000000
--- a/libexec/xtend/xtend.c
+++ /dev/null
@@ -1,403 +0,0 @@
-/*-
- * Copyright (c) 1992, 1993, 1995 Eugene W. Stark
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Eugene W. Stark.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY EUGENE W. STARK (THE AUTHOR) ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * 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.
- */
-
-#ifndef lint
-static const char rcsid[] =
- "$FreeBSD$";
-#endif /* not lint */
-
-/*
- * xtend - X-10 daemon
- * Eugene W. Stark (stark@cs.sunysb.edu)
- * January 14, 1993
- */
-
-#include <err.h>
-#include <pwd.h>
-#include <setjmp.h>
-#include <signal.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>
-#include <sys/time.h>
-#include <sys/stat.h>
-#include <sys/errno.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <grp.h>
-
-#include "xtend.h"
-#include "xten.h"
-#include "paths.h"
-
-FILE *Log; /* Log file */
-FILE *User; /* User connection */
-STATUS Status[16][16]; /* Device status table */
-int status; /* Status file descriptor */
-int tw523; /* tw523 controller */
-int sock; /* socket for user */
-jmp_buf mainloop; /* longjmp point after SIGHUP */
-volatile sig_atomic_t hup_flag; /* received SIGHUP flag */
-volatile sig_atomic_t term_flag; /* received SIGTERM flag */
-volatile sig_atomic_t pipe_flag; /* received SIGPIPE flag */
-
-void checkpoint_status(void);
-void dohup(void);
-void dopipe(void);
-void doterm(void);
-void initstatus(void);
-void logpacket(unsigned char *);
-void onhup(int);
-void onpipe(int);
-void onterm(int);
-void processpacket(unsigned char *);
-int user_command(void);
-
-int
-main(int argc, char *argv[])
-{
- char *twpath = TWPATH;
- char *sockpath = SOCKPATH;
- char logpath[MAXPATHLEN];
- char statpath[MAXPATHLEN];
- struct sockaddr_un sa;
- struct timeval tv;
- struct passwd *pw;
- struct group *gr;
- struct stat sb;
- int user;
- FILE *pidf;
-
- /*
- * Make sure we start out running as root
- */
- if(geteuid() != 0)
- errx(1, "you must be root");
-
- /*
- * Find out what UID/GID we are to run as
- */
- 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
- */
- if(stat(X10DIR, &sb) == -1 && errno == ENOENT) {
- if(mkdir(X10DIR, 0755) != -1) {
- chown(X10DIR, pw->pw_uid, gr->gr_gid);
- } else {
- errx(1, "can't create directory '%s'", X10DIR);
- }
- }
- snprintf(logpath, sizeof(logpath), "%s/%s", X10DIR, X10LOGNAME);
- if((Log = fopen(logpath, "a")) == NULL)
- errx(1, "can't open log file '%s'", logpath);
- chown(logpath, pw->pw_uid, gr->gr_gid);
-
- /*
- * Become a daemon
- */
- if(daemon(0, 0) == -1) {
- fprintf(Log, "%s: Unable to become a daemon\n", thedate());
- fclose(Log);
- exit(1);
- }
- fprintf(Log, "%s: %s [%d] started\n", thedate(), argv[0], getpid());
-
- /*
- * Get ahold of the TW523 device
- */
- if((tw523 = open(twpath, O_RDWR)) < 0) {
- fprintf(Log, "%s: Can't open %s\n", thedate(), twpath);
- fclose(Log);
- exit(1);
- }
- fprintf(Log, "%s: %s successfully opened\n", thedate(), twpath);
-
- /*
- * Put our pid in a file so we can be signalled by shell scripts
- */
- if((pidf = fopen(PIDPATH, "w")) == NULL) {
- fprintf(Log, "%s: Error writing pid file: %s\n", thedate(), PIDPATH);
- fclose(Log);
- exit(1);
- }
- fprintf(pidf, "%d\n", getpid());
- fclose(pidf);
-
- /*
- * Set up socket to accept user commands
- */
- if((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
- fprintf(Log, "%s: Can't create socket\n", thedate());
- fclose(Log);
- exit(1);
- }
- strcpy(sa.sun_path, sockpath);
- sa.sun_family = AF_UNIX;
- unlink(sockpath);
- if(bind(sock, (struct sockaddr *)(&sa), strlen(sa.sun_path) + 2) < 0) {
- fprintf(Log, "%s: Can't bind socket to %s\n", thedate(), sockpath);
- fclose(Log);
- exit(1);
- }
- if(listen(sock, 5) < 0) {
- fprintf(Log, "%s: Can't listen on socket\n", thedate());
- fclose(Log);
- exit(1);
- }
-
- /*
- * Set proper ownership and permissions on the socket
- */
- if(chown(sockpath, pw->pw_uid, gr->gr_gid) == -1 ||
- chmod(sockpath, 0660) == -1) {
- fprintf(Log, "%s: Can't set owner/permissions on socket\n", thedate());
- fclose(Log);
- exit(1);
- }
-
- /*
- * Give up root privileges
- */
- setgid(pw->pw_gid);
- setuid(pw->pw_uid);
-
- /*
- * Initialize the status table
- */
- strcpy(statpath, X10DIR);
- strcat(statpath, "/");
- strcat(statpath, X10STATNAME);
- if((status = open(statpath, O_RDWR)) < 0) {
- if((status = open(statpath, O_RDWR | O_CREAT, 0666)) < 0) {
- fprintf(Log, "%s: Can't open %s\n", thedate(), statpath);
- fclose(Log);
- exit(1);
- }
- if(write(status, Status, 16 * 16 * sizeof(STATUS))
- != 16 * 16 * sizeof(STATUS)) {
- fprintf(Log, "%s: Error initializing status file\n", thedate());
- fclose(Log);
- exit(1);
- }
- }
- initstatus();
-
- /*
- * Return here on SIGHUP after closing and reopening log file.
- * Also on SIGPIPE after closing user connection.
- */
- signal(SIGHUP, onhup);
- signal(SIGPIPE, onpipe);
- signal(SIGTERM, onterm);
- setjmp(mainloop);
-
- /*
- * Now start the main processing loop.
- */
- tv.tv_sec = 0;
- tv.tv_usec = 250000;
- while(1) {
- fd_set fs;
- unsigned char rpkt[3];
- int sel, h, k;
- STATUS *s;
-
- if (hup_flag)
- dohup();
- if (term_flag)
- doterm();
- if (pipe_flag)
- dopipe();
-
- FD_ZERO(&fs);
- FD_SET(tw523, &fs);
- if(User != NULL) FD_SET(user, &fs);
- else FD_SET(sock, &fs);
- sel = select(FD_SETSIZE, &fs, 0, 0, &tv);
- if(sel == 0) {
- /*
- * Cancel brightening and dimming on ALL units on ALL house codes,
- * because the fact that we haven't gotten a packet for awhile means
- * that there was a gap in transmission.
- */
- for(h = 0; h < 16; h++) {
- for(k = 0; k < 16; k++) {
- s = &Status[h][k];
- if(s->selected == BRIGHTENING || s->selected == DIMMING) {
- s->selected = IDLE;
- s->lastchange = time(NULL);
- s->changed = 1;
- }
- }
- }
- fflush(Log);
- checkpoint_status();
- /*
- * Now that we've done this stuff, we'll set the timeout a little
- * longer, so we don't keep looping too frequently.
- */
- tv.tv_sec = 60;
- tv.tv_usec = 0;
- continue;
- }
- /*
- * While there is stuff happening, we keep a short timeout, so we
- * don't get stuck for some unknown reason, and so we can keep the
- * brightening and dimming data up-to-date.
- */
- tv.tv_sec = 0;
- tv.tv_usec = 250000;
- if(FD_ISSET(tw523, &fs)) { /* X10 data arriving from TW523 */
- if(read(tw523, rpkt, 3) < 3) {
- fprintf(Log, "%s: Error reading from TW523\n", thedate());
- } else {
- logpacket(rpkt);
- processpacket(rpkt);
- }
- } else if(FD_ISSET(user, &fs) && User != NULL) {
- if(user_command()) {
- fprintf(Log, "%s: Closing user connection\n", thedate());
- fclose(User);
- User = NULL;
- }
- } else if(FD_ISSET(sock, &fs)) { /* Accept a connection */
- if (User == NULL) {
- int len = sizeof(struct sockaddr_un);
- if((user = accept(sock, (struct sockaddr *)(&sa), &len)) >= 0) {
- fprintf(Log, "%s: Accepting user connection\n", thedate());
- if((User = fdopen(user, "w+")) == NULL) {
- fprintf(Log, "%s: Can't attach socket to stream\n", thedate());
- }
- } else {
- fprintf(Log, "%s: Failure in attempt to accept connection\n", thedate());
- }
- } else {
- /* "Can't happen */
- }
- }
- }
- /* Not reached */
-}
-
-char *
-thedate(void)
-{
- char *cp, *cp1;
- time_t tod;
-
- tod = time(NULL);
- cp = cp1 = ctime(&tod);
- while(*cp1 != '\n') cp1++;
- *cp1 = '\0';
- return(cp);
-}
-
-void
-onhup(int signo)
-{
-
- hup_flag = 1;
-}
-
-void
-onterm(int signo)
-{
-
- term_flag = 1;
-}
-
-void
-onpipe(int signo)
-{
-
- pipe_flag = 1;
-}
-
-/*
- * When SIGHUP received, close and reopen the Log file
- */
-
-void
-dohup(void)
-{
- char logpath[MAXPATHLEN];
-
- fprintf(Log, "%s: SIGHUP received, reopening Log\n", thedate());
- fclose(Log);
- snprintf(logpath, sizeof(logpath), "%s/%s", X10DIR, X10LOGNAME);
- if((Log = fopen(logpath, "a")) == NULL)
- errx(1, "can't open log file '%s'", logpath);
- hup_flag = 0;
- longjmp(mainloop, 1);
- /* No return */
-}
-
-/*
- * When SIGTERM received, just exit normally
- */
-
-void
-doterm(void)
-{
- fprintf(Log, "%s: SIGTERM received, shutting down\n", thedate());
- fclose(Log);
- term_flag = 0;
- exit(0);
-}
-
-/*
- * When SIGPIPE received, reset user connection
- */
-
-void
-dopipe(void)
-{
- fprintf(Log, "%s: SIGPIPE received, resetting user connection\n",
- thedate());
- if(User != NULL) {
- fclose(User);
- User = NULL;
- }
- pipe_flag = 0;
- longjmp(mainloop, 1);
- /* No return */
-}
OpenPOWER on IntegriCloud