summaryrefslogtreecommitdiff
path: root/miscutils
diff options
context:
space:
mode:
Diffstat (limited to 'miscutils')
-rw-r--r--miscutils/dutmp.c47
-rw-r--r--miscutils/makedevs.c95
-rw-r--r--miscutils/mt.c98
-rw-r--r--miscutils/update.c48
4 files changed, 288 insertions, 0 deletions
diff --git a/miscutils/dutmp.c b/miscutils/dutmp.c
new file mode 100644
index 000000000..e92b6700f
--- /dev/null
+++ b/miscutils/dutmp.c
@@ -0,0 +1,47 @@
1/*
2 * public domain -- Dave 'Kill a Cop' Cinege <dcinege@psychosis.com>
3 *
4 * dutmp
5 * Takes utmp formated file on stdin and dumps it's contents
6 * out in colon delimited fields. Easy to 'cut' for shell based
7 * versions of 'who', 'last', etc. IP Addr is output in hex,
8 * little endian on x86.
9 *
10 * made against libc6
11 */
12
13#include "internal.h"
14#include <stdio.h>
15#include <utmp.h>
16
17const char dutmp_usage[] = "dutmp\n"
18"\n"
19"\tDump file or stdin utmp file format to stdout, pipe delimited.\n"
20"\tdutmp /var/run/utmp\n";
21
22extern int
23dutmp_fn(const struct FileInfo * i)
24{
25
26FILE * f = stdin;
27struct utmp * ut = (struct utmp *) malloc(sizeof(struct utmp) );
28
29 if ( i )
30 if (! (f = fopen(i->source, "r"))) {
31 name_and_error(i->source);
32 return 1;
33 }
34
35 while (fread (ut, 1, sizeof(struct utmp), f)) {
36 //printf("%d:%d:%s:%s:%s:%s:%d:%d:%ld:%ld:%ld:%x\n",
37 printf("%d|%d|%s|%s|%s|%s|%d|%d|%ld|%ld|%ld|%x\n",
38 ut->ut_type, ut->ut_pid, ut->ut_line,
39 ut->ut_id, ut->ut_user, ut->ut_host,
40 ut->ut_exit.e_termination, ut->ut_exit.e_exit,
41 ut->ut_session,
42 ut->ut_tv.tv_sec, ut->ut_tv.tv_usec,
43 ut->ut_addr);
44 }
45
46return 0;
47}
diff --git a/miscutils/makedevs.c b/miscutils/makedevs.c
new file mode 100644
index 000000000..691236e29
--- /dev/null
+++ b/miscutils/makedevs.c
@@ -0,0 +1,95 @@
1/*
2 * public domain -- Dave 'Kill a Cop' Cinege <dcinege@psychosis.com>
3 *
4 * makedevs
5 * Make ranges of device files quickly.
6 * known bugs: can't deal with alpha ranges
7 */
8
9#include "internal.h"
10#include <stdio.h>
11#include <stdlib.h>
12#include <string.h>
13#include <fcntl.h>
14#include <unistd.h>
15#include <sys/types.h>
16#include <sys/stat.h>
17
18const char makedevs_usage[] =
19"makedevs 0.01 -- Create an entire range of device files\n\n"
20"\tmakedevs /dev/ttyS c 4 64 0 63 (ttyS0-ttyS63)\n"
21"\tmakedevs /dev/hda b 3 0 0 8 s (hda,hda1-hda8)\n";
22
23int
24makedevs_main(struct FileInfo * i, int argc, char * * argv)
25{
26
27const char *basedev = argv[1];
28const char *type = argv[2];
29int major = atoi(argv[3]);
30int Sminor = atoi(argv[4]);
31int S = atoi(argv[5]);
32int E = atoi(argv[6]);
33int sbase = argc == 8 ? 1 : 0;
34
35mode_t mode = 0;
36dev_t dev = 0;
37char devname[255];
38char buf[255];
39
40 switch (type[0]) {
41 case 'c':
42 mode = S_IFCHR; break;
43 case 'b':
44 mode = S_IFBLK; break;
45 case 'f':
46 mode = S_IFIFO; break;
47 default:
48 usage(makedevs_usage);
49 return 2;
50 }
51 mode |= 0660;
52
53 while ( S <= E ) {
54
55 if (type[0] != 'f')
56 dev = (major << 8) | Sminor;
57 strcpy(devname, basedev);
58
59 if (sbase == 0) {
60 sprintf(buf, "%d", S);
61 strcat(devname, buf);
62 } else {
63 sbase = 0;
64 }
65
66 if (mknod (devname, mode, dev))
67 printf("Failed to create: %s\n", devname);
68
69 S++; Sminor++;
70 }
71
72return 0;
73}
74
75/*
76And this is what this program replaces. The shell is too slow!
77
78makedev () {
79local basedev=$1; local S=$2; local E=$3
80local major=$4; local Sminor=$5; local type=$6
81local sbase=$7
82
83 if [ ! "$sbase" = "" ]; then
84 mknod "$basedev" $type $major $Sminor
85 S=`expr $S + 1`
86 Sminor=`expr $Sminor + 1`
87 fi
88
89 while [ $S -le $E ]; do
90 mknod "$basedev$S" $type $major $Sminor
91 S=`expr $S + 1`
92 Sminor=`expr $Sminor + 1`
93 done
94}
95*/
diff --git a/miscutils/mt.c b/miscutils/mt.c
new file mode 100644
index 000000000..7d75fbd3d
--- /dev/null
+++ b/miscutils/mt.c
@@ -0,0 +1,98 @@
1#include "internal.h"
2#include <stdio.h>
3#include <sys/mtio.h>
4#include <sys/fcntl.h>
5
6const char mt_usage[] = "mt [-f device] opcode value\n";
7
8struct mt_opcodes {
9 char * name;
10 short value;
11};
12
13/* missing: eod/seod, stoptions, stwrthreshold, densities */
14static const struct mt_opcodes opcodes[] = {
15 { "bsf", MTBSF },
16 { "bsfm", MTBSFM },
17 { "bsr", MTBSR },
18 { "bss", MTBSS },
19 { "datacompression", MTCOMPRESSION },
20 { "eom", MTEOM },
21 { "erase", MTERASE },
22 { "fsf", MTFSF },
23 { "fsfm", MTFSFM },
24 { "fsr", MTFSR },
25 { "fss", MTFSS },
26 { "load", MTLOAD },
27 { "lock", MTLOCK },
28 { "mkpart", MTMKPART },
29 { "nop", MTNOP },
30 { "offline",MTOFFL },
31 { "rewoffline",MTOFFL },
32 { "ras1", MTRAS1 },
33 { "ras2", MTRAS2 },
34 { "ras3", MTRAS3 },
35 { "reset", MTRESET },
36 { "retension", MTRETEN },
37 { "rew", MTREW },
38 { "seek", MTSEEK },
39 { "setblk", MTSETBLK },
40 { "setdensity", MTSETDENSITY },
41 { "drvbuffer", MTSETDRVBUFFER },
42 { "setpart", MTSETPART },
43 { "tell", MTTELL },
44 { "wset", MTWSM },
45 { "unload", MTUNLOAD },
46 { "unlock", MTUNLOCK },
47 { "eof", MTWEOF },
48 { "weof", MTWEOF },
49 { 0, 0 }
50};
51
52extern int
53mt_main(struct FileInfo * i, int argc, char * * argv)
54{
55 const char * file = "/dev/tape";
56 const struct mt_opcodes * code = opcodes;
57 struct mtop op;
58 int fd;
59
60 if ( strcmp(argv[1], "-f") == 0 ) {
61 if ( argc < 4 ) {
62 usage(mt_usage);
63 return 1;
64 }
65 file = argv[2];
66 argv += 2;
67 argc -= 2;
68 }
69
70 while ( code->name != 0 ) {
71 if ( strcmp(code->name, argv[1]) == 0 )
72 break;
73 code++;
74 }
75
76 if ( code->name == 0 ) {
77 fprintf(stderr, "mt: unrecognized opcode %s.\n", argv[1]);
78 return 1;
79 }
80
81 op.mt_op = code->value;
82 if ( argc >= 3 )
83 op.mt_count = atoi(argv[2]);
84 else
85 op.mt_count = 1; /* One, not zero, right? */
86
87 if ( (fd = open(file, O_RDONLY, 0)) < 0 ) {
88 name_and_error(file);
89 return 1;
90 }
91
92 if ( ioctl(fd, MTIOCTOP, &op) != 0 ) {
93 name_and_error(file);
94 return 1;
95 }
96
97 return 0;
98}
diff --git a/miscutils/update.c b/miscutils/update.c
new file mode 100644
index 000000000..f3b7fc0c8
--- /dev/null
+++ b/miscutils/update.c
@@ -0,0 +1,48 @@
1#include "internal.h"
2#include <linux/unistd.h>
3
4const char update_usage[] = "update\n"
5"\n"
6"\tFlush buffered data to the disk devices every 30 seconds.\n";
7
8#if defined(__GLIBC__)
9#include <sys/kdaemon.h>
10#else
11_syscall2(int, bdflush, int, func, int, data);
12#endif /* __GLIBC__ */
13
14extern int
15update_main(struct FileInfo * i, int argc, char * * argv)
16{
17 /*
18 * Update is actually two daemons, bdflush and update.
19 */
20 int pid;
21
22 pid = fork();
23 if ( pid < 0 )
24 return pid;
25 else if ( pid == 0 ) {
26 /*
27 * This is no longer necessary since 1.3.5x, but it will harmlessly
28 * exit if that is the case.
29 */
30 strcpy(argv[0], "bdflush (update)");
31 argv[1] = 0;
32 argv[2] = 0;
33 bdflush(1, 0);
34 _exit(0);
35 }
36 pid = fork();
37 if ( pid < 0 )
38 return pid;
39 else if ( pid == 0 ) {
40 argv[0] = "update";
41 for ( ; ; ) {
42 sync();
43 sleep(30);
44 }
45 }
46
47 return 0;
48}