2014-01-14 12:07:01 +01:00
|
|
|
--- COPYING
|
|
|
|
+++ COPYING 2014-01-14 10:28:52.282236069 +0000
|
|
|
|
@@ -2,7 +2,7 @@
|
|
|
|
Version 2, June 1991
|
|
|
|
|
|
|
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
|
|
|
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
Everyone is permitted to copy and distribute verbatim copies
|
|
|
|
of this license document, but changing it is not allowed.
|
|
|
|
|
|
|
|
@@ -305,7 +305,7 @@ the "copyright" line and a pointer to wh
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
|
|
|
|
|
|
|
|
Also add information on how to contact you by electronic and paper mail.
|
2006-12-14 18:06:00 +01:00
|
|
|
--- Makefile.in
|
|
|
|
+++ Makefile.in 2006-02-07 16:29:20.000000000 +0100
|
2008-01-10 15:29:00 +01:00
|
|
|
@@ -28,7 +28,7 @@ distclean: clean
|
2006-12-14 18:06:00 +01:00
|
|
|
|
|
|
|
|
|
|
|
detectups: detectups.c
|
|
|
|
- $(CC) $(LFLAGS) $(LIBS) detectups.c -o detectups
|
|
|
|
+ $(CC) $(LFLAGS) $(CFLAGS) $(LIBS) detectups.c -o detectups
|
|
|
|
|
|
|
|
powerd: powerd.h config.h $(OBJS)
|
|
|
|
$(CC) $(LFLAGS) $(LIBS) $(OBJS) -o $@
|
|
|
|
--- config.h
|
|
|
|
+++ config.h 2006-02-07 16:31:03.000000000 +0100
|
|
|
|
@@ -8,7 +8,12 @@
|
|
|
|
/* You shouldnt (and it wont work unless you have modified init) change
|
|
|
|
* this file - this is what init uses to know the power status.
|
|
|
|
*/
|
|
|
|
-#define PWRSTAT "/etc/powerstatus"
|
|
|
|
+#define PWRSTAT "/var/run/powerstatus"
|
2014-01-14 12:07:01 +01:00
|
|
|
+#if WITH_SYSVINIT
|
2006-12-14 18:06:00 +01:00
|
|
|
+# include <initreq.h>
|
|
|
|
+# define NEWINIT
|
|
|
|
+# define INIT_REQ_SLEEP 5
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
|
|
|
|
/* Define this if you want to develop on powerd. This will cause powerd to
|
2014-01-14 12:07:01 +01:00
|
|
|
--- powerd.8
|
|
|
|
+++ powerd.8 2014-01-14 10:59:42.198735732 +0000
|
|
|
|
@@ -104,13 +104,10 @@ for more information
|
|
|
|
.br
|
|
|
|
/etc/powerd.conf powerd configuration file
|
|
|
|
.br
|
|
|
|
-/etc/powerstatus indicates line power status
|
|
|
|
-.br
|
|
|
|
-/etc/inittab init is what actually issues the
|
|
|
|
- shutdown
|
|
|
|
+/var/run/powerstatus indicates line power status
|
|
|
|
.br
|
|
|
|
.SH SEE ALSO
|
|
|
|
-powerd(8), shutdown(8), wall(1), init(8), inittab(5).
|
|
|
|
+powerd(8), shutdown(8), wall(1), init(8).
|
|
|
|
.SH AUTHOR
|
|
|
|
James Brents <James@nistix.com>
|
|
|
|
(with parts of this man page borrowed from all over the Linux community)
|
2006-12-14 18:06:00 +01:00
|
|
|
--- powerd.c
|
2008-01-10 15:29:00 +01:00
|
|
|
+++ powerd.c 2008-01-10 10:48:25.967567115 +0100
|
2006-12-14 18:06:00 +01:00
|
|
|
@@ -27,7 +27,6 @@
|
|
|
|
|
|
|
|
#include "powerd.h"
|
|
|
|
|
|
|
|
-
|
|
|
|
static Client *clients;
|
|
|
|
static Listen *listens;
|
|
|
|
|
2008-01-10 15:29:00 +01:00
|
|
|
@@ -73,7 +72,10 @@ int main(int argc, char **argv)
|
2006-12-14 18:06:00 +01:00
|
|
|
int i;
|
|
|
|
#endif
|
|
|
|
char *me=argv[0];
|
|
|
|
+ char *base = basename(me);
|
|
|
|
+ char *pidf = NULL;
|
|
|
|
int delay = 16;
|
|
|
|
+ int n;
|
|
|
|
|
|
|
|
if (argc<1 || (argc >1 && (!strcmp(argv[1], "--help") || !strcmp(argv[1], "-h")))) {
|
|
|
|
printf("powerd %s by: James Brents <james@nistix.com> (DaSyonic)\n\n", ver);
|
2008-01-10 15:29:00 +01:00
|
|
|
@@ -88,14 +90,42 @@ int main(int argc, char **argv)
|
|
|
|
#ifndef DEBUG
|
|
|
|
switch(i=fork()) {
|
|
|
|
case 0: /* Child */
|
|
|
|
- chdir("/");
|
|
|
|
+ if (chdir("/") < 0)
|
|
|
|
+ fprintf(stderr, "%s: %s\n", me, strerror(errno));
|
2006-12-14 18:06:00 +01:00
|
|
|
setsid();
|
|
|
|
|
|
|
|
if ((root = getuid())) {
|
|
|
|
- fprintf(stderr, "%s: need to have root privlidges.", me);
|
2008-01-10 15:29:00 +01:00
|
|
|
+ fprintf(stderr, "%s: need to have root privileges\n", me);
|
2006-12-14 18:06:00 +01:00
|
|
|
} else if (touser != NULL) {
|
|
|
|
if (seteuid(user = uname2id(touser)) == -1)
|
|
|
|
- fprintf(stderr, "%s is not a valid username.", touser);
|
|
|
|
+ fprintf(stderr, "%s is not a valid username: %s\n", touser, strerror(errno));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ((pidf = (char*)malloc(strlen(_PATH_VARRUN)+strlen(base)+1+3+1)) == NULL) {
|
|
|
|
+ fprintf(stderr, "%s: can create pid file: %s\n", me, strerror(errno));
|
|
|
|
+ } else {
|
|
|
|
+ pidf = strcpy(pidf, _PATH_VARRUN);
|
|
|
|
+ pidf = strcat(pidf, base);
|
|
|
|
+ pidf = strcat(pidf, ".pid");
|
|
|
|
+
|
2008-01-10 15:29:00 +01:00
|
|
|
+ if ((n = open(pidf, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) == -1) {
|
2006-12-14 18:06:00 +01:00
|
|
|
+ fprintf(stderr, "%s: can create pid file: %s\n", me, strerror(errno));
|
|
|
|
+ } else {
|
|
|
|
+ snprintf(logbuffer, sizeof(logbuffer)-1, "%d", (int)getpid());
|
2008-01-10 15:29:00 +01:00
|
|
|
+ if (write(n, logbuffer, strlen(logbuffer)) < 0)
|
|
|
|
+ fprintf(stderr, "%s: %s\n", me, strerror(errno));
|
2006-12-14 18:06:00 +01:00
|
|
|
+ close(n);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ((n = open("/dev/null", O_RDWR)) == -1) {
|
|
|
|
+ fprintf(stderr, "%s: can not open /dev/null.", me);
|
|
|
|
+ } else {
|
|
|
|
+ (void)dup2(n, 0);
|
|
|
|
+ (void)dup2(n, 1);
|
|
|
|
+ (void)dup2(n, 2);
|
|
|
|
+ (void)close(n);
|
|
|
|
+ errno=0;
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
2008-01-10 15:29:00 +01:00
|
|
|
@@ -116,6 +146,8 @@ int main(int argc, char **argv)
|
2006-12-14 18:06:00 +01:00
|
|
|
monitorups(delay);
|
|
|
|
else if (mode == 1)
|
|
|
|
bindport();
|
|
|
|
+ if (pidf)
|
|
|
|
+ (void)unlink(pidf);
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
|
2008-01-10 15:29:00 +01:00
|
|
|
@@ -194,9 +226,12 @@ void monitorups(int delay) {
|
2006-12-14 18:06:00 +01:00
|
|
|
/* log to the syslog */
|
|
|
|
void log(int type, int facility, const char *entry, ...)
|
|
|
|
{
|
|
|
|
+ va_list ap;
|
|
|
|
+ va_start(ap, entry);
|
|
|
|
openlog("powerd", LOG_CONS | LOG_PID, facility);
|
|
|
|
- syslog(type, entry);
|
|
|
|
+ vsyslog(type, entry, ap);
|
|
|
|
closelog();
|
|
|
|
+ va_end(ap);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Borrowed from Apache
|
2008-01-10 15:29:00 +01:00
|
|
|
@@ -220,12 +255,39 @@ uid_t uname2id(char *name) {
|
2006-12-14 18:06:00 +01:00
|
|
|
*/
|
|
|
|
void notifyinit(int status) {
|
|
|
|
unsigned int file;
|
|
|
|
+#ifdef NEWINIT
|
|
|
|
+ struct init_request req;
|
|
|
|
+ int success = 0;
|
|
|
|
+ void (*save_sigalrm)();
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
errno = 0;
|
|
|
|
|
|
|
|
if (touser != NULL)
|
|
|
|
seteuid(root);
|
|
|
|
|
|
|
|
+#ifdef NEWINIT
|
|
|
|
+ /* Fill out the request struct. */
|
|
|
|
+ memset(&req, 0, sizeof(req));
|
|
|
|
+ req.magic = INIT_MAGIC;
|
|
|
|
+ req.sleeptime = INIT_REQ_SLEEP;
|
|
|
|
+ req.cmd = (status == FAIL) ? INIT_CMD_POWERFAIL : INIT_CMD_POWEROK;
|
|
|
|
+
|
|
|
|
+ /* Open the fifo (with timeout) */
|
|
|
|
+ save_sigalrm = signal(SIGALRM, alarm_handler);
|
|
|
|
+ alarm(3);
|
|
|
|
+ if ((file = open(INIT_FIFO, O_WRONLY, 0644)) >= 0) {
|
|
|
|
+ if (write(file, &req, sizeof(req)) == sizeof(req))
|
|
|
|
+ success = 1;
|
|
|
|
+ close(file);
|
|
|
|
+ }
|
|
|
|
+ alarm(0);
|
|
|
|
+ (void)signal(SIGALRM, save_sigalrm);
|
|
|
|
+
|
|
|
|
+ if (!success) {
|
|
|
|
+ /* The old method ... */
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
if ((file = open(PWRSTAT, O_CREAT | O_WRONLY, 0644)) == -1) {
|
|
|
|
fprintf(stderr, "Cant open %s: %s\n", PWRSTAT, strerror(errno));
|
|
|
|
exit(-1);
|
2008-01-10 15:29:00 +01:00
|
|
|
@@ -237,6 +299,10 @@ void notifyinit(int status) {
|
2006-12-14 18:06:00 +01:00
|
|
|
#else
|
|
|
|
bsdshutdown(status);
|
|
|
|
#endif
|
|
|
|
+
|
|
|
|
+#ifdef NEWINIT
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
if (touser != NULL)
|
|
|
|
seteuid(user);
|
|
|
|
|
2008-01-10 15:29:00 +01:00
|
|
|
@@ -259,7 +325,8 @@ void notifyinit(int status) {
|
2006-12-14 18:06:00 +01:00
|
|
|
* connections
|
|
|
|
*/
|
|
|
|
int bindport() {
|
|
|
|
- int len, addr_len, newfd, sin_size, numbytes;
|
|
|
|
+ socklen_t len, sin_size;
|
|
|
|
+ int newfd, numbytes;
|
|
|
|
struct sockaddr_in serveraddr, remoteaddr;
|
|
|
|
struct timeval mytv;
|
|
|
|
FileDescriptor *list;
|
2008-01-10 15:29:00 +01:00
|
|
|
@@ -289,7 +356,7 @@ int bindport() {
|
2006-12-14 18:06:00 +01:00
|
|
|
exit(-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
- len = sizeof(serveraddr);
|
|
|
|
+ len = (socklen_t)sizeof(serveraddr);
|
|
|
|
|
|
|
|
if (getsockname(serverfd, (struct sockaddr *)&serveraddr, &len)) {
|
|
|
|
fprintf(stderr, "getsockname()\n");
|
2008-01-10 15:29:00 +01:00
|
|
|
@@ -301,8 +368,6 @@ int bindport() {
|
2006-12-14 18:06:00 +01:00
|
|
|
if ((touser != NULL) && (listenport < 1024))
|
|
|
|
seteuid(user);
|
|
|
|
|
|
|
|
- addr_len = sizeof(struct sockaddr);
|
|
|
|
-
|
|
|
|
// printf("Im here\n");
|
|
|
|
while (1) {
|
|
|
|
errno = 0;
|
2008-01-10 15:29:00 +01:00
|
|
|
@@ -321,7 +386,7 @@ int bindport() {
|
2006-12-14 18:06:00 +01:00
|
|
|
|
|
|
|
if (FD_ISSET(serverfd, &readfds)) {
|
|
|
|
FileDescriptor *tmp;
|
|
|
|
- sin_size = sizeof(struct sockaddr_in);
|
|
|
|
+ sin_size = (socklen_t)sizeof(struct sockaddr_in);
|
|
|
|
if ((newfd=accept(serverfd, (struct sockaddr *)&remoteaddr,
|
|
|
|
&sin_size)) == -1) {
|
|
|
|
perror("accept");
|
2008-01-10 15:29:00 +01:00
|
|
|
@@ -540,6 +605,15 @@ void debughelp(int sig)
|
2006-12-14 18:06:00 +01:00
|
|
|
mypower = (mypower == 1) ? 0 : 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
+#ifdef NEWINIT
|
|
|
|
+/* alarm handler for communication with init */
|
|
|
|
+/* static */ void alarm_handler (int sig)
|
|
|
|
+{
|
|
|
|
+ printf("Writing to init FIFO %s timed out\n", INIT_FIFO);
|
|
|
|
+ sleep(1);
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
/* Open and parse the configuration file
|
|
|
|
*/
|
|
|
|
void openconfig(int *delay) {
|
|
|
|
--- powerd.h.in
|
2008-01-10 15:29:00 +01:00
|
|
|
+++ powerd.h.in 2008-01-10 10:46:28.348626572 +0100
|
2006-12-14 18:06:00 +01:00
|
|
|
@@ -60,6 +60,7 @@
|
|
|
|
/*********** If you do, Please send patches. **********/
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
+#include <stdarg.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <signal.h>
|
|
|
|
#include <unistd.h>
|
2008-01-10 15:29:00 +01:00
|
|
|
@@ -67,6 +68,7 @@
|
|
|
|
#include <ctype.h>
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/ioctl.h>
|
|
|
|
+#include <sys/stat.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <syslog.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
@@ -77,6 +79,11 @@
|
2006-12-14 18:06:00 +01:00
|
|
|
#include <arpa/inet.h>
|
|
|
|
#include <sys/time.h>
|
|
|
|
#include <netdb.h>
|
|
|
|
+#include <libgen.h>
|
|
|
|
+#include <paths.h>
|
|
|
|
+#ifndef _PATH_VARRUN
|
|
|
|
+# define _PATH_VARRUN "/var/run/"
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
#define CONNECTED 0x01
|
|
|
|
#define SENTNOTICE 0x02
|
2008-01-10 15:29:00 +01:00
|
|
|
@@ -122,7 +129,8 @@ struct filedescriptor_ {
|
2006-12-14 18:06:00 +01:00
|
|
|
Listen *listen;
|
|
|
|
};
|
|
|
|
|
|
|
|
-void log(int type, int facility, const char *entry, ...);
|
|
|
|
+void mylog(int type, int facility, const char *entry, ...);
|
|
|
|
+#define log(args...) mylog(args)
|
|
|
|
uid_t uname2id(char *name);
|
|
|
|
void notifyinit(int status);
|
|
|
|
void monitorups(int delay);
|
2008-01-10 15:29:00 +01:00
|
|
|
@@ -139,6 +147,7 @@ int vhost(FileDescriptor *fd, char *para
|
2006-12-14 18:06:00 +01:00
|
|
|
void auth(FileDescriptor *fd, char *password);
|
|
|
|
void quit_sig(int sig);
|
|
|
|
void debughelp(int sig);
|
|
|
|
+/* static */ void alarm_handler(int sig);
|
|
|
|
int notifyclients(int status);
|
|
|
|
void getrid(FileDescriptor *fd, int i);
|
|
|
|
void bsdshutdown(int status);
|
2014-01-14 12:07:01 +01:00
|
|
|
--- initreq.h
|
|
|
|
+++ initreq.h 2013-08-13 20:02:46.132705014 +0000
|
|
|
|
@@ -0,0 +1,77 @@
|
|
|
|
+/*
|
|
|
|
+ * initreq.h Interface to talk to init through /dev/initctl.
|
|
|
|
+ *
|
|
|
|
+ * Copyright (C) 1995-2004 Miquel van Smoorenburg
|
|
|
|
+ *
|
|
|
|
+ * This library is free software; you can redistribute it and/or
|
|
|
|
+ * modify it under the terms of the GNU Lesser General Public
|
|
|
|
+ * License as published by the Free Software Foundation; either
|
|
|
|
+ * version 2 of the License, or (at your option) any later version.
|
|
|
|
+ *
|
|
|
|
+ * Version: @(#)initreq.h 1.28 31-Mar-2004 MvS
|
|
|
|
+ *
|
|
|
|
+ */
|
|
|
|
+#ifndef _INITREQ_H
|
|
|
|
+#define _INITREQ_H
|
|
|
|
+
|
|
|
|
+#include <sys/param.h>
|
|
|
|
+
|
|
|
|
+#if defined(__FreeBSD_kernel__)
|
|
|
|
+# define INIT_FIFO "/etc/.initctl"
|
|
|
|
+#else
|
|
|
|
+# define INIT_FIFO "/dev/initctl"
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#define INIT_MAGIC 0x03091969
|
|
|
|
+#define INIT_CMD_START 0
|
|
|
|
+#define INIT_CMD_RUNLVL 1
|
|
|
|
+#define INIT_CMD_POWERFAIL 2
|
|
|
|
+#define INIT_CMD_POWERFAILNOW 3
|
|
|
|
+#define INIT_CMD_POWEROK 4
|
|
|
|
+#define INIT_CMD_BSD 5
|
|
|
|
+#define INIT_CMD_SETENV 6
|
|
|
|
+#define INIT_CMD_UNSETENV 7
|
|
|
|
+
|
|
|
|
+#define INIT_CMD_CHANGECONS 12345
|
|
|
|
+
|
|
|
|
+#ifdef MAXHOSTNAMELEN
|
|
|
|
+# define INITRQ_HLEN MAXHOSTNAMELEN
|
|
|
|
+#else
|
|
|
|
+# define INITRQ_HLEN 64
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * This is what BSD 4.4 uses when talking to init.
|
|
|
|
+ * Linux doesn't use this right now.
|
|
|
|
+ */
|
|
|
|
+struct init_request_bsd {
|
|
|
|
+ char gen_id[8]; /* Beats me.. telnetd uses "fe" */
|
|
|
|
+ char tty_id[16]; /* Tty name minus /dev/tty */
|
|
|
|
+ char host[INITRQ_HLEN]; /* Hostname */
|
|
|
|
+ char term_type[16]; /* Terminal type */
|
|
|
|
+ int signal; /* Signal to send */
|
|
|
|
+ int pid; /* Process to send to */
|
|
|
|
+ char exec_name[128]; /* Program to execute */
|
|
|
|
+ char reserved[128]; /* For future expansion. */
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Because of legacy interfaces, "runlevel" and "sleeptime"
|
|
|
|
+ * aren't in a separate struct in the union.
|
|
|
|
+ *
|
|
|
|
+ * The weird sizes are because init expects the whole
|
|
|
|
+ * struct to be 384 bytes.
|
|
|
|
+ */
|
|
|
|
+struct init_request {
|
|
|
|
+ int magic; /* Magic number */
|
|
|
|
+ int cmd; /* What kind of request */
|
|
|
|
+ int runlevel; /* Runlevel to change to */
|
|
|
|
+ int sleeptime; /* Time between TERM and KILL */
|
|
|
|
+ union {
|
|
|
|
+ struct init_request_bsd bsd;
|
|
|
|
+ char data[368];
|
|
|
|
+ } i;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+#endif
|
2019-01-14 14:38:06 +01:00
|
|
|
--- config.guess
|
|
|
|
+++ config.guess 2019-01-09 15:01:32.155857875 +0000
|
|
|
|
@@ -818,10 +818,10 @@ EOF
|
|
|
|
|
|
|
|
case "${UNAME_MACHINE}" in
|
|
|
|
i?86)
|
|
|
|
- VENDOR=pc;
|
|
|
|
+ VENDOR=suse;
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
- VENDOR=unknown;
|
|
|
|
+ VENDOR=suse;
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
# Determine whether the default compiler is a.out or elf
|
|
|
|
--- config.sub
|
|
|
|
+++ config.sub 2019-01-09 15:01:32.155857875 +0000
|
|
|
|
@@ -204,7 +204,7 @@ case $basic_machine in
|
|
|
|
;;
|
|
|
|
# Recognize the basic CPU types with company name.
|
|
|
|
# FIXME: clean up the formatting here.
|
|
|
|
- vax-* | tahoe-* | i[34567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \
|
|
|
|
+ vax-* | tahoe-* | i[34567]86-* | i860-* | x86_64-* | ia64-* | m32r-* | m68k-* | m68000-* \
|
|
|
|
| m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
|
|
|
|
| mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
|
|
|
|
| power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \
|