• R/O
  • SSH
  • HTTPS

akari: Commit


Commit MetaInfo

Revision596 (tree)
Time2018-09-13 15:03:40
Authorkumaneko

Log Message

Add udpsysrqd program

Change Summary

Incremental Difference

--- branches/udpsysrqd/COPYING (nonexistent)
+++ branches/udpsysrqd/COPYING (revision 596)
@@ -0,0 +1,339 @@
1+ GNU GENERAL PUBLIC LICENSE
2+ Version 2, June 1991
3+
4+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6+ Everyone is permitted to copy and distribute verbatim copies
7+ of this license document, but changing it is not allowed.
8+
9+ Preamble
10+
11+ The licenses for most software are designed to take away your
12+freedom to share and change it. By contrast, the GNU General Public
13+License is intended to guarantee your freedom to share and change free
14+software--to make sure the software is free for all its users. This
15+General Public License applies to most of the Free Software
16+Foundation's software and to any other program whose authors commit to
17+using it. (Some other Free Software Foundation software is covered by
18+the GNU Lesser General Public License instead.) You can apply it to
19+your programs, too.
20+
21+ When we speak of free software, we are referring to freedom, not
22+price. Our General Public Licenses are designed to make sure that you
23+have the freedom to distribute copies of free software (and charge for
24+this service if you wish), that you receive source code or can get it
25+if you want it, that you can change the software or use pieces of it
26+in new free programs; and that you know you can do these things.
27+
28+ To protect your rights, we need to make restrictions that forbid
29+anyone to deny you these rights or to ask you to surrender the rights.
30+These restrictions translate to certain responsibilities for you if you
31+distribute copies of the software, or if you modify it.
32+
33+ For example, if you distribute copies of such a program, whether
34+gratis or for a fee, you must give the recipients all the rights that
35+you have. You must make sure that they, too, receive or can get the
36+source code. And you must show them these terms so they know their
37+rights.
38+
39+ We protect your rights with two steps: (1) copyright the software, and
40+(2) offer you this license which gives you legal permission to copy,
41+distribute and/or modify the software.
42+
43+ Also, for each author's protection and ours, we want to make certain
44+that everyone understands that there is no warranty for this free
45+software. If the software is modified by someone else and passed on, we
46+want its recipients to know that what they have is not the original, so
47+that any problems introduced by others will not reflect on the original
48+authors' reputations.
49+
50+ Finally, any free program is threatened constantly by software
51+patents. We wish to avoid the danger that redistributors of a free
52+program will individually obtain patent licenses, in effect making the
53+program proprietary. To prevent this, we have made it clear that any
54+patent must be licensed for everyone's free use or not licensed at all.
55+
56+ The precise terms and conditions for copying, distribution and
57+modification follow.
58+
59+ GNU GENERAL PUBLIC LICENSE
60+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61+
62+ 0. This License applies to any program or other work which contains
63+a notice placed by the copyright holder saying it may be distributed
64+under the terms of this General Public License. The "Program", below,
65+refers to any such program or work, and a "work based on the Program"
66+means either the Program or any derivative work under copyright law:
67+that is to say, a work containing the Program or a portion of it,
68+either verbatim or with modifications and/or translated into another
69+language. (Hereinafter, translation is included without limitation in
70+the term "modification".) Each licensee is addressed as "you".
71+
72+Activities other than copying, distribution and modification are not
73+covered by this License; they are outside its scope. The act of
74+running the Program is not restricted, and the output from the Program
75+is covered only if its contents constitute a work based on the
76+Program (independent of having been made by running the Program).
77+Whether that is true depends on what the Program does.
78+
79+ 1. You may copy and distribute verbatim copies of the Program's
80+source code as you receive it, in any medium, provided that you
81+conspicuously and appropriately publish on each copy an appropriate
82+copyright notice and disclaimer of warranty; keep intact all the
83+notices that refer to this License and to the absence of any warranty;
84+and give any other recipients of the Program a copy of this License
85+along with the Program.
86+
87+You may charge a fee for the physical act of transferring a copy, and
88+you may at your option offer warranty protection in exchange for a fee.
89+
90+ 2. You may modify your copy or copies of the Program or any portion
91+of it, thus forming a work based on the Program, and copy and
92+distribute such modifications or work under the terms of Section 1
93+above, provided that you also meet all of these conditions:
94+
95+ a) You must cause the modified files to carry prominent notices
96+ stating that you changed the files and the date of any change.
97+
98+ b) You must cause any work that you distribute or publish, that in
99+ whole or in part contains or is derived from the Program or any
100+ part thereof, to be licensed as a whole at no charge to all third
101+ parties under the terms of this License.
102+
103+ c) If the modified program normally reads commands interactively
104+ when run, you must cause it, when started running for such
105+ interactive use in the most ordinary way, to print or display an
106+ announcement including an appropriate copyright notice and a
107+ notice that there is no warranty (or else, saying that you provide
108+ a warranty) and that users may redistribute the program under
109+ these conditions, and telling the user how to view a copy of this
110+ License. (Exception: if the Program itself is interactive but
111+ does not normally print such an announcement, your work based on
112+ the Program is not required to print an announcement.)
113+
114+These requirements apply to the modified work as a whole. If
115+identifiable sections of that work are not derived from the Program,
116+and can be reasonably considered independent and separate works in
117+themselves, then this License, and its terms, do not apply to those
118+sections when you distribute them as separate works. But when you
119+distribute the same sections as part of a whole which is a work based
120+on the Program, the distribution of the whole must be on the terms of
121+this License, whose permissions for other licensees extend to the
122+entire whole, and thus to each and every part regardless of who wrote it.
123+
124+Thus, it is not the intent of this section to claim rights or contest
125+your rights to work written entirely by you; rather, the intent is to
126+exercise the right to control the distribution of derivative or
127+collective works based on the Program.
128+
129+In addition, mere aggregation of another work not based on the Program
130+with the Program (or with a work based on the Program) on a volume of
131+a storage or distribution medium does not bring the other work under
132+the scope of this License.
133+
134+ 3. You may copy and distribute the Program (or a work based on it,
135+under Section 2) in object code or executable form under the terms of
136+Sections 1 and 2 above provided that you also do one of the following:
137+
138+ a) Accompany it with the complete corresponding machine-readable
139+ source code, which must be distributed under the terms of Sections
140+ 1 and 2 above on a medium customarily used for software interchange; or,
141+
142+ b) Accompany it with a written offer, valid for at least three
143+ years, to give any third party, for a charge no more than your
144+ cost of physically performing source distribution, a complete
145+ machine-readable copy of the corresponding source code, to be
146+ distributed under the terms of Sections 1 and 2 above on a medium
147+ customarily used for software interchange; or,
148+
149+ c) Accompany it with the information you received as to the offer
150+ to distribute corresponding source code. (This alternative is
151+ allowed only for noncommercial distribution and only if you
152+ received the program in object code or executable form with such
153+ an offer, in accord with Subsection b above.)
154+
155+The source code for a work means the preferred form of the work for
156+making modifications to it. For an executable work, complete source
157+code means all the source code for all modules it contains, plus any
158+associated interface definition files, plus the scripts used to
159+control compilation and installation of the executable. However, as a
160+special exception, the source code distributed need not include
161+anything that is normally distributed (in either source or binary
162+form) with the major components (compiler, kernel, and so on) of the
163+operating system on which the executable runs, unless that component
164+itself accompanies the executable.
165+
166+If distribution of executable or object code is made by offering
167+access to copy from a designated place, then offering equivalent
168+access to copy the source code from the same place counts as
169+distribution of the source code, even though third parties are not
170+compelled to copy the source along with the object code.
171+
172+ 4. You may not copy, modify, sublicense, or distribute the Program
173+except as expressly provided under this License. Any attempt
174+otherwise to copy, modify, sublicense or distribute the Program is
175+void, and will automatically terminate your rights under this License.
176+However, parties who have received copies, or rights, from you under
177+this License will not have their licenses terminated so long as such
178+parties remain in full compliance.
179+
180+ 5. You are not required to accept this License, since you have not
181+signed it. However, nothing else grants you permission to modify or
182+distribute the Program or its derivative works. These actions are
183+prohibited by law if you do not accept this License. Therefore, by
184+modifying or distributing the Program (or any work based on the
185+Program), you indicate your acceptance of this License to do so, and
186+all its terms and conditions for copying, distributing or modifying
187+the Program or works based on it.
188+
189+ 6. Each time you redistribute the Program (or any work based on the
190+Program), the recipient automatically receives a license from the
191+original licensor to copy, distribute or modify the Program subject to
192+these terms and conditions. You may not impose any further
193+restrictions on the recipients' exercise of the rights granted herein.
194+You are not responsible for enforcing compliance by third parties to
195+this License.
196+
197+ 7. If, as a consequence of a court judgment or allegation of patent
198+infringement or for any other reason (not limited to patent issues),
199+conditions are imposed on you (whether by court order, agreement or
200+otherwise) that contradict the conditions of this License, they do not
201+excuse you from the conditions of this License. If you cannot
202+distribute so as to satisfy simultaneously your obligations under this
203+License and any other pertinent obligations, then as a consequence you
204+may not distribute the Program at all. For example, if a patent
205+license would not permit royalty-free redistribution of the Program by
206+all those who receive copies directly or indirectly through you, then
207+the only way you could satisfy both it and this License would be to
208+refrain entirely from distribution of the Program.
209+
210+If any portion of this section is held invalid or unenforceable under
211+any particular circumstance, the balance of the section is intended to
212+apply and the section as a whole is intended to apply in other
213+circumstances.
214+
215+It is not the purpose of this section to induce you to infringe any
216+patents or other property right claims or to contest validity of any
217+such claims; this section has the sole purpose of protecting the
218+integrity of the free software distribution system, which is
219+implemented by public license practices. Many people have made
220+generous contributions to the wide range of software distributed
221+through that system in reliance on consistent application of that
222+system; it is up to the author/donor to decide if he or she is willing
223+to distribute software through any other system and a licensee cannot
224+impose that choice.
225+
226+This section is intended to make thoroughly clear what is believed to
227+be a consequence of the rest of this License.
228+
229+ 8. If the distribution and/or use of the Program is restricted in
230+certain countries either by patents or by copyrighted interfaces, the
231+original copyright holder who places the Program under this License
232+may add an explicit geographical distribution limitation excluding
233+those countries, so that distribution is permitted only in or among
234+countries not thus excluded. In such case, this License incorporates
235+the limitation as if written in the body of this License.
236+
237+ 9. The Free Software Foundation may publish revised and/or new versions
238+of the General Public License from time to time. Such new versions will
239+be similar in spirit to the present version, but may differ in detail to
240+address new problems or concerns.
241+
242+Each version is given a distinguishing version number. If the Program
243+specifies a version number of this License which applies to it and "any
244+later version", you have the option of following the terms and conditions
245+either of that version or of any later version published by the Free
246+Software Foundation. If the Program does not specify a version number of
247+this License, you may choose any version ever published by the Free Software
248+Foundation.
249+
250+ 10. If you wish to incorporate parts of the Program into other free
251+programs whose distribution conditions are different, write to the author
252+to ask for permission. For software which is copyrighted by the Free
253+Software Foundation, write to the Free Software Foundation; we sometimes
254+make exceptions for this. Our decision will be guided by the two goals
255+of preserving the free status of all derivatives of our free software and
256+of promoting the sharing and reuse of software generally.
257+
258+ NO WARRANTY
259+
260+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268+REPAIR OR CORRECTION.
269+
270+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278+POSSIBILITY OF SUCH DAMAGES.
279+
280+ END OF TERMS AND CONDITIONS
281+
282+ How to Apply These Terms to Your New Programs
283+
284+ If you develop a new program, and you want it to be of the greatest
285+possible use to the public, the best way to achieve this is to make it
286+free software which everyone can redistribute and change under these terms.
287+
288+ To do so, attach the following notices to the program. It is safest
289+to attach them to the start of each source file to most effectively
290+convey the exclusion of warranty; and each file should have at least
291+the "copyright" line and a pointer to where the full notice is found.
292+
293+ <one line to give the program's name and a brief idea of what it does.>
294+ Copyright (C) <year> <name of author>
295+
296+ This program is free software; you can redistribute it and/or modify
297+ it under the terms of the GNU General Public License as published by
298+ the Free Software Foundation; either version 2 of the License, or
299+ (at your option) any later version.
300+
301+ This program is distributed in the hope that it will be useful,
302+ but WITHOUT ANY WARRANTY; without even the implied warranty of
303+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304+ GNU General Public License for more details.
305+
306+ You should have received a copy of the GNU General Public License along
307+ with this program; if not, write to the Free Software Foundation, Inc.,
308+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309+
310+Also add information on how to contact you by electronic and paper mail.
311+
312+If the program is interactive, make it output a short notice like this
313+when it starts in an interactive mode:
314+
315+ Gnomovision version 69, Copyright (C) year name of author
316+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317+ This is free software, and you are welcome to redistribute it
318+ under certain conditions; type `show c' for details.
319+
320+The hypothetical commands `show w' and `show c' should show the appropriate
321+parts of the General Public License. Of course, the commands you use may
322+be called something other than `show w' and `show c'; they could even be
323+mouse-clicks or menu items--whatever suits your program.
324+
325+You should also get your employer (if you work as a programmer) or your
326+school, if any, to sign a "copyright disclaimer" for the program, if
327+necessary. Here is a sample; alter the names:
328+
329+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
331+
332+ <signature of Ty Coon>, 1 April 1989
333+ Ty Coon, President of Vice
334+
335+This General Public License does not permit incorporating your program into
336+proprietary programs. If your program is a subroutine library, you may
337+consider it more useful to permit linking proprietary applications with the
338+library. If this is what you want to do, use the GNU Lesser General
339+Public License instead of this License.
--- branches/udpsysrqd/Makefile (nonexistent)
+++ branches/udpsysrqd/Makefile (revision 596)
@@ -0,0 +1,22 @@
1+INSTALL := install
2+USRBINDIR := /usr/bin
3+USRDOCDIR := /usr/share/doc
4+ifndef CFLAGS
5+CFLAGS := -Wall -O2 -g -D_FORTIFY_SOURCE=2
6+endif
7+
8+all: udpsysrqd
9+
10+udpsysrqd: udpsysrqd.c
11+ $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o udpsysrqd udpsysrqd.c
12+
13+install: all
14+ mkdir -p -m 0755 $(INSTALLDIR)$(USRBINDIR)
15+ $(INSTALL) -m 0755 udpsysrqd $(INSTALLDIR)$(USRBINDIR)
16+ mkdir -p -m 0755 $(INSTALLDIR)$(USRDOCDIR)/udpsysrqd/
17+ $(INSTALL) -m 0644 README COPYING udpsysrqd.conf $(INSTALLDIR)$(USRDOCDIR)/udpsysrqd/
18+
19+clean:
20+ rm -f -- udpsysrqd
21+
22+.PHONY: clean install
--- branches/udpsysrqd/README (nonexistent)
+++ branches/udpsysrqd/README (revision 596)
@@ -0,0 +1,63 @@
1+About this package:
2+
3+ When troubleshooting system freeze problems, obtaining SysRq messages
4+ is commonly used. However, it is impossible for administrators to
5+ use the SysRq keys if he/she is not seated in front of the console.
6+
7+ This package contains a utility for triggering SysRq via UDP packets
8+ based on an assumption that the kernel's scheduling functionality is
9+ alive.
10+
11+ This package is released under the GPLv2.
12+
13+How to use this utility:
14+
15+ There are 4 entries which are given via a configuration file
16+ specified at command line. Included udpsysrqd.conf is an example.
17+
18+ listen_ip $listen_ip
19+
20+ $listen_ip specifies the local IPv4 or IPv6 address to listen to.
21+ Default value is :: if IPv6 is available, 0.0.0.0 otherwise.
22+
23+ listen_port $listen_port
24+
25+ $listen_port specifies the local port number to listen to.
26+ Default value is 0.
27+
28+ trap $sysrq $magic
29+
30+ $sysrq is a SysRq command (e.g. h t w, or combination of them).
31+
32+ $magic is a string which writes $sysrq to /proc/sysrq-trigger
33+ when a UDP packet containing this string was received.
34+ Since $magic can contain only bytes in 0x21-0x5B,0x5D-0x7E range,
35+ please note that packets containing end of line bytes won't match.
36+
37+ Although $magic acts like a password which prevents unwanted sources
38+ from triggering $sysrq , you must ensure security by other means
39+ because $magic is sent as a plain clear text and is very vulnerable
40+ to attacks such as eavesdropping and brute force.
41+
42+ This entry is optional if "default " entry is specified.
43+ You can specify this entry for up to 256 times.
44+
45+ default $timeout1 [ $sysrq1 [ $timeout2 [ $sysrq2 [ ... ]]]]
46+
47+ $timeoutX is a timeout in milliseconds waiting for a UDP packet
48+ to arrive. A negative value (e.g. -1) means no timeout.
49+
50+ $sysrqX is a SysRq command which will be written to
51+ /proc/sysrq-trigger when no packets are received within
52+ $timeoutX timeout.
53+
54+ Upon $timeout1, $sysrq1 is written and new timeout becomes $timeout2.
55+ Upon $timeout2, $sysrq2 is written and new timeout becomes $timeout3.
56+ Upon $timeout3, $sysrq3 is written and new timeout becomes $timeout4.
57+
58+ -1 is implicitly appended to the tail of this entry which means that
59+ no more actions will be taken automatically.
60+
61+ If a UDP packet arrives, new timeout becomes $timeout1.
62+
63+ This entry is optional if "trap " entry is specified.
--- branches/udpsysrqd/udpsysrqd.c (nonexistent)
+++ branches/udpsysrqd/udpsysrqd.c (revision 596)
@@ -0,0 +1,328 @@
1+/*
2+ * Simple SysRq daemon - A utility for triggering SysRq via UDP packets.
3+ *
4+ * Written by Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
5+ *
6+ * Distributed under GPL v2.
7+ */
8+#include <stdio.h>
9+#include <string.h>
10+#include <stdlib.h>
11+#include <unistd.h>
12+#include <poll.h>
13+#include <sys/types.h>
14+#include <sys/stat.h>
15+#include <fcntl.h>
16+#include <sys/socket.h>
17+#include <arpa/inet.h>
18+#include <stdarg.h>
19+#include <errno.h>
20+#include <sys/mman.h>
21+
22+/* Structure for holding IPv4 or IPv6 address. */
23+union ipaddr {
24+ struct sockaddr_in ip4;
25+ struct sockaddr_in6 ip6;
26+};
27+
28+/* Structure for holding on-demand SysRq action list. */
29+#define MAX_TRAPS 256
30+static struct command {
31+ const char *magic;
32+ const char *command;
33+ int magic_len;
34+ int command_len;
35+} traps[MAX_TRAPS];
36+
37+/* Default actions with timeouts. */
38+static char *default_action = NULL;
39+/* Number of on-demand actions defined. */
40+static int num_traps = 0;
41+/* File descriptor for /proc/sysrq-trigger . */
42+static int sysrq_fd = EOF;
43+/* Receiver socket's file descriptor. */
44+static int socket_fd = EOF;
45+
46+/**
47+ * die - Print error and exit.
48+ *
49+ * @fmt: Format string, followed by arguments.
50+ *
51+ * This function does not return.
52+ */
53+static void die(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
54+static void die(const char *fmt, ...)
55+{
56+ const int err = errno;
57+ va_list args;
58+ va_start(args, fmt);
59+ vfprintf(stderr, fmt, args);
60+ va_end(args);
61+ fprintf(stderr, " : %s(%d)\n", strerror(err), err);
62+ exit(1);
63+}
64+
65+/**
66+ * help - Print help and exit.
67+ *
68+ * @fmt: Format string, followed by arguments.
69+ *
70+ * This function does not return.
71+ */
72+static void help(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
73+static void help(const char *fmt, ...)
74+{
75+ va_list args;
76+ fprintf(stderr, "Simple SysRq daemon\n\nError: ");
77+ va_start(args, fmt);
78+ vfprintf(stderr, fmt, args);
79+ va_end(args);
80+ fprintf(stderr, "\n\nPlease see the README file.\n");
81+ exit(1);
82+}
83+
84+/**
85+ * get_addr - Get string representation of IP address.
86+ *
87+ * @ipv6: True if @addr contains an IPv6 address, false otheriwse.
88+ * @addr: Pointer to "union ipaddr".
89+ *
90+ * Returns static buffer to IP string.
91+ */
92+static const char *get_addr(_Bool ipv6, const union ipaddr *addr)
93+{
94+ static char buf[40];
95+ memset(buf, 0, sizeof(buf));
96+ if (ipv6)
97+ inet_ntop(AF_INET6, &addr->ip6.sin6_addr, buf, sizeof(buf));
98+ else
99+ inet_ntop(AF_INET, &addr->ip4.sin_addr, buf, sizeof(buf));
100+ return buf;
101+}
102+
103+/**
104+ * normalize_line - Format string.
105+ *
106+ * @buffer: The line to normalize.
107+ *
108+ * Returns nothing.
109+ *
110+ * Leading and trailing whitespaces are removed.
111+ * Multiple whitespaces are packed into single space.
112+ */
113+static void normalize_line(char *buffer)
114+{
115+ unsigned char *sp = (unsigned char *) buffer;
116+ unsigned char *dp = (unsigned char *) buffer;
117+ _Bool first = 1;
118+ while (*sp && (*sp <= ' ' || 127 <= *sp))
119+ sp++;
120+ while (*sp) {
121+ if (!first)
122+ *dp++ = ' ';
123+ first = 0;
124+ while (' ' < *sp && *sp < 127)
125+ *dp++ = *sp++;
126+ while (*sp && (*sp <= ' ' || 127 <= *sp))
127+ sp++;
128+ }
129+ *dp = '\0';
130+}
131+
132+/**
133+ * my_strdup - strdup() with error checking.
134+ *
135+ * @str: The string to duplicate.
136+ *
137+ * Returns a duplicated string on success, abort otherwise.
138+ */
139+static char *my_strdup(const char *str)
140+{
141+ char *cp = strdup(str);
142+ if (!cp) {
143+ fprintf(stderr, "Out of memory.\n");
144+ exit(1);
145+ }
146+ return cp;
147+}
148+
149+/**
150+ * do_init - Initialization function.
151+ *
152+ * @argc: Number of arguments.
153+ * @argv: Arguments.
154+ *
155+ * Returns nothing.
156+ */
157+static void do_init(int argc, char *argv[])
158+{
159+ union ipaddr addr = { };
160+ socklen_t size;
161+ int fd = EOF;
162+ _Bool ipv6 = 1;
163+ const char *ip = NULL;
164+ unsigned short port = 0;
165+ char line[1024];
166+ int lineno = 0;
167+ FILE *fp;
168+ if (argc != 2)
169+ help("Please specify a configuration file.");
170+ fp = fopen(argv[1], "r");
171+ if (!fp)
172+ help("Can't open %s for reading.", argv[1]);
173+ memset(traps, 0, sizeof(traps));
174+ while (memset(line, 0, sizeof(line)), lineno++,
175+ fgets(line, sizeof(line) - 1, fp)) {
176+ char *cp = strchr(line, '\n');
177+ if (!cp)
178+ help("Line %u: Too long or truncated.", lineno);
179+ cp = strchr(line, '#');
180+ if (cp)
181+ *cp = '\0';
182+ normalize_line(line);
183+ if (!*line)
184+ continue;
185+ if (!default_action && !strncmp(line, "default ", 8))
186+ default_action = my_strdup(line + 8);
187+ else if (!ip && !strncmp(line, "listen_ip ", 10))
188+ ip = my_strdup(line + 10);
189+ else if (!port && !strncmp(line, "listen_port ", 12))
190+ port = atoi(line + 12);
191+ else if (!strncmp(line, "trap ", 5)) {
192+ int i;
193+ cp = strchr(line + 5, ' ');
194+ if (!cp)
195+ help("Line %u: A \"trap \" entry needs "
196+ "$sysrq and $magic arguments.", lineno);
197+ *cp++ = '\0';
198+ for (i = 0; cp[i]; i++) {
199+ const char c = cp[i];
200+ if (c > 0x20 && c < 0x7F && c != 0x5C)
201+ continue;
202+ help("Line %u: '%c' is an invalid character.",
203+ lineno, c);
204+ }
205+ i = num_traps++;
206+ if (i >= MAX_TRAPS)
207+ help("Line %u: Too many \"trap \" entries.",
208+ lineno);
209+ traps[i].magic = my_strdup(cp);
210+ traps[i].magic_len = strlen(traps[i].magic);
211+ traps[i].command = my_strdup(line + 5);
212+ traps[i].command_len = strlen(traps[i].command);
213+ } else {
214+ help("Line %u: Invalid line.", lineno);
215+ }
216+ }
217+ fclose(fp);
218+ if (!default_action && !num_traps)
219+ help("Neither \"default \" entry nor \"trap \" entry is given.");
220+ if (!default_action)
221+ default_action = my_strdup("");
222+ /* Open /proc/sysrq-trigger for writing. */
223+ sysrq_fd = open("/proc/sysrq-trigger", O_WRONLY);
224+ if (sysrq_fd == EOF)
225+ die("Can't open /proc/sysrq-trigger");
226+ /* Create the listener socket and configure it. */
227+ if (!ip || inet_pton(AF_INET, ip, &addr.ip4.sin_addr) != 1) {
228+ fd = socket(PF_INET6, SOCK_DGRAM, 0);
229+ /*
230+ * Give up if IPv6 address was requested but IPv6 socket is not
231+ * available.
232+ */
233+ if (fd == EOF && ip)
234+ die("Can't create IPv6 socket");
235+ }
236+ if (fd == EOF) {
237+ fd = socket(PF_INET, SOCK_DGRAM, 0);
238+ /* Give up if IPv4 socket is not available. */
239+ if (fd == EOF)
240+ die("Can't create IPv4 socket");
241+ ipv6 = 0;
242+ }
243+ socket_fd = fd;
244+ if (ipv6) {
245+ addr.ip6.sin6_family = AF_INET6;
246+ addr.ip6.sin6_port = htons(port);
247+ if (!ip)
248+ addr.ip6.sin6_addr = in6addr_any;
249+ else if (inet_pton(AF_INET6, ip, &addr.ip6.sin6_addr) != 1) {
250+ fprintf(stderr, "%s is an invalid IPv6 address\n", ip);
251+ exit(1);
252+ }
253+ } else {
254+ addr.ip4.sin_family = AF_INET;
255+ addr.ip4.sin_port = htons(port);
256+ if (!ip)
257+ addr.ip4.sin_addr.s_addr = htonl(INADDR_ANY);
258+ }
259+ ip = get_addr(ipv6, &addr);
260+ if (ipv6)
261+ port = ntohs(addr.ip6.sin6_port);
262+ else
263+ port = ntohs(addr.ip4.sin_port);
264+ size = ipv6 ? sizeof(addr.ip6) : sizeof(addr.ip4);
265+ if (bind(fd, (struct sockaddr *) &addr, size))
266+ die("Can't bind to ip=%s port=%u", ip, port);
267+ else if (getsockname(fd, (struct sockaddr *) &addr, &size))
268+ die("Can't get bound address");
269+ ip = get_addr(ipv6, &addr);
270+ if (ipv6)
271+ port = ntohs(addr.ip6.sin6_port);
272+ else
273+ port = ntohs(addr.ip4.sin_port);
274+ printf("Listening at ip=%s port=%u\n", ip, port);
275+ /* Close unused file descriptors. */
276+ for (fd = 0; fd < 1024; fd++)
277+ if (fd != sysrq_fd && fd != socket_fd)
278+ close(fd);
279+ /* Try to avoid page faults, but not required to be perfect. */
280+ mlockall(MCL_CURRENT);
281+}
282+
283+int main(int argc, char *argv[])
284+{
285+ char *pos;
286+ do_init(argc, argv);
287+ pos = default_action;
288+ while (1) {
289+ int ret_ignored = 0;
290+ static char buffer[1024] = { };
291+ struct pollfd pfd = { socket_fd, POLLIN, 0 };
292+ int i;
293+ int len = strtol(pos, &pos, 10);
294+ if (*pos == ' ')
295+ pos++;
296+ else
297+ len = -1; /* Negative value means no timeout. */
298+ switch (poll(&pfd, 1, len)) {
299+ case 0: /* No packet within timeout. */
300+ /* Let's start/continue default sysrq action. */
301+ while (*pos && *pos != ' ')
302+ ret_ignored += write(sysrq_fd, pos++, 1);
303+ continue;
304+ case EOF: /* poll() failed for some reason. */
305+ /* Have a nap and restart the default action. */
306+ sleep(1);
307+ pos = default_action;
308+ continue;
309+ }
310+ /* poll() says that a packet arrived. */
311+ len = recv(socket_fd, buffer, sizeof(buffer), MSG_DONTWAIT);
312+ /* Let's do on-demand sysrq if the packet contains magic. */
313+ for (i = 0; i < num_traps; i++) {
314+ const char *cp;
315+ if (traps[i].magic_len != len ||
316+ memcmp(traps[i].magic, buffer, len))
317+ continue;
318+ cp = traps[i].command;
319+ len = traps[i].command_len;
320+ for (i = 0; i < len; i++)
321+ ret_ignored += write(sysrq_fd, &cp[i], 1);
322+ break;
323+ }
324+ /* Restart the default action. */
325+ pos = default_action;
326+ }
327+ return 0;
328+}
--- branches/udpsysrqd/udpsysrqd.spec (nonexistent)
+++ branches/udpsysrqd/udpsysrqd.spec (revision 596)
@@ -0,0 +1,43 @@
1+Summary: A utility for triggering SysRq via UDP packets.
2+Name: udpsysrqd
3+Version: 1.0
4+Release: 1
5+License: GPLv2
6+Group: Applications/System
7+ExclusiveOS: Linux
8+Autoreqprov: no
9+Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
10+Conflicts: udpsysrqd < 1.0-1
11+
12+Source0: udpsysrqd.tar.gz
13+
14+%description
15+This package contains a utility for triggering SysRq via UDP packets.
16+
17+%prep
18+
19+%setup -q -n udpsysrqd
20+
21+%build
22+
23+make CFLAGS="-Wall $RPM_OPT_FLAGS"
24+
25+%install
26+
27+rm -rf $RPM_BUILD_ROOT
28+make INSTALLDIR=$RPM_BUILD_ROOT install
29+
30+%clean
31+
32+rm -rf $RPM_BUILD_ROOT
33+
34+%files
35+%defattr(-,root,root)
36+/usr/bin/udpsysrqd
37+%doc /usr/share/doc/udpsysrqd/README
38+%doc /usr/share/doc/udpsysrqd/COPYING
39+%doc /usr/share/doc/udpsysrqd/udpsysrqd.conf
40+
41+%changelog
42+* Thu Sep 13 2018 1.0-1
43+- Initial packaging.
Show on old repository browser