Compare commits
3 Commits
master
...
combined_g
Author | SHA1 | Date |
---|---|---|
paiging | 1474016ff5 | |
hjp | 4d8289dad6 | |
cvs2git | cd3d78bbb1 |
|
@ -1,3 +0,0 @@
|
||||||
GNUmakerules
|
|
||||||
GNUmakevars
|
|
||||||
*.o
|
|
|
@ -1,35 +0,0 @@
|
||||||
include GNUmakevars
|
|
||||||
|
|
||||||
BINDIR=/usr/local/bin
|
|
||||||
|
|
||||||
all: agestat
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f agestat customize
|
|
||||||
|
|
||||||
distclean: clean
|
|
||||||
rm -f GNUmakevars GNUmakerules
|
|
||||||
|
|
||||||
install: $(BINDIR) $(BINDIR)/agestat
|
|
||||||
|
|
||||||
%: %.pl customize
|
|
||||||
sh ./customize < $< > $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
%: %.sh customize
|
|
||||||
sh ./customize < $< > $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
customize: configure
|
|
||||||
sh ./configure
|
|
||||||
|
|
||||||
$(BINDIR):
|
|
||||||
mkdir -p $@
|
|
||||||
|
|
||||||
GNUmakevars: GNUmakevars.sh
|
|
||||||
sh ./$^ > $@
|
|
||||||
GNUmakerules: GNUmakerules.sh
|
|
||||||
sh ./$^ > $@
|
|
||||||
|
|
||||||
|
|
||||||
include GNUmakerules
|
|
|
@ -1,5 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
echo "\$(BINDIR)/%: %"
|
|
||||||
echo " cp \$^ \$@"
|
|
||||||
echo "\$(MAN1DIR)/%: %"
|
|
||||||
echo " cp \$^ \$@"
|
|
|
@ -1,15 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
prefix=${prefix:-/usr/local}
|
|
||||||
echo "BINDIR=$prefix/bin"
|
|
||||||
|
|
||||||
for i in "$prefix/share/man/man1" "$prefix/man/man1"
|
|
||||||
do
|
|
||||||
if [ -d "$i" -a -w "$i" ]
|
|
||||||
then
|
|
||||||
echo "MAN1DIR=$i"
|
|
||||||
break;
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "all:"
|
|
|
@ -1,137 +0,0 @@
|
||||||
#!@@@perl@@@ -w
|
|
||||||
#
|
|
||||||
# $Id: agestat.pl,v 1.10 2015-08-25 16:00:39 hjp Exp $
|
|
||||||
#
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use File::stat;
|
|
||||||
use File::Find;
|
|
||||||
use Getopt::Long;
|
|
||||||
|
|
||||||
sub usage {
|
|
||||||
print STDERR "Usage: $0 [-atime|-mtime] [-scale=(k|M)] [-buckets=(cal|log2)]\n";
|
|
||||||
exit 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
my $now = time();
|
|
||||||
my @bucket_max;
|
|
||||||
|
|
||||||
my %opts = (buckets => 'log2');
|
|
||||||
GetOptions(\%opts, "atime", "mtime", "scale=s", "buckets=s") or usage();
|
|
||||||
my $scale;
|
|
||||||
if (!defined($opts{scale})) {
|
|
||||||
$scale = 1;
|
|
||||||
} elsif ($opts{scale} eq 'k') {
|
|
||||||
$scale = 1024;
|
|
||||||
} elsif ($opts{scale} eq 'M') {
|
|
||||||
$scale = 1024*1024;
|
|
||||||
} else {
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($opts{buckets} eq "log2") {
|
|
||||||
for (my ($b, $s) = (0, 1); $b < 32; $b++, $s *= 2) {
|
|
||||||
$bucket_max[$b] = $s;
|
|
||||||
}
|
|
||||||
} elsif ($opts{buckets} eq "cal") {
|
|
||||||
@bucket_max = (
|
|
||||||
3600,
|
|
||||||
86400,
|
|
||||||
7 * 86400,
|
|
||||||
30 * 86400,
|
|
||||||
182 * 86400,
|
|
||||||
1 * 365.2422 * 86400,
|
|
||||||
2 * 365.2422 * 86400,
|
|
||||||
3 * 365.2422 * 86400,
|
|
||||||
4 * 365.2422 * 86400,
|
|
||||||
5 * 365.2422 * 86400,
|
|
||||||
);
|
|
||||||
} elsif ($opts{buckets} =~ /^days=(\d+)/) {
|
|
||||||
@bucket_max = map $_ * 86400, (1 .. $1);
|
|
||||||
} else {
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
my @hist;
|
|
||||||
|
|
||||||
sub wanted {
|
|
||||||
|
|
||||||
my $st = lstat($_);
|
|
||||||
return unless $st;
|
|
||||||
my $age = $now - (
|
|
||||||
$opts{atime} ? $st->atime :
|
|
||||||
$opts{mtime} ? $st->mtime :
|
|
||||||
(! -d && $st->atime > $st->mtime ? $st->atime
|
|
||||||
: $st->mtime ));
|
|
||||||
my $b = 0;
|
|
||||||
while ($b <= $#bucket_max && $age > $bucket_max[$b]) { $b++ };
|
|
||||||
#print $File::Find::name, ": $age sec, ", $st->size, " bytes, ", $st->nlink, " links, bucket $b\n";
|
|
||||||
$hist[$b] += $st->size / $st->nlink;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub time2str {
|
|
||||||
my ($t) = (@_);
|
|
||||||
|
|
||||||
if ($t < 60) {
|
|
||||||
return sprintf ("%6.1f s", $t);
|
|
||||||
} elsif ($t < 3600) {
|
|
||||||
return sprintf ("%6.1f m", $t/60);
|
|
||||||
} elsif ($t < 3600 * 24) {
|
|
||||||
return sprintf ("%6.1f h", $t/3600);
|
|
||||||
} elsif ($t < 3600 * 24 * 365.2422) {
|
|
||||||
return sprintf ("%6.1f d", $t/(3600*24));
|
|
||||||
} else {
|
|
||||||
return sprintf ("%6.1f y", $t/(3600*24*365.2422));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (@ARGV == 0) { push (@ARGV, "."); }
|
|
||||||
find(\&wanted, @ARGV);
|
|
||||||
|
|
||||||
print "\n\n";
|
|
||||||
|
|
||||||
my $sum = 0;
|
|
||||||
|
|
||||||
for (my $i = 0; $i <= $#hist; $i++) {
|
|
||||||
$sum += ($hist[$i] || 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
my $c = 0;
|
|
||||||
for (my $i = 0; $i <= $#hist; $i++) {
|
|
||||||
my $h = ($hist[$i] || 0);
|
|
||||||
$c += $h;
|
|
||||||
printf("%2d\t%s\t%12.0f\t%5.1f\t%12.0f\t%5.1f\n",
|
|
||||||
$i,
|
|
||||||
$i <= $#bucket_max ? time2str($bucket_max[$i]) : "infinity",
|
|
||||||
$h/$scale, $h * 100 / $sum, $c/$scale, $c * 100 / $sum);
|
|
||||||
}
|
|
||||||
|
|
||||||
# $Log: agestat.pl,v $
|
|
||||||
# Revision 1.10 2015-08-25 16:00:39 hjp
|
|
||||||
# New bucket type days
|
|
||||||
#
|
|
||||||
# Revision 1.9 2012-10-22 09:20:05 hjp
|
|
||||||
# fixed usage message
|
|
||||||
#
|
|
||||||
# Revision 1.8 2007-02-09 15:36:37 hjp
|
|
||||||
# Automatically create GNUmakerules and GNUmakevars if they don't exist.
|
|
||||||
# Print usage if unknown option is given.
|
|
||||||
#
|
|
||||||
# Revision 1.7 2006/02/17 13:50:23 hjp
|
|
||||||
# Fixed error when oldest file was older than oldest bucket.
|
|
||||||
# Realigned columns.
|
|
||||||
#
|
|
||||||
# Revision 1.6 2006/02/17 13:31:41 hjp
|
|
||||||
# Added option --buckets.
|
|
||||||
#
|
|
||||||
# Revision 1.5 2002/03/18 20:33:46 hjp
|
|
||||||
# Ignore atime for directories
|
|
||||||
#
|
|
||||||
# Revision 1.4 2001/01/19 19:06:01 hjp
|
|
||||||
# Removed superfluous "total" line.
|
|
||||||
# Fixed usage message.
|
|
||||||
#
|
|
|
@ -1,30 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
echo "#!/bin/sh" > customize.$$
|
|
||||||
echo "sed \\" >> customize.$$
|
|
||||||
chmod +x customize.$$
|
|
||||||
|
|
||||||
################################################################
|
|
||||||
# find a working perl:
|
|
||||||
#
|
|
||||||
for i in /usr/bin/perl /usr/local/bin/perl /usr/bin/perl5 /usr/local/bin/perl5
|
|
||||||
do
|
|
||||||
if $i -e 'exit ($] < 5.000)'
|
|
||||||
then
|
|
||||||
echo $i works
|
|
||||||
perl="$i"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [ -z "$perl" ]
|
|
||||||
then
|
|
||||||
could not find a working perl command, sorry.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo " -e 's,@@@perl@@@,$perl,g' \\" >> customize.$$
|
|
||||||
|
|
||||||
|
|
||||||
echo >> customize.$$
|
|
||||||
|
|
||||||
mv customize.$$ customize
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
include GNUmakevars
|
|
||||||
include GNUmakerules
|
|
||||||
|
|
||||||
base64: base64.o
|
|
||||||
$(CC) $^ -lant -o $@
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.o base64 core foo bar
|
|
||||||
|
|
||||||
install: $(BINDIR)/base64
|
|
||||||
|
|
||||||
distclean: clean
|
|
||||||
rm -f *.bak *.d
|
|
|
@ -1,55 +0,0 @@
|
||||||
#include <ant/base64.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
char *cmnd;
|
|
||||||
|
|
||||||
static void usage(void) {
|
|
||||||
fprintf(stderr, "Usage: %s [-d|-e]\n", cmnd);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
char buf1[1024+1];
|
|
||||||
char buf2[1024+1];
|
|
||||||
enum { NONE, ENCODE, DECODE} mode = NONE;
|
|
||||||
int c;
|
|
||||||
int r1, r2;
|
|
||||||
cmnd = argv[0];
|
|
||||||
while ((c = getopt(argc, argv, "de")) != EOF) {
|
|
||||||
switch(c) {
|
|
||||||
case 'd':
|
|
||||||
mode = DECODE;
|
|
||||||
break;
|
|
||||||
case 'e':
|
|
||||||
mode = ENCODE;
|
|
||||||
break;
|
|
||||||
case '?':
|
|
||||||
usage();
|
|
||||||
default:
|
|
||||||
assert(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch(mode) {
|
|
||||||
case NONE:
|
|
||||||
usage();
|
|
||||||
case ENCODE:
|
|
||||||
while ((r1 = fread(buf1, 1, 57, stdin)) > 0) {
|
|
||||||
r2 = base64_encode(buf2, sizeof(buf2), buf1, r1, 76);
|
|
||||||
fwrite(buf2, 1, r2, stdout);
|
|
||||||
putchar('\n');
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case DECODE:
|
|
||||||
while (fgets(buf1, sizeof(buf1), stdin)) {
|
|
||||||
r1 = strlen(buf1);
|
|
||||||
if (buf1[r1-1] == '\n') r1--;
|
|
||||||
r2 = base64_decode(buf2, sizeof(buf2), buf1, r1);
|
|
||||||
fwrite(buf2, 1, r2, stdout);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
106
cgigw/cgigw.cgi
106
cgigw/cgigw.cgi
|
@ -1,106 +0,0 @@
|
||||||
#!/usr/bin/perl
|
|
||||||
#
|
|
||||||
# $Id: cgigw.cgi,v 1.1 1998-04-28 22:01:23 hjp Exp $
|
|
||||||
#
|
|
||||||
# This is a simpe CGI gateway script.
|
|
||||||
#
|
|
||||||
# It can be used to access CGI scripts on a different server and/or
|
|
||||||
# port.
|
|
||||||
# Possible scenarios where this is useful:
|
|
||||||
# * Your real CGI scripts have to run on a machine behind a firewall.
|
|
||||||
# In this case you may also want to modify this script to check
|
|
||||||
# parameters.
|
|
||||||
# * Your real CGI scripts have to run on a different server (e.g., one
|
|
||||||
# with some special database installed), but you don't want to expose
|
|
||||||
# that server's address in your URLs.
|
|
||||||
# * Your real CGI scripts have to run on a Web server which doesn't
|
|
||||||
# speak SSL.
|
|
||||||
#
|
|
||||||
# Usage: Change the customization section to point to the script which
|
|
||||||
# you really want to call. Install this script in some convenient
|
|
||||||
# place. Make sure the target script generates only links to your
|
|
||||||
# "official" server (If this is not possible, you might want to
|
|
||||||
# tweak its output just before "print @rest;" at the very bottom
|
|
||||||
# of this script.
|
|
||||||
#
|
|
||||||
# $Log: cgigw.cgi,v $
|
|
||||||
# Revision 1.1 1998-04-28 22:01:23 hjp
|
|
||||||
# Initial release.
|
|
||||||
# Only tested with a few CGIs and the Roxen web server.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
|
|
||||||
use IO::Socket;
|
|
||||||
|
|
||||||
# BEGIN customization section
|
|
||||||
$serv_addr = "internal.host.com";
|
|
||||||
$serv_port = 80;
|
|
||||||
$serv_script = "/some/script.cgi";
|
|
||||||
# END customization section
|
|
||||||
|
|
||||||
$sock = IO::Socket::INET->new(PeerAddr => $serv_addr,
|
|
||||||
PeerPort => $serv_port);
|
|
||||||
if (!$sock) {
|
|
||||||
print "Status: 500\r\n";
|
|
||||||
print "Content-type: text/html\r\n";
|
|
||||||
print "\r\n";
|
|
||||||
print "<html><body>\n";
|
|
||||||
print "<h1>Internal error</h1>\n";
|
|
||||||
print "Connection to $serv_addr:$serv_port failed: $!\n";
|
|
||||||
print "</body></html>\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
$method = $ENV{REQUEST_METHOD};
|
|
||||||
$query_string = $ENV{QUERY_STRING};
|
|
||||||
print STDERR "$0: method = $method\n";
|
|
||||||
|
|
||||||
$sock->print("$method $serv_script");
|
|
||||||
if ($query_string ne "") {
|
|
||||||
$sock->print("?$query_string");
|
|
||||||
}
|
|
||||||
$sock->print(" HTTP/1.0\r\n");
|
|
||||||
for $i (keys(%ENV)) {
|
|
||||||
if ($i =~ m/^HTTP_(.*)/) {
|
|
||||||
$key = $1;
|
|
||||||
$key =~ s/_/-/g;
|
|
||||||
$val = $ENV{$i};
|
|
||||||
$sock->print("$key: $val\r\n");
|
|
||||||
print STDERR "$0: Header: $key: $val\n";
|
|
||||||
} else {
|
|
||||||
$val = $ENV{$i};
|
|
||||||
print STDERR "$0: Env: $i: $val\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$content_length = $ENV{CONTENT_LENGTH};
|
|
||||||
if ($content_length) {
|
|
||||||
$sock->print("Content-Length: ", $content_length, "\r\n\r\n");
|
|
||||||
for ($i = 0; $i < $content_length; $i++) {
|
|
||||||
read(STDIN, $c, 1);
|
|
||||||
print STDERR "$0: Body: $i of $content_length: $c\n";
|
|
||||||
$sock->print($c);
|
|
||||||
}
|
|
||||||
# padding:
|
|
||||||
$sock->print("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n");
|
|
||||||
} else {
|
|
||||||
$sock->print("\r\n");
|
|
||||||
}
|
|
||||||
$sock->flush();
|
|
||||||
print STDERR "$0: Flushing\n";
|
|
||||||
|
|
||||||
$status = $sock->getline();
|
|
||||||
print STDERR "$0: Status: $status\n";
|
|
||||||
if ($status =~ m|^HTTP/\d+\.\d+ (\d+) |) {
|
|
||||||
print "Status: $1\r\n";
|
|
||||||
} elsif ($status =~ m|:|) {
|
|
||||||
# error: Assume this is a header and just pass it on
|
|
||||||
print $status;
|
|
||||||
} else {
|
|
||||||
# error: not a header. Assume this is HTML
|
|
||||||
print "Content-Type: text/html\r\n";
|
|
||||||
print "\r\n";
|
|
||||||
print $status;
|
|
||||||
}
|
|
||||||
@rest = $sock->getlines;
|
|
||||||
print @rest;
|
|
||||||
|
|
||||||
print STDERR "$0: Finished\n";
|
|
|
@ -1 +0,0 @@
|
||||||
charhist
|
|
|
@ -1,21 +0,0 @@
|
||||||
include GNUmakevars
|
|
||||||
include GNUmakerules
|
|
||||||
|
|
||||||
all: charhist
|
|
||||||
|
|
||||||
charhist: charhist.pl
|
|
||||||
cp $^ $@
|
|
||||||
|
|
||||||
chartab:
|
|
||||||
clean:
|
|
||||||
rm -f charhist core foo bar baz
|
|
||||||
|
|
||||||
distclean: clean
|
|
||||||
rm -f GNUmakerules GNUmakevars
|
|
||||||
|
|
||||||
GNUmakevars: GNUmakevars.sh
|
|
||||||
sh ./$^ > $@
|
|
||||||
GNUmakerules: GNUmakerules.pl
|
|
||||||
perl ./$^ > $@
|
|
||||||
|
|
||||||
install: $(BINDIR)/charhist
|
|
|
@ -1,8 +0,0 @@
|
||||||
#!/usr/bin/perl
|
|
||||||
use warnings;
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
print "\$(BINDIR)/%: %\n";
|
|
||||||
print "\tinstall -m 755 \$^ \$@\n";
|
|
||||||
print "\$(MAN1DIR)/%: %\n";
|
|
||||||
print "\tinstall -m 644 \$^ \$@\n";
|
|
|
@ -1,5 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
prefix=${prefix:-/usr/local}
|
|
||||||
echo "BINDIR=$prefix/bin"
|
|
||||||
echo
|
|
||||||
echo "all:"
|
|
|
@ -1,21 +0,0 @@
|
||||||
#include <ctype.h>
|
|
||||||
#include <locale.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <limits.h>
|
|
||||||
|
|
||||||
long hist[UCHAR_MAX+1];
|
|
||||||
|
|
||||||
int main (int argc, char **argv) {
|
|
||||||
int c;
|
|
||||||
|
|
||||||
setlocale(LC_ALL, "");
|
|
||||||
while ((c = getchar()) != EOF) {
|
|
||||||
hist[c]++;
|
|
||||||
}
|
|
||||||
for (c = 0; c <= UCHAR_MAX; c++) {
|
|
||||||
if (hist[c]) {
|
|
||||||
printf ("%x %d %o %c\t%ld\n", c, c, c, isprint(c) ? c : '.', hist[c]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,46 +0,0 @@
|
||||||
#!/usr/bin/perl
|
|
||||||
use warnings;
|
|
||||||
use strict;
|
|
||||||
use autodie;
|
|
||||||
|
|
||||||
use Getopt::Long;
|
|
||||||
use I18N::Langinfo qw(langinfo CODESET);
|
|
||||||
use Pod::Usage;
|
|
||||||
|
|
||||||
my $encoding = langinfo(CODESET);
|
|
||||||
|
|
||||||
GetOptions('encoding=s', \$encoding) or pod2usage();
|
|
||||||
|
|
||||||
my %hist;
|
|
||||||
if (@ARGV) {
|
|
||||||
readfile($_) for @ARGV;
|
|
||||||
} else {
|
|
||||||
readfile();
|
|
||||||
}
|
|
||||||
|
|
||||||
my $total = 0;
|
|
||||||
$total += $_ for values %hist;
|
|
||||||
|
|
||||||
binmode STDOUT, ":encoding(UTF-8)";
|
|
||||||
for (sort keys %hist) {
|
|
||||||
my $cp = ord;
|
|
||||||
printf("%x\t%d\t%o\t%s\t%7d\t%f\n",
|
|
||||||
$cp, $cp, $cp, /\p{Graph}/ ? $_ : ".", $hist{$_}, $hist{$_} / $total);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub readfile {
|
|
||||||
my ($filename) = @_;
|
|
||||||
my $fh;
|
|
||||||
if (defined $filename) {
|
|
||||||
open $fh, "<", $filename;
|
|
||||||
} else {
|
|
||||||
$fh = \*STDIN;
|
|
||||||
|
|
||||||
}
|
|
||||||
binmode $fh, ":encoding($encoding)";
|
|
||||||
while (<$fh>) {
|
|
||||||
for my $c (split(//)) {
|
|
||||||
$hist{$c}++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,11 +0,0 @@
|
||||||
include GNUmakevars
|
|
||||||
|
|
||||||
all: chartab ctype-test
|
|
||||||
|
|
||||||
chartab:
|
|
||||||
ctype-test:
|
|
||||||
clean:
|
|
||||||
rm chartab
|
|
||||||
install: $(BINDIR)/chartab $(BINDIR)/ctype-test
|
|
||||||
|
|
||||||
include GNUmakerules
|
|
|
@ -1,10 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int main (int argc, char **argv) {
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < 256; i++) {
|
|
||||||
printf ("%x %d %o %c\t", i, i, i, i);
|
|
||||||
if (i % 4 == 3) printf ("\n");
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
#!/usr/bin/perl
|
|
||||||
use warnings;
|
|
||||||
use strict;
|
|
||||||
use charnames ();
|
|
||||||
|
|
||||||
use Getopt::Long;
|
|
||||||
use Pod::Usage;
|
|
||||||
|
|
||||||
my $all;
|
|
||||||
|
|
||||||
GetOptions(
|
|
||||||
'all' => \$all
|
|
||||||
) or pod2usage(2);
|
|
||||||
|
|
||||||
binmode STDOUT, ":encoding(UTF-8)";
|
|
||||||
for my $c (0 .. 0xFFFF) {
|
|
||||||
my $cc = pack('U', $c);
|
|
||||||
if (charnames::viacode($c) || $all) {
|
|
||||||
printf("%04x %5d %06o %s %s\n",
|
|
||||||
$c,
|
|
||||||
$c,
|
|
||||||
$c,
|
|
||||||
(($cc =~ /[[:print:]]/) ? $cc : '.'),
|
|
||||||
charnames::viacode($c) || ''
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print "\n";
|
|
|
@ -1,17 +0,0 @@
|
||||||
#include <ctype.h>
|
|
||||||
#include <locale.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
int i;
|
|
||||||
|
|
||||||
setlocale(LC_ALL, "");
|
|
||||||
|
|
||||||
for (i = 0; i <= UCHAR_MAX; i++) {
|
|
||||||
printf ("%2x: ", i);
|
|
||||||
printf("%c ", isprint(i) ? i : '.');
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
version 5.0
|
|
||||||
map! >I<yypa/O
|
|
||||||
set autoindent
|
|
||||||
set exrc
|
|
||||||
set number
|
|
||||||
set shiftwidth=4
|
|
|
@ -1,47 +0,0 @@
|
||||||
include GNUmakevars
|
|
||||||
|
|
||||||
TARGETS = cleandir cleandir.1
|
|
||||||
CONFDIR=../../configure
|
|
||||||
CONFDIR_exists=$(shell [ -d $(CONFDIR) ] && echo ok)
|
|
||||||
|
|
||||||
all: configure $(TARGETS)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f $(TARGETS) *.bak core foo bar baz *.ps
|
|
||||||
|
|
||||||
distclean: clean
|
|
||||||
rm -f customize
|
|
||||||
|
|
||||||
install: $(BINDIR) $(BINDIR)/cleandir $(MAN1DIR)/cleandir.1
|
|
||||||
|
|
||||||
%.1: %.pl
|
|
||||||
pod2man $< > $@
|
|
||||||
|
|
||||||
%: %.pl customize
|
|
||||||
sh ./customize < $< > $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
%: %.sh customize
|
|
||||||
sh ./customize < $< > $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
customize: configure
|
|
||||||
sh ./configure
|
|
||||||
|
|
||||||
$(SBINDIR):
|
|
||||||
mkdir -p $@
|
|
||||||
|
|
||||||
ifeq ($(CONFDIR_exists),ok)
|
|
||||||
|
|
||||||
configure: $(CONFDIR)/start $(CONFDIR)/perl $(CONFDIR)/finish
|
|
||||||
cat $^ > $@
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
GNUmakevars: GNUmakevars.sh
|
|
||||||
sh ./$^ > $@
|
|
||||||
GNUmakerules: GNUmakerules.sh
|
|
||||||
sh ./$^ > $@
|
|
||||||
|
|
||||||
|
|
||||||
include GNUmakerules
|
|
|
@ -1,5 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
echo "\$(BINDIR)/%: %"
|
|
||||||
echo -e "\tcp \$^ \$@"
|
|
||||||
echo "\$(MAN1DIR)/%: %"
|
|
||||||
echo -e "\tcp \$^ \$@"
|
|
|
@ -1,15 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
prefix=${prefix:-/usr/local}
|
|
||||||
echo "BINDIR=$prefix/bin"
|
|
||||||
|
|
||||||
for i in "$prefix/share/man/man1" "$prefix/man/man1"
|
|
||||||
do
|
|
||||||
if [ -d "$i" -a -w "$i" ]
|
|
||||||
then
|
|
||||||
echo "MAN1DIR=$i"
|
|
||||||
break;
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "all:"
|
|
|
@ -1,282 +0,0 @@
|
||||||
#!@@@perl@@@ -w
|
|
||||||
|
|
||||||
=head1 NAME
|
|
||||||
|
|
||||||
cleandir - remove unused files from directory
|
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
|
||||||
|
|
||||||
cleandir [-d days] [-n] [-m] [-v] [-s] [-i|-x regex] directory...
|
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
|
||||||
|
|
||||||
cleandir recursively searches each directory given on the commandline
|
|
||||||
for files and subdirectories which have not been accessed for n days and
|
|
||||||
deletes them. It is intended to be used on /tmp and other world-writable
|
|
||||||
directories and implements a number of checks to prevent symlink or
|
|
||||||
directory switching attacks. It also does not cross mount points.
|
|
||||||
|
|
||||||
=head1 OPTIONS
|
|
||||||
|
|
||||||
=over 4
|
|
||||||
|
|
||||||
=item B<-d days>
|
|
||||||
|
|
||||||
Delete files which have not been accessed for the given number of days.
|
|
||||||
The default is 14.
|
|
||||||
|
|
||||||
=item B<-m>
|
|
||||||
|
|
||||||
Consider only the last modification time of the file, not the last access time.
|
|
||||||
|
|
||||||
=item B<-c>
|
|
||||||
|
|
||||||
Consider only the inode change time of the file.
|
|
||||||
|
|
||||||
=item B<-n>
|
|
||||||
|
|
||||||
No-op. Don't delete any files.
|
|
||||||
|
|
||||||
=item B<-s>
|
|
||||||
|
|
||||||
Skip sockets and named pipes. Some programs (notably X11 and some
|
|
||||||
databases) create sockets and named pipes in /tmp and foolishly expect
|
|
||||||
them to survive. This option exists to humour them.
|
|
||||||
|
|
||||||
=item B<-v>
|
|
||||||
|
|
||||||
Verbose. Can be repeated to increase verbosity.
|
|
||||||
|
|
||||||
=item B<-i>|B<-x> regex
|
|
||||||
|
|
||||||
Include and exclude patterns. The filenames (not the complete path) of
|
|
||||||
all files and directories to be removed are compared against these
|
|
||||||
patterns in order. The first hit determines the action. These patterns
|
|
||||||
can also be used to override the -s option and to cross mount points.
|
|
||||||
|
|
||||||
=back
|
|
||||||
|
|
||||||
=head1 AUTHOR
|
|
||||||
|
|
||||||
Peter J. Holzer <hjp@hjp.at>. Thanks to Chris Mason for some
|
|
||||||
enhancements.
|
|
||||||
|
|
||||||
=cut
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use File::stat;
|
|
||||||
use POSIX;
|
|
||||||
use Getopt::Long;
|
|
||||||
use Pod::Usage;
|
|
||||||
use List::Util qw(max);
|
|
||||||
|
|
||||||
my $verbose = 0;
|
|
||||||
my $nop = 0;
|
|
||||||
my $skip_fifos = 0;
|
|
||||||
my $mtime_only = 0;
|
|
||||||
my $ctime_only = 0;
|
|
||||||
|
|
||||||
|
|
||||||
sub cleandir {
|
|
||||||
my ($dir, $since, $level, $inex) = (@_);
|
|
||||||
my $notremoved = 0;
|
|
||||||
|
|
||||||
if ($verbose > 1) {
|
|
||||||
print STDERR "$0:", " " x $level, " cleandir $dir $since {\n";
|
|
||||||
}
|
|
||||||
if (!opendir(DIR, ".")) {
|
|
||||||
printf STDERR "$0:", " " x $level, " cannot opendir $dir: $!";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
my $std = lstat(".");
|
|
||||||
my $fs = $std->dev;
|
|
||||||
|
|
||||||
for my $i (readdir(DIR)) {
|
|
||||||
if ($i eq "." || $i eq "..") {next}
|
|
||||||
if ($verbose > 2) {
|
|
||||||
print STDERR "$0:", " " x $level, " checking $dir/$i\n";
|
|
||||||
}
|
|
||||||
my $st = lstat("$i");
|
|
||||||
if (!defined($st)) {
|
|
||||||
# file has vanished
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
|
|
||||||
my $action = 'i';
|
|
||||||
# Skip anything on a different filesystem
|
|
||||||
if ($st->dev != $fs) {
|
|
||||||
$action = 'x';
|
|
||||||
}
|
|
||||||
|
|
||||||
# Skip sockets and pipes
|
|
||||||
if ($skip_fifos && (-p _ || -S _)) {
|
|
||||||
$action = 'x';
|
|
||||||
}
|
|
||||||
|
|
||||||
for (@$inex) {
|
|
||||||
if ($i =~ /$_->[0]/) {
|
|
||||||
$action = $_->[1];
|
|
||||||
last;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($action eq 'x') {
|
|
||||||
$notremoved++;
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($verbose > 3) {
|
|
||||||
print STDERR "$0:", " " x $level, " mtime=", $st->mtime, " atime=", $st->atime, " ctime=", $st->ctime, "\n";
|
|
||||||
}
|
|
||||||
if (-d _) {
|
|
||||||
my $cwd = getcwd();
|
|
||||||
if (chdir($i)) {
|
|
||||||
my $remaining = -1;
|
|
||||||
my $st1 = lstat(".");
|
|
||||||
if ($st->dev == $st1->dev && $st->ino == $st1->ino) {
|
|
||||||
$remaining = cleandir("$dir/$i", $since, $level+1, $inex);
|
|
||||||
} else {
|
|
||||||
print STDERR "$0:", " " x $level,
|
|
||||||
" $dir/$i changed dev/inode from ",
|
|
||||||
$st->dev, "/", $st->ino,
|
|
||||||
" to ",
|
|
||||||
$st1->dev, "/", $st1->ino,
|
|
||||||
"\n";
|
|
||||||
}
|
|
||||||
chdir($cwd);
|
|
||||||
my $std1 = lstat(".");
|
|
||||||
if (!($std->dev == $std1->dev && $std->ino == $std1->ino)) {
|
|
||||||
print STDERR "$0:", " " x $level,
|
|
||||||
" $cwd changed dev/inode from ",
|
|
||||||
$std->dev, "/", $std->ino,
|
|
||||||
" to ",
|
|
||||||
$std1->dev, "/", $std1->ino,
|
|
||||||
"\n";
|
|
||||||
return ++$notremoved;
|
|
||||||
}
|
|
||||||
my $rtime = $ctime_only ? $st->ctime : $st->mtime;
|
|
||||||
if ($remaining == 0 && $rtime < $since) {
|
|
||||||
if ($verbose > 0) {
|
|
||||||
print STDERR "$0:", " " x $level, "rmdir $dir/$i\n";
|
|
||||||
}
|
|
||||||
unless ($nop) {
|
|
||||||
if (rmdir("$i")) {next}
|
|
||||||
print STDERR "$0:", " " x $level, "rmdir $dir/$i failed: $!\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
print STDERR "$0:", " " x $level, " chdir $dir/$i failed: $!\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
my $rtime = $ctime_only ? $st->ctime :
|
|
||||||
$mtime_only ? $st->mtime :
|
|
||||||
max($st->mtime, $st->atime);
|
|
||||||
if ($rtime < $since) {
|
|
||||||
if ($verbose > 0) {
|
|
||||||
print STDERR "$0:", " " x $level, " removing $dir/$i\n";
|
|
||||||
}
|
|
||||||
unless ($nop) {
|
|
||||||
if (unlink("$i")) {next}
|
|
||||||
print STDERR "$0:", " " x $level, " removing $dir/$i failed: $!\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$notremoved++;
|
|
||||||
}
|
|
||||||
if ($verbose > 1) {
|
|
||||||
print STDERR "$0:", " " x $level, " cleandir: $notremoved }\n";
|
|
||||||
}
|
|
||||||
return $notremoved;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub main {
|
|
||||||
my $since = time() - 14 * 86400;;
|
|
||||||
my $help;
|
|
||||||
my @inex;
|
|
||||||
|
|
||||||
GetOptions('help|?' => \$help,
|
|
||||||
'days|d=f' => sub { $since = time() - $_[1] * 86400; },
|
|
||||||
'verbose|v' => sub { $verbose++ },
|
|
||||||
'nop|n' => \$nop,
|
|
||||||
'skip-fifos|s' => \$skip_fifos,
|
|
||||||
'mtime-only|m' => \$mtime_only,
|
|
||||||
'ctime-only|c' => \$ctime_only,
|
|
||||||
'include|i=s' => sub { push @inex, [ $_[1], 'i' ] },
|
|
||||||
'exclude|x=s' => sub { push @inex, [ $_[1], 'x' ] },
|
|
||||||
) or pod2usage(2);
|
|
||||||
pod2usage(1) if $help;
|
|
||||||
pod2usage(2) unless (@ARGV);
|
|
||||||
|
|
||||||
|
|
||||||
while (my $i = shift(@ARGV)) {
|
|
||||||
my $cwd = getcwd();
|
|
||||||
if (chdir($i)) {
|
|
||||||
cleandir($i, $since, 0, \@inex);
|
|
||||||
chdir($cwd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
|
|
||||||
# $Log: cleandir.pl,v $
|
|
||||||
# Revision 1.10 2012-03-02 11:29:42 hjp
|
|
||||||
# (Nov 12 2009)
|
|
||||||
# Implemented option -c Consider only the inode change time of the file.
|
|
||||||
#
|
|
||||||
# Revision 1.9 2006-08-25 09:57:10 hjp
|
|
||||||
# Added --include (-i) and --exclude (-x) options.
|
|
||||||
#
|
|
||||||
# Revision 1.8 2005/04/04 16:05:40 hjp
|
|
||||||
# Print whole directory at rmdir with verbose output.
|
|
||||||
#
|
|
||||||
# Revision 1.7 2004/11/02 09:01:12 hjp
|
|
||||||
# Critical bug fix: Empty directories were removed even with -n.
|
|
||||||
# Minor cleanup: Message "removing ..." is now the same with and without -n.
|
|
||||||
#
|
|
||||||
# Revision 1.6 2003/05/16 14:44:58 hjp
|
|
||||||
# Added -m option to synopsis.
|
|
||||||
#
|
|
||||||
# Revision 1.5 2003/05/16 13:38:25 hjp
|
|
||||||
# Included -m (mtime-only) option (CVS is nice, but only if it used).
|
|
||||||
# Improved pod a bit.
|
|
||||||
#
|
|
||||||
# Revision 1.4 2003/05/15 10:49:33 hjp
|
|
||||||
# Changed tests on skip_fifo to use _ instead of $i. The latter caused
|
|
||||||
# extra calls to stat which clobbered the state of _ which caused spurious
|
|
||||||
# errors/warnings on symlinks.
|
|
||||||
#
|
|
||||||
# Revision 1.3 2003/05/14 11:49:56 hjp
|
|
||||||
# Added yet another patch by Chris Mason.
|
|
||||||
#
|
|
||||||
# Added POD.
|
|
||||||
#
|
|
||||||
# Changed option processing to use Getopt::Long and Pod::Usage.
|
|
||||||
#
|
|
||||||
# Revision 1.2 2002/02/25 23:33:29 hjp
|
|
||||||
# Applied patch from "Chris L. Mason" <cmason@somanetworks.com> to prevent
|
|
||||||
# filesystem traversal.
|
|
||||||
#
|
|
||||||
# Return immediately if we cannot chdir back to the directory we came
|
|
||||||
# from.
|
|
||||||
#
|
|
||||||
# Revision 1.1 2001/06/25 17:55:03 hjp
|
|
||||||
# Added configure script to figure out perl location.
|
|
||||||
#
|
|
||||||
# Revision 1.4 2000/11/20 21:10:08 hjp
|
|
||||||
# Checks introduced in last version prevented deletion of unused subdirs.
|
|
||||||
# Fixed.
|
|
||||||
#
|
|
||||||
# revision 1.3
|
|
||||||
# date: 2000/09/10 16:16:41; author: hjp; state: Exp; lines: +37 -6
|
|
||||||
# Added checks to detect directory/symlink switching attacks.
|
|
||||||
# ----------------------------
|
|
||||||
# revision 1.2
|
|
||||||
# date: 1999/08/21 12:37:53; author: hjp; state: Exp; lines: +25 -13
|
|
||||||
# More levels of verbosity.
|
|
||||||
# ----------------------------
|
|
||||||
# revision 1.1
|
|
||||||
# date: 1999/07/09 21:05:26; author: hjp; state: Exp;
|
|
||||||
# Added cleandir
|
|
||||||
#
|
|
|
@ -1,34 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
echo "#!/bin/sh" > customize.$$
|
|
||||||
echo "sed \\" > customize.$$
|
|
||||||
chmod +x customize.$$
|
|
||||||
|
|
||||||
################################################################
|
|
||||||
# find a working perl:
|
|
||||||
#
|
|
||||||
for i in /usr/bin/perl /usr/local/bin/perl /usr/bin/perl5 /usr/local/bin/perl5
|
|
||||||
do
|
|
||||||
if $i -e 'exit ($] < 5.000)'
|
|
||||||
then
|
|
||||||
echo $i works
|
|
||||||
perl="$i"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [ -z "$perl" ]
|
|
||||||
then
|
|
||||||
echo could not find a working perl command, sorry.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo " -e 's,@@@perl@@@,$perl,g' \\" >> customize.$$
|
|
||||||
|
|
||||||
|
|
||||||
################################################################
|
|
||||||
# finish
|
|
||||||
# Add trailing newline and rename temp file to final name
|
|
||||||
#
|
|
||||||
echo >> customize.$$
|
|
||||||
|
|
||||||
mv customize.$$ customize
|
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
CFLAGS = -Wall -O9
|
|
||||||
all: collatz collatz2 collatz3 modf
|
|
||||||
|
|
||||||
collatz:
|
|
||||||
|
|
||||||
collatz2: collatz2.o
|
|
||||||
$(CC) -o $@ $^ -lm
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f collatz collatz2 collatz3 modf *.o core
|
|
|
@ -1,40 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
typedef int T;
|
|
||||||
#define FT "%d"
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
T i = 1;
|
|
||||||
long c_max = 0;
|
|
||||||
|
|
||||||
for(;;) {
|
|
||||||
T j = i;
|
|
||||||
long c = 0;
|
|
||||||
while (j != 1) {
|
|
||||||
if (j % 2 == 1) {
|
|
||||||
T j2 = j * 3 + 1;
|
|
||||||
if ((j2 - 1) / 3 != j) {
|
|
||||||
printf(FT " is not 3 * " FT " + 1 at starting point " FT, j2, j, i);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
j = j2;
|
|
||||||
} else {
|
|
||||||
j = j / 2;
|
|
||||||
}
|
|
||||||
c++;
|
|
||||||
}
|
|
||||||
if (c > c_max) {
|
|
||||||
printf("new longest sequence starting at " FT ": %ld steps\n", i, c);
|
|
||||||
c_max = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i + 1 > i) {
|
|
||||||
i = i + 1;
|
|
||||||
} else {
|
|
||||||
printf(FT " is not greater than " FT "\n", i + 1, i);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,49 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#define USE_DOUBLE 1
|
|
||||||
|
|
||||||
#ifdef USE_INT
|
|
||||||
typedef int T;
|
|
||||||
#define FT "%d"
|
|
||||||
#define even(x) ((x) % 2 == 0)
|
|
||||||
#elif USE_LONG
|
|
||||||
typedef long T;
|
|
||||||
#define FT "%ld"
|
|
||||||
#define even(x) ((x) % 2 == 0)
|
|
||||||
#elif USE_LONG_LONG
|
|
||||||
typedef long long T;
|
|
||||||
#define FT "%lld"
|
|
||||||
#define even(x) ((x) % 2 == 0)
|
|
||||||
#elif USE_DOUBLE
|
|
||||||
typedef double T;
|
|
||||||
#define FT "%20.1f"
|
|
||||||
#ifdef USE_FLOOR
|
|
||||||
#define even(x) (floor((x) / 2) == ((x) / 2))
|
|
||||||
#else
|
|
||||||
#define even(x) (fmod((x), 2.0) == 0.0)
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
long collatz(T j) {
|
|
||||||
|
|
||||||
long c = 0;
|
|
||||||
while (j != 1) {
|
|
||||||
printf("%ld: " FT "\n", c, j);
|
|
||||||
if (even(j)) {
|
|
||||||
j = j / 2;
|
|
||||||
} else {
|
|
||||||
j = j * 3 + 1;
|
|
||||||
}
|
|
||||||
c++;
|
|
||||||
}
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
T i = 113383;
|
|
||||||
long c = collatz(i);
|
|
||||||
printf("%ld\n", c);
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,40 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#define USE_INT 1
|
|
||||||
|
|
||||||
#ifdef USE_INT
|
|
||||||
typedef int T;
|
|
||||||
#define FT "%d"
|
|
||||||
#define odd(x) ((x) % 2 == 1)
|
|
||||||
#elif USE_LONG
|
|
||||||
typedef long T;
|
|
||||||
#define FT "%ld"
|
|
||||||
#define odd(x) ((x) % 2 == 1)
|
|
||||||
#elif USE_DOUBLE
|
|
||||||
typedef double T;
|
|
||||||
#define FT "%20g"
|
|
||||||
#define odd(x) (floor((x) / 2) != ((x) / 2))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
long collatz(T j) {
|
|
||||||
|
|
||||||
long c = 0;
|
|
||||||
while (j != 1) {
|
|
||||||
printf("%ld: " FT "\n", c, j);
|
|
||||||
if (odd(j)) {
|
|
||||||
j = j * 3 + 1;
|
|
||||||
} else {
|
|
||||||
j = j / 2;
|
|
||||||
}
|
|
||||||
c++;
|
|
||||||
}
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
T i = 113383;
|
|
||||||
long c = collatz(i);
|
|
||||||
printf("%ld\n", c);
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,15 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
double x = 3.14;
|
|
||||||
double y, z;
|
|
||||||
|
|
||||||
y = modf(x, &z);
|
|
||||||
printf("%g, %g\n", y, z);
|
|
||||||
|
|
||||||
y = modf(x, NULL);
|
|
||||||
printf("%g, %g\n", y, z);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,4 +0,0 @@
|
||||||
Ich kannte dieses Problem ursprünglich als "Ulams Vermutung".
|
|
||||||
|
|
||||||
Laut http://de.wikipedia.org/wiki/Collatz-Problem stammt es aber
|
|
||||||
ursprünglich von Lothar Collatz.
|
|
|
@ -1,22 +0,0 @@
|
||||||
include GNUmakerules
|
|
||||||
include GNUmakevars
|
|
||||||
|
|
||||||
count:
|
|
||||||
|
|
||||||
install: $(ROOT)/usr/local/bin/count
|
|
||||||
|
|
||||||
install_all:
|
|
||||||
$(MAKE) install ROOT=/nfs/wsrdb
|
|
||||||
$(MAKE) install ROOT=/nfs/wsrcom
|
|
||||||
$(MAKE) install ROOT=/nfs/wifosv
|
|
||||||
$(MAKE) install ROOT=/nfs/ihssv
|
|
||||||
$(MAKE) install ROOT=/nfs/wsrtest
|
|
||||||
|
|
||||||
$(ROOT)/usr/local/bin/%: %
|
|
||||||
$(INSTALL) $< $@
|
|
||||||
|
|
||||||
$(ROOT)/usr/local/man/man8/%.8: %.man
|
|
||||||
$(INSTALL) $< $@
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm count
|
|
|
@ -1,30 +0,0 @@
|
||||||
#include <limits.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
unsigned long start = 0;
|
|
||||||
unsigned long stop = ULONG_MAX;
|
|
||||||
unsigned long i;
|
|
||||||
|
|
||||||
switch (argc) {
|
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
stop = strtoul(argv[1], NULL, 0);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
start = strtoul(argv[1], NULL, 0);
|
|
||||||
stop = strtoul(argv[2], NULL, 0);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "Usage: %s [[start] stop]\n", argv[0]);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = start; i < stop; i++) {
|
|
||||||
printf("%ld\n", i);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
version 5.0
|
|
||||||
map! >I<yypa/O
|
|
||||||
set autoindent
|
|
||||||
set exrc
|
|
||||||
set ruler
|
|
||||||
set shiftwidth=4
|
|
|
@ -1,24 +0,0 @@
|
||||||
include GNUmakevars
|
|
||||||
|
|
||||||
all: cvsdiffmin
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm cvsdiffmin customize
|
|
||||||
|
|
||||||
install: $(BINDIR) $(BINDIR)/cvsdiffmin
|
|
||||||
|
|
||||||
%: %.pl customize
|
|
||||||
sh ./customize < $< > $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
%: %.sh customize
|
|
||||||
sh ./customize < $< > $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
customize: configure
|
|
||||||
sh ./configure
|
|
||||||
|
|
||||||
$(BINDIR):
|
|
||||||
mkdir -p $@
|
|
||||||
|
|
||||||
include GNUmakerules
|
|
|
@ -1,68 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
echo "#!/bin/sh" > customize.$$
|
|
||||||
echo "sed \\" > customize.$$
|
|
||||||
chmod +x customize.$$
|
|
||||||
|
|
||||||
################################################################
|
|
||||||
# find a working perl:
|
|
||||||
#
|
|
||||||
for i in /usr/bin/perl /usr/local/bin/perl /usr/bin/perl5 /usr/local/bin/perl5
|
|
||||||
do
|
|
||||||
if $i -e 'exit ($] < 5.000)'
|
|
||||||
then
|
|
||||||
echo $i works
|
|
||||||
perl="$i"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [ -z "$perl" ]
|
|
||||||
then
|
|
||||||
could not find a working perl command, sorry.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo " -e 's,@@@perl@@@,$perl,g' \\" >> customize.$$
|
|
||||||
|
|
||||||
|
|
||||||
################################################################
|
|
||||||
# find a diff which understands --changed-group-format
|
|
||||||
# and related options (like gnu diff)
|
|
||||||
#
|
|
||||||
echo 'a
|
|
||||||
b
|
|
||||||
c' > diff_format-test.$$.1
|
|
||||||
echo 'a
|
|
||||||
B
|
|
||||||
c' > diff_format-test.$$.2
|
|
||||||
|
|
||||||
wanted="<b
|
|
||||||
=B
|
|
||||||
>"
|
|
||||||
for i in /usr/bin/diff /usr/local/bin/diff
|
|
||||||
do
|
|
||||||
a="`$i --unchanged-group-format='' --changed-group-format='<%<=%>>' diff_format-test.$$.1 diff_format-test.$$.2`"
|
|
||||||
echo "$a"
|
|
||||||
|
|
||||||
if [ "x$a" = "x$wanted" ]
|
|
||||||
then
|
|
||||||
echo $i works
|
|
||||||
diff_format="$i"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [ -z "$diff_format" ]
|
|
||||||
then
|
|
||||||
echo could not find a working diff_format command, sorry.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo " -e 's,@@@diff_format@@@,$diff_format,g' \\" >> customize.$$
|
|
||||||
rm diff_format-test.$$.?
|
|
||||||
|
|
||||||
|
|
||||||
################################################################
|
|
||||||
# finish
|
|
||||||
# Add trailing newline and rename temp file to final name
|
|
||||||
#
|
|
||||||
echo >> customize.$$
|
|
||||||
|
|
||||||
mv customize.$$ customize
|
|
||||||
|
|
|
@ -1,69 +0,0 @@
|
||||||
#!@@@perl@@@ -w
|
|
||||||
#
|
|
||||||
# $Id: cvsdiffmin.pl,v 1.3 2000-02-08 17:21:38 hjp Exp $
|
|
||||||
#
|
|
||||||
# cvsdiffmin - minimize output of cvs diff
|
|
||||||
#
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
use File::Slurp;
|
|
||||||
|
|
||||||
my $diff = "@@@diff_format@@@";
|
|
||||||
|
|
||||||
my $state = 'EQ';
|
|
||||||
my %text = ();
|
|
||||||
my %cap = ();
|
|
||||||
my $count = 0;
|
|
||||||
|
|
||||||
local $| = 1;
|
|
||||||
|
|
||||||
while (<>) {
|
|
||||||
|
|
||||||
if ($state eq 'EQ' && /^\<{7} /) {
|
|
||||||
$state = 'V1';
|
|
||||||
$text{$state} = "";
|
|
||||||
s/'/_/g;
|
|
||||||
$cap{$state} = $_;
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
if ($state eq 'V1' && /^\={7}$/) {
|
|
||||||
$state = 'V2';
|
|
||||||
$text{$state} = "";
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
if ($state eq 'V2' && /^\>{7} /) {
|
|
||||||
s/'/_/g;
|
|
||||||
$cap{$state} = $_;
|
|
||||||
write_file("cvsdiffmin.$$.$count.1", $text{V1});
|
|
||||||
write_file("cvsdiffmin.$$.$count.2", $text{V2});
|
|
||||||
open (DIFF,
|
|
||||||
"$diff " .
|
|
||||||
" --unchanged-group-format='\%='" .
|
|
||||||
" --changed-group-format='${cap{V1}}\%<=======\n\%>${cap{V2}}'" .
|
|
||||||
" --old-group-format='${cap{V1}}\%<=======\n\%>${cap{V2}}'" .
|
|
||||||
" --new-group-format='${cap{V1}}\%<=======\n\%>${cap{V2}}'" .
|
|
||||||
" cvsdiffmin.$$.$count.1" .
|
|
||||||
" cvsdiffmin.$$.$count.2" .
|
|
||||||
"|") or die "cannot invoke diff: $!";
|
|
||||||
while (<DIFF>) {
|
|
||||||
print;
|
|
||||||
}
|
|
||||||
close(DIFF);
|
|
||||||
unlink ("cvsdiffmin.$$.$count.1", "cvsdiffmin.$$.$count.2")
|
|
||||||
or die "cannot unlink temporary files cvsdiffmin.$$.$count.1, cvsdiffmin.$$.$count.2: $!";
|
|
||||||
|
|
||||||
|
|
||||||
$state = 'EQ';
|
|
||||||
$count++;
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
if ($state eq 'EQ') {
|
|
||||||
print;
|
|
||||||
} else {
|
|
||||||
$text{$state} .= $_;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
# vim:sw=4
|
|
|
@ -1,38 +0,0 @@
|
||||||
include GNUmakevars
|
|
||||||
|
|
||||||
CONFDIR=../../configure
|
|
||||||
CONFDIR_exists=$(shell [ -d $(CONFDIR) ] && echo ok)
|
|
||||||
|
|
||||||
all: configure find_cvs_not_up_to_date
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f find_cvs_not_up_to_date customize
|
|
||||||
|
|
||||||
distclean: clean
|
|
||||||
|
|
||||||
|
|
||||||
install: $(BINDIR) $(BINDIR)/find_cvs_not_up_to_date
|
|
||||||
|
|
||||||
%: %.pl customize
|
|
||||||
sh ./customize < $< > $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
%: %.sh customize
|
|
||||||
sh ./customize < $< > $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
customize: configure
|
|
||||||
sh ./configure
|
|
||||||
|
|
||||||
ifeq ($(CONFDIR_exists),ok)
|
|
||||||
|
|
||||||
configure: $(CONFDIR)/start $(CONFDIR)/perl $(CONFDIR)/finish
|
|
||||||
cat $^ > $@
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
$(BINDIR):
|
|
||||||
mkdir -p $@
|
|
||||||
|
|
||||||
include GNUmakerules
|
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
echo "#!/bin/sh" > customize.$$
|
|
||||||
echo "sed \\" > customize.$$
|
|
||||||
chmod +x customize.$$
|
|
||||||
|
|
||||||
################################################################
|
|
||||||
# find a working perl:
|
|
||||||
#
|
|
||||||
for i in /usr/bin/perl /usr/local/bin/perl /usr/bin/perl5 /usr/local/bin/perl5
|
|
||||||
do
|
|
||||||
if $i -e 'exit ($] < 5.000)'
|
|
||||||
then
|
|
||||||
echo $i works
|
|
||||||
perl="$i"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [ -z "$perl" ]
|
|
||||||
then
|
|
||||||
could not find a working perl command, sorry.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo " -e 's,@@@perl@@@,$perl,g' \\" >> customize.$$
|
|
||||||
|
|
||||||
|
|
||||||
################################################################
|
|
||||||
# finish
|
|
||||||
# Add trailing newline and rename temp file to final name
|
|
||||||
#
|
|
||||||
echo >> customize.$$
|
|
||||||
|
|
||||||
mv customize.$$ customize
|
|
||||||
|
|
|
@ -1,28 +0,0 @@
|
||||||
#!@@@perl@@@ -w
|
|
||||||
use strict;
|
|
||||||
use File::Find;
|
|
||||||
use Getopt::Long;
|
|
||||||
|
|
||||||
my $debug = 0;
|
|
||||||
|
|
||||||
sub check_cvs {
|
|
||||||
local $/ =
|
|
||||||
"===================================================================\n";
|
|
||||||
return unless (-d "$_/CVS");
|
|
||||||
print STDERR "checking $File::Find::dir/$_\n" if ($debug);
|
|
||||||
|
|
||||||
# $_ is a CVS working dir
|
|
||||||
|
|
||||||
open (CVSSTATUS, "cd $_ && cvs -q status|");
|
|
||||||
while(<CVSSTATUS>) {
|
|
||||||
print if (/Status/ && !/Status: Up-to-date/);
|
|
||||||
}
|
|
||||||
close(CVSSTATUS);
|
|
||||||
|
|
||||||
# don't recurse, cvs already did:
|
|
||||||
$File::Find::prune = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
GetOptions("debug" => \$debug);
|
|
||||||
@ARGV = (".") unless (@ARGV);
|
|
||||||
find(\&check_cvs, @ARGV);
|
|
177
dbi/dumpsql
177
dbi/dumpsql
|
@ -1,177 +0,0 @@
|
||||||
#!/usr/bin/perl
|
|
||||||
|
|
||||||
=head1 NAME
|
|
||||||
|
|
||||||
dumpsql - dump output of an SQL query
|
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
|
||||||
|
|
||||||
dumpsql
|
|
||||||
[ --vertical
|
|
||||||
[ --escape ]
|
|
||||||
|
|
|
||||||
--xhtml
|
|
||||||
[ --style uri ]
|
|
||||||
]
|
|
||||||
query
|
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
|
||||||
|
|
||||||
Connects to the database identified by the environment variable
|
|
||||||
DBI_CREDENTIAL_FILE, executes the query given on the command line and
|
|
||||||
prints the output to stdout.
|
|
||||||
|
|
||||||
By default the output is tab-separated. Two alternate formats are
|
|
||||||
available:
|
|
||||||
|
|
||||||
--vertical prints each field in a separate line in "Columnname: Value"
|
|
||||||
format. Rows are separated by empty lines. --Escape escapes unprintable
|
|
||||||
characters.
|
|
||||||
|
|
||||||
--xhtml prints the table as an XHTML file. Optionally a style sheet can
|
|
||||||
be specified with --style.
|
|
||||||
|
|
||||||
=head1 BUGS
|
|
||||||
|
|
||||||
The --escape option only works with --vertical. It should also work with
|
|
||||||
the other two styles.
|
|
||||||
|
|
||||||
=cut
|
|
||||||
|
|
||||||
use warnings;
|
|
||||||
use strict;
|
|
||||||
use DBI;
|
|
||||||
use Getopt::Long;
|
|
||||||
use Encode qw(:fallbacks encode);
|
|
||||||
use I18N::Langinfo qw(langinfo CODESET);
|
|
||||||
use Pod::Usage;
|
|
||||||
|
|
||||||
my $charset = langinfo(CODESET);
|
|
||||||
binmode STDOUT, "encoding($charset)";
|
|
||||||
|
|
||||||
|
|
||||||
my $help;
|
|
||||||
my $vertical; # use vertical output format
|
|
||||||
my $escape; # escape non-printable characters
|
|
||||||
my $xhtml; # produce XHTML output
|
|
||||||
my $style; # produce XHTML output
|
|
||||||
|
|
||||||
GetOptions(
|
|
||||||
'help|?' => \$help,
|
|
||||||
'vertical' => \$vertical,
|
|
||||||
'xhtml' => \$xhtml,
|
|
||||||
'escape' => \$escape,
|
|
||||||
'style:s' => \$style,
|
|
||||||
) || pod2usage(2);
|
|
||||||
pod2usage(1) if $help;
|
|
||||||
|
|
||||||
|
|
||||||
# read credits from file
|
|
||||||
sub _read_cred {
|
|
||||||
my ($fn) = @_;
|
|
||||||
|
|
||||||
open(FN, "<$fn") or die "cannot open $fn: $!";
|
|
||||||
my $line = <FN>;
|
|
||||||
close(FN);
|
|
||||||
my @cred = split(/\s+/, $line);
|
|
||||||
return @cred;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
my $dbh;
|
|
||||||
|
|
||||||
sub dbiconnect {
|
|
||||||
my $cred_file = $ENV{DBI_CREDENTIAL_FILE};
|
|
||||||
if (! defined($cred_file)) {
|
|
||||||
$cred_file = "$ENV{HOME}/.dbi/default";
|
|
||||||
} elsif ($cred_file !~ m{/}) {
|
|
||||||
$cred_file = "$ENV{HOME}/.dbi/$cred_file";
|
|
||||||
}
|
|
||||||
|
|
||||||
$dbh = DBI->connect(_read_cred($cred_file), {RaiseError => 1, AutoCommit => 0});
|
|
||||||
|
|
||||||
my $driver = $dbh->{Driver}->{Name};
|
|
||||||
if ($driver eq 'Pg') {
|
|
||||||
$dbh->{pg_enable_utf8} = 1;
|
|
||||||
}
|
|
||||||
return $dbh;
|
|
||||||
}
|
|
||||||
|
|
||||||
$dbh = dbiconnect();
|
|
||||||
$dbh->{LongReadLen} = 0x1_0000;
|
|
||||||
|
|
||||||
my $query = shift(@ARGV);
|
|
||||||
my @args = @ARGV;
|
|
||||||
my $sth = $dbh->prepare($query);
|
|
||||||
$sth->execute(@args);
|
|
||||||
if ($xhtml) {
|
|
||||||
print qq{<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n};
|
|
||||||
print qq{<html>\n};
|
|
||||||
print qq{<head>\n};
|
|
||||||
print qq{<title>}, xmlencode($query), qq{</title>\n};
|
|
||||||
if ($style) {
|
|
||||||
print qq{<link rel='stylesheet' type='text/css' href='},
|
|
||||||
xmlencode($style),
|
|
||||||
qq{'/>\n};
|
|
||||||
}
|
|
||||||
print qq{</head>\n};
|
|
||||||
print qq{<head>\n};
|
|
||||||
print qq{<body>\n};
|
|
||||||
print qq{<h1>}, xmlencode($query), qq{</h1>\n};
|
|
||||||
if (@args) {
|
|
||||||
print qq{<ul>\n};
|
|
||||||
for (@args) {
|
|
||||||
print qq{<li>}, xmlencode($_), qq{</li>\n};
|
|
||||||
}
|
|
||||||
print qq{</ul>\n};
|
|
||||||
}
|
|
||||||
print qq{<table>\n};
|
|
||||||
print qq{<tr>},
|
|
||||||
(
|
|
||||||
map {
|
|
||||||
"<th>" . xmlencode($_) . "</th>"
|
|
||||||
} @{$sth->{NAME}}
|
|
||||||
),
|
|
||||||
"</tr>\n";
|
|
||||||
while (my @a = $sth->fetchrow_array()) {
|
|
||||||
print qq{<tr>},
|
|
||||||
(
|
|
||||||
map {
|
|
||||||
"<td>"
|
|
||||||
. (defined($_) ? xmlencode($_) : '<em>NULL</em>')
|
|
||||||
. "</td>"
|
|
||||||
} @a
|
|
||||||
),
|
|
||||||
"</tr>\n";
|
|
||||||
}
|
|
||||||
print qq{</table>\n};
|
|
||||||
print qq{</body>\n};
|
|
||||||
print qq{</html>\n};
|
|
||||||
} elsif ($vertical) {
|
|
||||||
while (my @a = $sth->fetchrow_array()) {
|
|
||||||
for my $i (0 .. $#a) {
|
|
||||||
print $sth->{NAME}[$i], ": ";
|
|
||||||
if ($escape) {
|
|
||||||
if (defined($a[$i])) {
|
|
||||||
print encode("us-ascii", $a[$i], FB_PERLQQ), "\n";
|
|
||||||
} else {
|
|
||||||
print "NULL\n";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
print $a[$i] // "NULL", "\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print "\n";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
no warnings 'uninitialized';
|
|
||||||
print join("\t", @{$sth->{NAME}}), "\n";
|
|
||||||
while (my @a = $sth->fetchrow_array()) {
|
|
||||||
print join("\t", @a), "\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub xmlencode {
|
|
||||||
my ($s) = @_;
|
|
||||||
return encode("us-ascii", $s, FB_XMLCREF);
|
|
||||||
}
|
|
|
@ -1,40 +0,0 @@
|
||||||
# $Id: GNUmakefile,v 1.4 2002-03-18 20:49:54 hjp Exp $
|
|
||||||
|
|
||||||
include GNUmakevars
|
|
||||||
|
|
||||||
ddm: ddm.o
|
|
||||||
$(CC) $^ $(ANTLIB) -o $@
|
|
||||||
|
|
||||||
ddm.o: ddm.c
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f ddm ddm.o
|
|
||||||
|
|
||||||
distclean: clean
|
|
||||||
rm -f cfg/mnttab.h
|
|
||||||
|
|
||||||
install: $(SBINDIR)/ddm
|
|
||||||
|
|
||||||
cfg/%.h: cfg/%.sh
|
|
||||||
sh $< > $@
|
|
||||||
|
|
||||||
include GNUmakerules
|
|
||||||
|
|
||||||
-include ddm.d
|
|
||||||
|
|
||||||
# $Log: GNUmakefile,v $
|
|
||||||
# Revision 1.4 2002-03-18 20:49:54 hjp
|
|
||||||
# Added target distclean
|
|
||||||
#
|
|
||||||
# Revision 1.3 2000/06/04 16:33:20 hjp
|
|
||||||
# Removed MNTTAB autodetection again as it seems to be already defined.
|
|
||||||
# Don't skip rest of mountpoints if one is not accessible.
|
|
||||||
# chdir to / while sleeping to avoid blocking automounters
|
|
||||||
# increased default sleep interval to 1 hour max.
|
|
||||||
#
|
|
||||||
# Revision 1.2 2000/06/04 16:11:12 hjp
|
|
||||||
# Added autodetection of /etc/m(nt)?tab.
|
|
||||||
#
|
|
||||||
# Revision 1.1 2000/06/04 15:53:18 hjp
|
|
||||||
# Pre-Version. Options are still missing.
|
|
||||||
#
|
|
|
@ -1,10 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
for i in /etc/mnttab /etc/mtab
|
|
||||||
do
|
|
||||||
if [ -f $i ]
|
|
||||||
then
|
|
||||||
echo '#define PATH_MNTTAB "'$i'"'
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
exit 1
|
|
231
ddm/ddm.c
231
ddm/ddm.c
|
@ -1,231 +0,0 @@
|
||||||
char ddm_c_rcs_id[] =
|
|
||||||
"$Id: ddm.c,v 1.6 2001-02-21 16:02:46 hjp Exp $";
|
|
||||||
/*
|
|
||||||
* ddm - disk delay monitor
|
|
||||||
*
|
|
||||||
* chdirs to a list of filesystems (mount points by default) and does
|
|
||||||
* the equivalent of an ls -l.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <mntent.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include <ant/da.h>
|
|
||||||
#include <ant/io.h>
|
|
||||||
#include <ant/globals.h>
|
|
||||||
|
|
||||||
#include "cfg/mnttab.h"
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum { MODE_NONE, MODE_ARGS, MODE_MNTTAB, MODE_DIRFILE } modeT;
|
|
||||||
|
|
||||||
|
|
||||||
static double gettimestamp(void) {
|
|
||||||
struct timeval tm;
|
|
||||||
|
|
||||||
gettimeofday(&tm, NULL);
|
|
||||||
return tm.tv_sec + tm.tv_usec/1E6;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usage(void) {
|
|
||||||
fprintf(stderr, "Usage: %s [-d dirfile | -m mnttab | directory ... ] [-s max_sleep_time]\n",
|
|
||||||
cmnd);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void printtimestamp (const char *fmt, ...) {
|
|
||||||
static double lts = 0;
|
|
||||||
double ts = gettimestamp();
|
|
||||||
va_list ap;
|
|
||||||
|
|
||||||
fprintf(stderr, "%s: %.6f: %.6f: ", cmnd, ts, ts - lts);
|
|
||||||
va_start(ap, fmt);
|
|
||||||
vfprintf(stderr, fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
lts = ts;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char**argv) {
|
|
||||||
char **dirs = NULL;
|
|
||||||
modeT mode = MODE_NONE;
|
|
||||||
int nr_dirs;
|
|
||||||
int c;
|
|
||||||
char *filename = NULL;
|
|
||||||
double maxsleeptime = 3600;
|
|
||||||
|
|
||||||
cmnd = argv[0];
|
|
||||||
|
|
||||||
while ((c = getopt(argc, argv, "d:m:s:")) != EOF) {
|
|
||||||
switch (c) {
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
case 'd':
|
|
||||||
mode = MODE_DIRFILE;
|
|
||||||
filename = optarg;
|
|
||||||
break;
|
|
||||||
case 'm':
|
|
||||||
mode = MODE_MNTTAB;
|
|
||||||
filename = optarg;
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
maxsleeptime = strtod(optarg, &p);
|
|
||||||
if (p == optarg || *p) usage();
|
|
||||||
break;
|
|
||||||
case '?':
|
|
||||||
usage();
|
|
||||||
default:
|
|
||||||
assert(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mode == MODE_NONE) {
|
|
||||||
if (optind == argc) {
|
|
||||||
mode = MODE_MNTTAB;
|
|
||||||
filename = PATH_MNTTAB;
|
|
||||||
} else {
|
|
||||||
mode = MODE_ARGS;
|
|
||||||
dirs = argv + optind;
|
|
||||||
nr_dirs = argc - optind;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (optind != argc) usage();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
srand(time(NULL));
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
int i;
|
|
||||||
int sleeptime;
|
|
||||||
|
|
||||||
/* Get list of directories
|
|
||||||
*/
|
|
||||||
switch (mode) {
|
|
||||||
case MODE_MNTTAB: {
|
|
||||||
FILE *mtp;
|
|
||||||
struct mntent *me;
|
|
||||||
|
|
||||||
printtimestamp("open %s\n", filename);
|
|
||||||
if ((mtp = setmntent(filename, "r")) == NULL) {
|
|
||||||
fprintf(stderr, "%s: cannot open %s: %s\n",
|
|
||||||
argv[0], filename, strerror(errno));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
for (i = 0;(me = getmntent(mtp)); i++) {
|
|
||||||
DA_MKIND_INI(dirs, i, NULL);
|
|
||||||
if (dirs[i]) free(dirs[i]);
|
|
||||||
dirs[i] = strdup(me->mnt_dir);
|
|
||||||
printtimestamp("mountpoint %s\n", dirs[i]);
|
|
||||||
}
|
|
||||||
endmntent(mtp);
|
|
||||||
|
|
||||||
nr_dirs = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MODE_DIRFILE: {
|
|
||||||
FILE *fp;
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
printtimestamp("open %s\n", filename);
|
|
||||||
fp = efopen(filename, "r");
|
|
||||||
for (i = 0;(p = getline(fp)); i++) {
|
|
||||||
DA_MKIND_INI(dirs, i, NULL);
|
|
||||||
if (dirs[i]) free(dirs[i]);
|
|
||||||
dirs[i] = strdup(p);
|
|
||||||
printtimestamp("directory %s\n", dirs[i]);
|
|
||||||
}
|
|
||||||
efclose(fp);
|
|
||||||
|
|
||||||
nr_dirs = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MODE_ARGS:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Now read them
|
|
||||||
*/
|
|
||||||
for (i = 0; i < nr_dirs; i++) {
|
|
||||||
int j;
|
|
||||||
char **entries = NULL;
|
|
||||||
int nr_entries;
|
|
||||||
DIR *dp;
|
|
||||||
struct dirent *de;
|
|
||||||
|
|
||||||
printtimestamp("start %s\n", dirs[i]);
|
|
||||||
if (chdir(dirs[i]) == -1) {
|
|
||||||
printtimestamp("chdir %s failed: %s\n", dirs[i], strerror(errno));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
printtimestamp("chdir %s ok\n", dirs[i]);
|
|
||||||
|
|
||||||
if ((dp = opendir(".")) == NULL) {
|
|
||||||
printtimestamp("opendir %s failed: %s\n", dirs[i], strerror(errno));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for (j = 0;(de = readdir(dp)); j++) {
|
|
||||||
DA_MKIND_INI(entries, j, NULL);
|
|
||||||
if (entries[j]) free(entries[j]);
|
|
||||||
entries[j] = strdup(de->d_name);
|
|
||||||
printtimestamp("entry %s\n", entries[j]);
|
|
||||||
}
|
|
||||||
closedir(dp);
|
|
||||||
nr_entries = j;
|
|
||||||
|
|
||||||
for (j = 0; j < nr_entries; j++) {
|
|
||||||
struct stat st;
|
|
||||||
stat (entries[j], &st);
|
|
||||||
printtimestamp("stat entry %s\n", entries[j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
chdir("/");
|
|
||||||
|
|
||||||
sleeptime = rand() * maxsleeptime / RAND_MAX;
|
|
||||||
printtimestamp("sleeping %d seconds\n", sleeptime);
|
|
||||||
sleep(sleeptime);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* $Log: ddm.c,v $
|
|
||||||
* Revision 1.6 2001-02-21 16:02:46 hjp
|
|
||||||
* Added config test for mnttab again.
|
|
||||||
* Added option -s (max sleep time)
|
|
||||||
* Added script stats.sh to generate stats.
|
|
||||||
*
|
|
||||||
* Revision 1.5 2000/09/07 10:12:35 hjp
|
|
||||||
* Added alternate ways to specify directories to be monitored.
|
|
||||||
*
|
|
||||||
* Revision 1.4 2000/06/04 16:33:21 hjp
|
|
||||||
* Removed MNTTAB autodetection again as it seems to be already defined.
|
|
||||||
* Don't skip rest of mountpoints if one is not accessible.
|
|
||||||
* chdir to / while sleeping to avoid blocking automounters
|
|
||||||
* increased default sleep interval to 1 hour max.
|
|
||||||
*
|
|
||||||
* Revision 1.3 2000/06/04 16:19:00 hjp
|
|
||||||
* Fixed order of args in fprintf (segfault).
|
|
||||||
*
|
|
||||||
* Revision 1.2 2000/06/04 16:11:12 hjp
|
|
||||||
* Added autodetection of /etc/m(nt)?tab.
|
|
||||||
*
|
|
||||||
* Revision 1.1 2000/06/04 15:53:19 hjp
|
|
||||||
* Pre-Version. Options are still missing.
|
|
||||||
*
|
|
||||||
*/
|
|
|
@ -1,7 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# simple statistics (min, avg, max) for ddm output
|
|
||||||
|
|
||||||
awk -F : '{ n[$4] ++; s[$4] += $3; if ($3 < min[$4]) min[$4] = $3; if ($3 > max[$4]) max[$4] = $3; }
|
|
||||||
END { for (i in n) { printf "%10.6f %10.6f %10.6f %s\n", min[i], s[i]/n[i], max[i], i } }' "$@" | sort -n +2
|
|
||||||
|
|
|
@ -1,42 +0,0 @@
|
||||||
include GNUmakevars
|
|
||||||
|
|
||||||
all: gethostbyaddr gethostbyname fqdn query check
|
|
||||||
install: \
|
|
||||||
$(BINDIR)/axfr \
|
|
||||||
$(BINDIR)/fqdn \
|
|
||||||
$(BINDIR)/gethostbyaddr \
|
|
||||||
$(BINDIR)/gethostbyname \
|
|
||||||
$(BINDIR)/minnet \
|
|
||||||
$(BINDIR)/query \
|
|
||||||
$(BINDIR)/dns-inc-serial \
|
|
||||||
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.bak *.o core gethostbyaddr gethostbyname fqdn check
|
|
||||||
|
|
||||||
distclean: clean
|
|
||||||
rm -f *.d GNUmakevars GNUmakerules
|
|
||||||
|
|
||||||
cfg/%:
|
|
||||||
$(MAKE) -C cfg all
|
|
||||||
|
|
||||||
gethostbyname: gethostbyname.o hstrerror.o
|
|
||||||
|
|
||||||
fqdn: fqdn.o hstrerror.o
|
|
||||||
|
|
||||||
hstrerror.o: cfg/have_hstrerror.h
|
|
||||||
|
|
||||||
axfr:
|
|
||||||
|
|
||||||
%: %.pl
|
|
||||||
cp $< $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
GNUmakevars: GNUmakevars.sh
|
|
||||||
sh ./$^ > $@
|
|
||||||
GNUmakerules: GNUmakerules.sh
|
|
||||||
sh ./$^ > $@
|
|
||||||
|
|
||||||
include GNUmakerules
|
|
||||||
|
|
||||||
-include *.d
|
|
|
@ -1,3 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
echo "\$(BINDIR)/%: %"
|
|
||||||
echo "\tcp \$^ \$@"
|
|
|
@ -1,5 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
prefix=${prefix:-/usr/local}
|
|
||||||
echo "BINDIR=$prefix/bin"
|
|
||||||
echo
|
|
||||||
echo "all:"
|
|
21
dns/axfr.pl
21
dns/axfr.pl
|
@ -1,21 +0,0 @@
|
||||||
#!/usr/bin/perl -w
|
|
||||||
use strict;
|
|
||||||
use Net::DNS;
|
|
||||||
|
|
||||||
sub usage {
|
|
||||||
print STDERR "Usage: $0 zone nameserver\n" unless (@ARGV == 2);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
usage() unless (@ARGV == 2);
|
|
||||||
|
|
||||||
my $res = new Net::DNS::Resolver;
|
|
||||||
$res->nameservers($ARGV[1]);
|
|
||||||
my @zone = $res->axfr($ARGV[0]);
|
|
||||||
if (@zone) {
|
|
||||||
foreach my $rr (@zone) {
|
|
||||||
$rr->print;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
print STDERR "query failed: ", $res->errorstring, "\n";
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
all: have_hstrerror.h
|
|
||||||
|
|
||||||
%.h: %.sh
|
|
||||||
CC='$(CC)' CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)' sh $^ > $@
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm *.h
|
|
|
@ -1,11 +0,0 @@
|
||||||
cat > has_hstrerror_$$.c <<EOF
|
|
||||||
#include <netdb.h>
|
|
||||||
int main(void) { hstrerror(0); }
|
|
||||||
EOF
|
|
||||||
if $CC $CFLAGS has_hstrerror_$$.c $LDFLAGS -o has_hstrerror_$$
|
|
||||||
then
|
|
||||||
echo '#define HAVE_HSTRERROR 1'
|
|
||||||
else
|
|
||||||
echo '#define HAVE_HSTRERROR 0'
|
|
||||||
fi
|
|
||||||
rm has_hstrerror_$$.c has_hstrerror_$$
|
|
|
@ -1,68 +0,0 @@
|
||||||
#!/usr/bin/perl -w
|
|
||||||
use strict;
|
|
||||||
use Net::DNS;
|
|
||||||
|
|
||||||
sub usage {
|
|
||||||
print STDERR "Usage: $0 ip-address\n";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
usage() unless (@ARGV == 1);
|
|
||||||
|
|
||||||
# generic resolver
|
|
||||||
my $res0 = new Net::DNS::Resolver;
|
|
||||||
|
|
||||||
my $ipv4 = $ARGV[0];
|
|
||||||
|
|
||||||
my $rev_domain = join(".", reverse (split(/\./, $ipv4)), "in-addr", "arpa");
|
|
||||||
print STDERR "$rev_domain\n";
|
|
||||||
|
|
||||||
my $reply = $res0->send($rev_domain, 'PTR');
|
|
||||||
|
|
||||||
if ($reply->answer) {
|
|
||||||
for my $rr ($reply->answer) {
|
|
||||||
if ($rr->type eq 'PTR') {
|
|
||||||
print STDERR "\t", $rr->ptrdname, "\n";
|
|
||||||
check_a($rr->ptrdname, $ipv4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} elsif ($reply->authority) {
|
|
||||||
for my $rr ($reply->authority) {
|
|
||||||
if ($rr->type eq 'SOA') {
|
|
||||||
print STDERR "\t", $rr->mname, "\n";
|
|
||||||
my $res1 = Net::DNS::Resolver->new();
|
|
||||||
$res1->nameservers($rr->mname);
|
|
||||||
my @zone = $res1->axfr($rev_domain);
|
|
||||||
for my $rr (@zone) {
|
|
||||||
if ($rr->type eq 'PTR') {
|
|
||||||
print STDERR "\t\t", $rr->ptrdname, "\n";
|
|
||||||
my $ipv4 = join(".", (reverse(split(/\./, $rr->name)))[2..5]);
|
|
||||||
check_a($rr->ptrdname, $ipv4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$reply->print
|
|
||||||
}
|
|
||||||
|
|
||||||
sub check_a {
|
|
||||||
my ($domain_name, $a) = @_;
|
|
||||||
# check that $domain_name resolves to $a
|
|
||||||
|
|
||||||
my $reply = $res0->send($domain_name, 'A');
|
|
||||||
|
|
||||||
if ($reply->answer) {
|
|
||||||
for my $rr ($reply->answer) {
|
|
||||||
if ($rr->type eq 'A') {
|
|
||||||
print STDERR "\t\t", $rr->address, "\n";
|
|
||||||
if ($rr->address eq $a) {
|
|
||||||
print STDERR "\t\t\tfound\n";
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print " $a $domain_name FWD_FAIL\n";
|
|
||||||
return 0;
|
|
||||||
}
|
|
317
dns/check.pl
317
dns/check.pl
|
@ -1,317 +0,0 @@
|
||||||
#!/usr/bin/perl
|
|
||||||
use warnings;
|
|
||||||
use strict;
|
|
||||||
use Net::DNS;
|
|
||||||
|
|
||||||
sub usage {
|
|
||||||
print STDERR "Usage: $0 domainname-or-ip-address\n";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
my $verbose;
|
|
||||||
|
|
||||||
if (($ARGV[0] || '') eq '-v') {
|
|
||||||
$verbose = 1;
|
|
||||||
shift @ARGV;
|
|
||||||
}
|
|
||||||
|
|
||||||
usage() unless (@ARGV == 1);
|
|
||||||
|
|
||||||
# generic resolver
|
|
||||||
my $res0 = new Net::DNS::Resolver;
|
|
||||||
|
|
||||||
# special resolver to query specific nameservers
|
|
||||||
my $res1 = new Net::DNS::Resolver;
|
|
||||||
my $zone;
|
|
||||||
if ($ARGV[0] =~ m/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) {
|
|
||||||
check_ptr($ARGV[0]);
|
|
||||||
} else {
|
|
||||||
check_a($ARGV[0]);
|
|
||||||
}
|
|
||||||
check_zone($ARGV[0]) if ($zone);
|
|
||||||
|
|
||||||
exit 0;
|
|
||||||
|
|
||||||
my %addr_to_name;
|
|
||||||
my %name_to_addr;
|
|
||||||
|
|
||||||
sub check_ptr {
|
|
||||||
my ($addr, $name) = @_;
|
|
||||||
|
|
||||||
my @names;
|
|
||||||
if (defined $addr_to_name{$addr}) {
|
|
||||||
@names = @{ $addr_to_name{$addr} };
|
|
||||||
} else {
|
|
||||||
# XXX - ipv6?
|
|
||||||
my $q = join('.', reverse (split(/\./, $addr)), "in-addr", "arpa");
|
|
||||||
my $reply = $res0->send($q, 'PTR');
|
|
||||||
for my $ans ($reply->answer) {
|
|
||||||
if ($ans->type eq 'PTR') {
|
|
||||||
push @names, $ans->ptrdname;
|
|
||||||
} else {
|
|
||||||
die "cannot happen";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (@names == 0) {
|
|
||||||
print "[$addr] $q has no PTR record\n";
|
|
||||||
}
|
|
||||||
$addr_to_name{$addr} = \@names;
|
|
||||||
get_zone($reply) unless $zone;
|
|
||||||
}
|
|
||||||
if ($name) {
|
|
||||||
unless (grep { $_ eq $name } @names) {
|
|
||||||
print "$name not found in PTR records of [$addr]\n";
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for my $name (@names) {
|
|
||||||
print "I: [$addr] -> $name\n" if $verbose;
|
|
||||||
check_a($name, $addr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub check_a {
|
|
||||||
my ($name, $addr) = @_;
|
|
||||||
|
|
||||||
my @addrs;
|
|
||||||
if (defined $name_to_addr{$name}) {
|
|
||||||
@addrs = @{ $name_to_addr{$name} };
|
|
||||||
} else {
|
|
||||||
my $reply = $res0->send($name, 'A');
|
|
||||||
for my $ans ($reply->answer) {
|
|
||||||
if ($ans->type eq 'A') {
|
|
||||||
push @addrs, $ans->address;
|
|
||||||
} elsif ($ans->type eq 'CNAME') {
|
|
||||||
die "cnames not yet supported";
|
|
||||||
} else {
|
|
||||||
print "unexpected response to A query for $name\n";
|
|
||||||
$ans->print;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (@addrs == 0) {
|
|
||||||
print "$name has no A record\n";
|
|
||||||
}
|
|
||||||
$name_to_addr{$name} = \@addrs;
|
|
||||||
get_zone($reply) unless $zone;
|
|
||||||
}
|
|
||||||
if ($addr) {
|
|
||||||
unless (grep { $_ eq $addr } @addrs) {
|
|
||||||
print "[$addr] not found in A records of $name\n";
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for my $addr (@addrs) {
|
|
||||||
print "I: $name -> [$addr]\n" if $verbose;
|
|
||||||
check_ptr($addr, $name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub get_zone {
|
|
||||||
my ($reply) = @_;
|
|
||||||
|
|
||||||
for my $auth ($reply->authority) {
|
|
||||||
if (defined $zone) {
|
|
||||||
if ($zone ne $auth->name) {
|
|
||||||
print "inconsistent authority RRs:\n";
|
|
||||||
print $auth->print;
|
|
||||||
print "doesn't match previously found zone $zone\n";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$zone = $auth->name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub check_zone {
|
|
||||||
my ($name) = @_;
|
|
||||||
|
|
||||||
my $rootns = chr(rand(13) + 65) . ".root-servers.net.";
|
|
||||||
my $reply = $res0->send($rootns, 'A');
|
|
||||||
my @ns = (($reply->answer)[0]->address);
|
|
||||||
my %authns;
|
|
||||||
my %seen;
|
|
||||||
while (@ns) {
|
|
||||||
my $ns = shift (@ns);
|
|
||||||
$res1->nameservers($ns);
|
|
||||||
my $reply = $res1->send($zone, 'NS');
|
|
||||||
|
|
||||||
# if the reply contains a non-empty answer section, use it as
|
|
||||||
# a list of authoritative name servers.
|
|
||||||
if ($reply->answer) {
|
|
||||||
for my $rr ($reply->answer) {
|
|
||||||
if ($rr->type eq 'NS') {
|
|
||||||
print STDERR "$ns reported NS ", $rr->nsdname, "\n";;
|
|
||||||
|
|
||||||
$authns{$ns}{$rr->nsdname} = 1;
|
|
||||||
$authns{ALL}{$rr->nsdname} = 1;
|
|
||||||
for (get_addresses($rr->nsdname)) {
|
|
||||||
unless ($seen{$_}) {
|
|
||||||
push @ns, $_;
|
|
||||||
$seen{$_} = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
#
|
|
||||||
if ($reply->authority) {
|
|
||||||
for my $rr ($reply->authority) {
|
|
||||||
if ($rr->type eq 'NS') {
|
|
||||||
if ($rr->name eq $name) {
|
|
||||||
# if the reply contains an authority section with the right
|
|
||||||
# domain, use it as a list of authoritative name servers.
|
|
||||||
print STDERR "$ns reported NS ", $rr->nsdname, "\n";;
|
|
||||||
|
|
||||||
$authns{$ns}{$rr->nsdname} = 1;
|
|
||||||
$authns{ALL}{$rr->nsdname} = 1;
|
|
||||||
for (get_addresses($rr->nsdname)) {
|
|
||||||
unless ($seen{$_}) {
|
|
||||||
push @ns, $_;
|
|
||||||
$seen{$_} = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
# Otherwise, just add the nameservers from the authority section
|
|
||||||
# to the list of nameservers still to query.
|
|
||||||
for (get_addresses($rr->nsdname)) {
|
|
||||||
unless ($seen{$_}) {
|
|
||||||
push @ns, $_;
|
|
||||||
$seen{$_} = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
# We must make sure that we get a result from all authoritative
|
|
||||||
# name servers
|
|
||||||
#
|
|
||||||
# XXX
|
|
||||||
#
|
|
||||||
# Isn't that included in the next test? If an authoritative
|
|
||||||
# nameserver doesn't answer, it will be reported as not reporting
|
|
||||||
# all nameservers.
|
|
||||||
|
|
||||||
# All lists of nameservers must be identical.
|
|
||||||
#
|
|
||||||
for my $authns (sort keys %{ $authns{ALL} }) {
|
|
||||||
for my $origns (sort keys %authns) {
|
|
||||||
print "$origns doesn't report $authns\n" unless $authns{$origns}{$authns};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
my @noaxfr;
|
|
||||||
my %zone;
|
|
||||||
for my $authns (sort keys %{ $authns{ALL} }) {
|
|
||||||
$res1->nameservers($authns);
|
|
||||||
my @zone = $res1->axfr($zone);
|
|
||||||
push @noaxfr, $authns unless @zone;
|
|
||||||
for my $rr (@zone) {
|
|
||||||
my $key = rr2key($rr);
|
|
||||||
|
|
||||||
$zone{$authns}{$rr->name}{$rr->type}{$key} = 1;
|
|
||||||
$zone{ALL}{$rr->name}{$rr->type}{$key} = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for my $authns (@noaxfr) {
|
|
||||||
$res1->nameservers($authns);
|
|
||||||
for my $name (sort keys %{ $zone{ALL} }) {
|
|
||||||
for my $type (sort keys %{ $zone{ALL}{$name} }) {
|
|
||||||
my $reply = $res1->send($name, $type);
|
|
||||||
for my $rr ($reply->answer) {
|
|
||||||
if ($rr->type eq $type) {
|
|
||||||
my $key = rr2key($rr);
|
|
||||||
$zone{$authns}{$rr->name}{$rr->type}{$key} = 1;
|
|
||||||
$zone{ALL}{$rr->name}{$rr->type}{$key} = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for my $authns (sort keys %zone) {
|
|
||||||
# next if $authns eq 'ALL';
|
|
||||||
for my $name (sort keys %{ $zone{ALL} }) {
|
|
||||||
for my $type (sort keys %{ $zone{ALL}{$name} }) {
|
|
||||||
for my $key (sort keys %{ $zone{ALL}{$name}{$type} }) {
|
|
||||||
unless ($zone{$authns}{$name}{$type}{$key}) {
|
|
||||||
print STDERR "$authns is missing $name $type $key\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
sub get_addresses {
|
|
||||||
my ($name) = @_;
|
|
||||||
my @addrs;
|
|
||||||
my $reply = $res0->send($name, 'A');
|
|
||||||
for my $rr ($reply->answer) {
|
|
||||||
if ($rr->type eq 'A') {
|
|
||||||
push @addrs, $rr->address;
|
|
||||||
}
|
|
||||||
# XXX - resolve CNAMEs?
|
|
||||||
}
|
|
||||||
return @addrs;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub rr2key {
|
|
||||||
my ($rr) = @_;
|
|
||||||
|
|
||||||
my $key;
|
|
||||||
|
|
||||||
if ($rr->type eq 'A') {
|
|
||||||
$key = $rr->address;
|
|
||||||
} elsif ($rr->type eq 'SOA') {
|
|
||||||
$key = join(' ', $rr->mname, $rr->rname, $rr->serial, $rr->refresh, $rr->retry, $rr->expire, $rr->minimum);
|
|
||||||
} elsif ($rr->type eq 'NS') {
|
|
||||||
$key = $rr->nsdname;
|
|
||||||
} elsif ($rr->type eq 'MX') {
|
|
||||||
$key = join(' ', $rr->preference, $rr->exchange);
|
|
||||||
} elsif ($rr->type eq 'CNAME') {
|
|
||||||
$key = $rr->cname;
|
|
||||||
} elsif ($rr->type eq 'TXT') {
|
|
||||||
$key = $rr->txtdata;
|
|
||||||
} elsif ($rr->type eq 'SRV') {
|
|
||||||
$key = join(' ', $rr->priority, $rr->weight, $rr->port, $rr->target);
|
|
||||||
} elsif ($rr->type eq 'PTR') {
|
|
||||||
$key = $rr->ptrdname;
|
|
||||||
} elsif ($rr->type eq 'HINFO') {
|
|
||||||
$key = join(' ', $rr->cpu, $rr->os);
|
|
||||||
} elsif ($rr->type eq 'LOC') {
|
|
||||||
# sloppy
|
|
||||||
my ($lat, $lon) = $rr->latlon;
|
|
||||||
$key = join(' ', $lat, $lon, $rr->altitude);
|
|
||||||
} else {
|
|
||||||
print STDERR "unhandled RR:\n";
|
|
||||||
print STDERR $rr->string, "\n";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
return $key;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Notes:
|
|
||||||
#
|
|
||||||
# for every a record, check ptr.
|
|
||||||
#
|
|
||||||
# for every ptr, check a
|
|
||||||
#
|
|
||||||
# find the zone (authority section).
|
|
||||||
#
|
|
||||||
# Check name servers (starting at random root).
|
|
||||||
#
|
|
||||||
# Try axfr.
|
|
||||||
# check each record:
|
|
||||||
# the same on all nameservers?
|
|
||||||
# A to PTR and vice versa
|
|
||||||
# MX
|
|
||||||
#
|
|
||||||
# vim: tw=0 sw=4 expandtab
|
|
|
@ -1,70 +0,0 @@
|
||||||
#!/usr/bin/perl
|
|
||||||
use warnings;
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
use Getopt::Long;
|
|
||||||
use Net::DNS::Resolver;
|
|
||||||
|
|
||||||
my $cfg;
|
|
||||||
GetOptions('config:s' => \$cfg);
|
|
||||||
|
|
||||||
my %file2zone;
|
|
||||||
my $res;
|
|
||||||
|
|
||||||
if ($cfg) {
|
|
||||||
# XXX - this is very simplistic
|
|
||||||
open(my $fh, '<', $cfg) or die "cannot open $cfg: $!";
|
|
||||||
my $currentzone;
|
|
||||||
while (<$fh>) {
|
|
||||||
if (/zone "(.*?)"/) {
|
|
||||||
$currentzone = $1;
|
|
||||||
} elsif (m{file ".*/(.*)"}) {
|
|
||||||
$file2zone{$1} = $currentzone;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$res = Net::DNS::Resolver->new();
|
|
||||||
}
|
|
||||||
|
|
||||||
for my $f (@ARGV) {
|
|
||||||
my $maxserial = 0;
|
|
||||||
if (my $zone = $file2zone{$f}) {
|
|
||||||
my $reply = $res->send($zone, 'NS');
|
|
||||||
my @nsnames;
|
|
||||||
for my $ans ($reply->answer) {
|
|
||||||
push @nsnames, $ans->nsdname;
|
|
||||||
}
|
|
||||||
my @nsips;
|
|
||||||
for (@nsnames) {
|
|
||||||
my $reply = $res->send($_, 'A');
|
|
||||||
for my $ans ($reply->answer) {
|
|
||||||
push @nsips, $ans->address if $ans->type eq 'A';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (@nsips) {
|
|
||||||
$res->nameservers($_);
|
|
||||||
my $reply = $res->send($zone, 'SOA');
|
|
||||||
for my $ans ($reply->answer) {
|
|
||||||
if ($ans->type eq 'SOA') {
|
|
||||||
# XXX assume no wraparound
|
|
||||||
if ($ans->serial > $maxserial) {
|
|
||||||
$maxserial = $ans->serial;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
open (my $in, '<', "$f") or die "cannot open $f: $!";
|
|
||||||
open (my $out, '>', "$f.new") or die "cannot open $f.new: $!";
|
|
||||||
while (<$in>) {
|
|
||||||
if (/(.*\bSOA\b.*?)(\d+)( \d+ \d+ \d+ \d+)/) {
|
|
||||||
my $serial = $2;
|
|
||||||
$maxserial = $serial if ($serial > $maxserial);
|
|
||||||
$maxserial++;
|
|
||||||
print $out "$1$maxserial$3\n";
|
|
||||||
} else {
|
|
||||||
print $out $_;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close($out) or die "cannot close $f.new: $!";
|
|
||||||
rename "$f.new", $f || die "cannot rename $f.new to $f: $!";
|
|
||||||
}
|
|
|
@ -1,27 +0,0 @@
|
||||||
#!/usr/bin/perl
|
|
||||||
use warnings;
|
|
||||||
use strict;
|
|
||||||
use autodie;
|
|
||||||
|
|
||||||
for my $zonefile (@ARGV) {
|
|
||||||
open my $in, '<', $zonefile;
|
|
||||||
open my $out, '>', "$zonefile.$$";
|
|
||||||
while (<$in>) {
|
|
||||||
# @ SOA ns1.wsr.ac.at. hostmaster.wsr.ac.at. 1957 14400 3600 604800 86400
|
|
||||||
if ( my ($prefix, $master, $rp, $serial, $refresh, $retry, $expire, $negttl)
|
|
||||||
= m/(.*)SOA\s+(\S+)\s+(\S+)\s(\d+)\s(\d+)\s(\d+)\s(\d+)\s(\d+)/
|
|
||||||
) {
|
|
||||||
# maximum time recommended by RFC 2308, also enforced by
|
|
||||||
# BIND (by default).
|
|
||||||
if ($negttl >= 3 * 3600) {
|
|
||||||
$negttl = 3600;
|
|
||||||
$serial++;
|
|
||||||
}
|
|
||||||
print $out "${prefix}SOA\t$master $rp $serial $refresh $retry $expire $negttl\n";
|
|
||||||
} else {
|
|
||||||
print $out $_;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
rename "$zonefile.$$", $zonefile;
|
|
||||||
}
|
|
||||||
|
|
80
dns/fqdn.c
80
dns/fqdn.c
|
@ -1,80 +0,0 @@
|
||||||
/*
|
|
||||||
* fqdn - print fully qualified domain name(s)
|
|
||||||
*
|
|
||||||
* resolve all host names given on the comman line and print their
|
|
||||||
* fully qualified canonical names.
|
|
||||||
*
|
|
||||||
* If no argument is given, print the system's FQDN.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <netdb.h>
|
|
||||||
|
|
||||||
#include "hstrerror.h"
|
|
||||||
|
|
||||||
char cvs_id[] = "$Id: fqdn.c,v 1.5 2004-05-17 18:13:46 hjp Exp $";
|
|
||||||
|
|
||||||
char *cmnd;
|
|
||||||
|
|
||||||
void usage(void) {
|
|
||||||
fprintf(stderr, "Usage: %s [hostname ...]\n", cmnd);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
int i;
|
|
||||||
int rc = 0;
|
|
||||||
char hostname[256];
|
|
||||||
char *fake_argv[] = { NULL, hostname, NULL };
|
|
||||||
|
|
||||||
cmnd = argv[0];
|
|
||||||
|
|
||||||
if (argc < 2) {
|
|
||||||
if (gethostname(hostname, sizeof(hostname)) == -1) {
|
|
||||||
fprintf(stderr, "%s: cannot get hostname: %s\n",
|
|
||||||
cmnd, strerror(errno));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
argv = fake_argv;
|
|
||||||
argc = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 1; i < argc; i++) {
|
|
||||||
struct hostent *he = gethostbyname(argv[i]);
|
|
||||||
int found = 0;
|
|
||||||
|
|
||||||
if (!he) {
|
|
||||||
fprintf(stderr, "%s: cannot resolve %s: %s\n",
|
|
||||||
cmnd, argv[i], hstrerror(h_errno));
|
|
||||||
rc++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strchr(he->h_name, '.')) {
|
|
||||||
printf("%s\n", he->h_name);
|
|
||||||
found = 1;
|
|
||||||
} else {
|
|
||||||
char **a;
|
|
||||||
fprintf(stderr, "Canonical name doesn't contain a dot.\n");
|
|
||||||
fprintf(stderr, "Please shoot the administrator of this box.\n");
|
|
||||||
fprintf(stderr, "In the mean time I try to find a suitable alias.\n");
|
|
||||||
for (a = he->h_aliases; !found && *a; a++) {
|
|
||||||
if (strchr(*a, '.')) {
|
|
||||||
printf("%s\n", *a);
|
|
||||||
found = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found) {
|
|
||||||
fprintf(stderr, "No alias, either. Consider more painful methods than shooting.\n");
|
|
||||||
rc++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return rc;
|
|
||||||
}
|
|
|
@ -1,57 +0,0 @@
|
||||||
#include <netdb.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "hstrerror.h"
|
|
||||||
|
|
||||||
char *cmnd;
|
|
||||||
|
|
||||||
void usage(void) {
|
|
||||||
fprintf(stderr, "Usage: %s [hostname ...]\n", cmnd);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
int i;
|
|
||||||
int rc = 0;
|
|
||||||
|
|
||||||
cmnd = argv[0];
|
|
||||||
|
|
||||||
if (argc < 2) {
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 1; i < argc; i++) {
|
|
||||||
struct in_addr ia;
|
|
||||||
if (!inet_aton(argv[i], &ia)) {
|
|
||||||
fprintf(stderr, "%s: cannot parse %s\n",
|
|
||||||
argv[0], argv[i]);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
struct hostent *he = gethostbyaddr(&ia, sizeof(ia), AF_INET);
|
|
||||||
char **a;
|
|
||||||
|
|
||||||
if (!he) {
|
|
||||||
fprintf(stderr, "%s: cannot resolve %s: %s\n",
|
|
||||||
argv[0], argv[i], hstrerror(h_errno));
|
|
||||||
rc++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("%s\n", argv[i]);
|
|
||||||
printf("\tCanonical: %s\n", he->h_name);
|
|
||||||
for (a = he->h_aliases; *a; a++) {
|
|
||||||
printf("\tAlias: %s\n", *a);
|
|
||||||
}
|
|
||||||
for (a = he->h_addr_list; *a; a++) {
|
|
||||||
int j;
|
|
||||||
printf("\tAddress: ");
|
|
||||||
for (j = 0; j < he->h_length; j++) {
|
|
||||||
printf("%s%d", j ? "." : "", (unsigned char)(*a)[j]);
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
return rc;
|
|
||||||
}
|
|
|
@ -1,51 +0,0 @@
|
||||||
#include <netdb.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "hstrerror.h"
|
|
||||||
|
|
||||||
char *cmnd;
|
|
||||||
|
|
||||||
void usage(void) {
|
|
||||||
fprintf(stderr, "Usage: %s [hostname ...]\n", cmnd);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
int i;
|
|
||||||
int rc = 0;
|
|
||||||
|
|
||||||
cmnd = argv[0];
|
|
||||||
|
|
||||||
if (argc < 2) {
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 1; i < argc; i++) {
|
|
||||||
struct hostent *he = gethostbyname(argv[i]);
|
|
||||||
char **a;
|
|
||||||
|
|
||||||
if (!he) {
|
|
||||||
fprintf(stderr, "%s: cannot resolve %s: %s\n",
|
|
||||||
argv[0], argv[i], hstrerror(h_errno));
|
|
||||||
rc++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("%s\n", argv[i]);
|
|
||||||
printf("\tCanonical: %s\n", he->h_name);
|
|
||||||
for (a = he->h_aliases; *a; a++) {
|
|
||||||
printf("\tAlias: %s\n", *a);
|
|
||||||
}
|
|
||||||
for (a = he->h_addr_list; *a; a++) {
|
|
||||||
int j;
|
|
||||||
printf("\tAddress: ");
|
|
||||||
for (j = 0; j < he->h_length; j++) {
|
|
||||||
printf("%s%d", j ? "." : "", (unsigned char)(*a)[j]);
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
return rc;
|
|
||||||
}
|
|
|
@ -1,11 +0,0 @@
|
||||||
#include "cfg/have_hstrerror.h"
|
|
||||||
#include "hstrerror.h"
|
|
||||||
|
|
||||||
#if (!HAVE_HSTRERROR)
|
|
||||||
const char *hstrerror(int err) {
|
|
||||||
static char errstr[80];
|
|
||||||
|
|
||||||
snprintf(errstr, sizeof(errstr), "resolver error %d", err);
|
|
||||||
return errstr;
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1 +0,0 @@
|
||||||
const char * hstrerror(int err);
|
|
48
dns/minnet
48
dns/minnet
|
@ -1,48 +0,0 @@
|
||||||
#!/usr/bin/perl
|
|
||||||
use warnings;
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
my $min = 0xFFFF_FFFF;
|
|
||||||
my $max = 0x0000_0000;
|
|
||||||
|
|
||||||
for (@ARGV) {
|
|
||||||
if (/(\d+)\.(\d+)\.(\d+)\.(\d+)/) {
|
|
||||||
my $adr = $1 * 0x100_0000 + $2 * 0x1_0000 + $3 * 0x100 + $4;
|
|
||||||
$max = $adr if ($adr > $max);
|
|
||||||
$min = $adr if ($adr < $min);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
my $diff = $min ^ $max;
|
|
||||||
|
|
||||||
# printf "min = %08x max = %08x diff = %08x\n", $min, $max, $diff;
|
|
||||||
|
|
||||||
my $netmaskbits = 32;
|
|
||||||
my $netmask = 0xFFFF_FFFF;
|
|
||||||
|
|
||||||
while ($diff > 0) {
|
|
||||||
$netmaskbits--;
|
|
||||||
$diff >>= 1;
|
|
||||||
$netmask <<= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
my $net = $min & $netmask;
|
|
||||||
my $bcast = $min | ~$netmask;
|
|
||||||
|
|
||||||
printf "net = %s/%d (%s/%s) bcast = %s\n",
|
|
||||||
dottedquad($net),
|
|
||||||
$netmaskbits,
|
|
||||||
dottedquad($net),
|
|
||||||
dottedquad($netmask),
|
|
||||||
dottedquad($bcast);
|
|
||||||
|
|
||||||
sub dottedquad {
|
|
||||||
my ($adr) = @_;
|
|
||||||
return sprintf "%d.%d.%d.%d",
|
|
||||||
($adr >> 24) & 0xFF,
|
|
||||||
($adr >> 16) & 0xFF,
|
|
||||||
($adr >> 8) & 0xFF,
|
|
||||||
($adr >> 0) & 0xFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
exit(0);
|
|
19
dns/query
19
dns/query
|
@ -1,19 +0,0 @@
|
||||||
#!/usr/bin/perl -w
|
|
||||||
use strict;
|
|
||||||
use Net::DNS;
|
|
||||||
|
|
||||||
sub usage {
|
|
||||||
print STDERR "Usage: $0 domainname type nameserver\n" unless (@ARGV == 2);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
usage() unless (@ARGV == 3);
|
|
||||||
|
|
||||||
my $res = new Net::DNS::Resolver;
|
|
||||||
$res->nameservers($ARGV[2]);
|
|
||||||
my $answer = $res->query($ARGV[0], $ARGV[1]);
|
|
||||||
if ($answer) {
|
|
||||||
$answer->print;
|
|
||||||
} else {
|
|
||||||
print STDERR "query failed: ", $res->errorstring, "\n";
|
|
||||||
}
|
|
|
@ -1,52 +0,0 @@
|
||||||
#!/usr/bin/perl
|
|
||||||
use warnings;
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
use File::Find;
|
|
||||||
|
|
||||||
use MIME::Parser;
|
|
||||||
my $parser = new MIME::Parser;
|
|
||||||
$parser->output_to_core(1);
|
|
||||||
$parser->tmp_to_core(1);
|
|
||||||
|
|
||||||
my %files;
|
|
||||||
my %messages;
|
|
||||||
sub check_file {
|
|
||||||
unless (-f) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
|
|
||||||
$atime,$mtime,$ctime,$blksize,$blocks) = stat(_);
|
|
||||||
if ($files{"$dev.$ino"}) {
|
|
||||||
# we already looked at this file - skip
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
my $entity = $parser->parse_open($_);
|
|
||||||
unless ($entity) {
|
|
||||||
print STDERR "$File::Find::name cannot be parsed: skipping\n";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
my $mid = $entity->head->get('Message-Id');
|
|
||||||
unless ($mid) {
|
|
||||||
print STDERR "$File::Find::name contains no message id: skipping\n";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ($messages{$mid}) {
|
|
||||||
# duplicate!
|
|
||||||
print STDERR "$File::Find::name is a duplicate of ",
|
|
||||||
$files{$messages{$mid}},
|
|
||||||
"\n";
|
|
||||||
my $ft = $File::Find::name;
|
|
||||||
$ft =~ s|(.*/)(.*)|$1|;
|
|
||||||
$ft .= "removedups.$$." . rand;
|
|
||||||
link ($files{$messages{$mid}}, $ft) && rename ($ft, $File::Find::name) || do {
|
|
||||||
print STDERR "\terror: $!\n";
|
|
||||||
};
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$messages{$mid} = "$dev.$ino";
|
|
||||||
$files{"$dev.$ino"} = $File::Find::name;
|
|
||||||
}
|
|
||||||
|
|
||||||
find(\&check_file, @ARGV);
|
|
||||||
|
|
|
@ -1,57 +0,0 @@
|
||||||
#!/usr/bin/perl
|
|
||||||
use warnings;
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
use File::Find;
|
|
||||||
use Digest::SHA1;
|
|
||||||
use Data::Dumper;
|
|
||||||
|
|
||||||
my %files;
|
|
||||||
sub check_file {
|
|
||||||
unless (-f) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
|
|
||||||
$atime,$mtime,$ctime,$blksize,$blocks) = stat(_);
|
|
||||||
$files{$size}{i}{"$dev.$ino"}{n}{$File::Find::name} = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
print STDERR "sorting files by size\n";
|
|
||||||
find(\&check_file, @ARGV);
|
|
||||||
print STDERR "... done\n";
|
|
||||||
|
|
||||||
for my $s (sort { $a <=> $b } keys %files) {
|
|
||||||
print STDERR "checking files of size $s\n";
|
|
||||||
if (scalar keys %{$files{$s}{i}} == 1) {
|
|
||||||
print STDERR "only one file of size $s: skipping\n";
|
|
||||||
} else {
|
|
||||||
for my $i (keys %{$files{$s}{i}}) {
|
|
||||||
my $f = (keys %{$files{$s}{i}{$i}{n}})[0];
|
|
||||||
if (open (F, "<", $f)) {
|
|
||||||
# print STDERR "\tcomputing checksum of $f\n";
|
|
||||||
my $sha1 = Digest::SHA1->new;
|
|
||||||
$sha1->addfile(*F);
|
|
||||||
my $d = $sha1->b64digest;
|
|
||||||
if ($files{$s}{d}{$d}) {
|
|
||||||
print STDERR "\t\tduplicate found\n";
|
|
||||||
my $fo = (keys %{$files{$s}{d}{$d}{n}})[0];
|
|
||||||
for my $fd (keys %{$files{$s}{i}{$i}{n}}) {
|
|
||||||
print "\t\t\tlinking $fd to $fo\n";
|
|
||||||
my $ft = $fd;
|
|
||||||
$ft =~ s|(.*/)(.*)|$1|;
|
|
||||||
$ft .= "removedups.$$." . rand;
|
|
||||||
link ($fo, $ft) && rename ($ft, $fd) || do {
|
|
||||||
print STDERR "\t\t\t\terror: $!\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$files{$s}{d}{$d} = $files{$s}{i}{$i};
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
print STDERR "cannot open $f: $!: ignoring\n";
|
|
||||||
}
|
|
||||||
delete $files{$s}{i}{$i};
|
|
||||||
}
|
|
||||||
# print Dumper $files{$s};
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,9 +0,0 @@
|
||||||
install: $(ROOT)/usr/local/bin/duwatch
|
|
||||||
install_all:
|
|
||||||
make install ROOT=/nfs/wsrdb
|
|
||||||
make install ROOT=/nfs/wifosv
|
|
||||||
make install ROOT=/nfs/ihssv
|
|
||||||
make install ROOT=/nfs/wsrcom
|
|
||||||
|
|
||||||
$(ROOT)/usr/local/bin/%: %
|
|
||||||
install $< $@
|
|
|
@ -1,37 +0,0 @@
|
||||||
#!/usr/bin/perl
|
|
||||||
|
|
||||||
$avgfile = "/usr/local/lib/duwatch.avg";
|
|
||||||
$root = "/";
|
|
||||||
$thresh = 20000;
|
|
||||||
$period = 30;
|
|
||||||
|
|
||||||
open AVG, $avgfile || die;
|
|
||||||
while (<AVG>) {
|
|
||||||
($size, $name) = split;
|
|
||||||
$avgdu{$name} = $size;
|
|
||||||
$all{$name} = 1;
|
|
||||||
}
|
|
||||||
close AVG;
|
|
||||||
|
|
||||||
open NEW, "/bin/du -t hfs $root |" || die;
|
|
||||||
while (<NEW>) {
|
|
||||||
($size, $name) = split;
|
|
||||||
$size /= 2; # du reports 512 byte blocks :-(
|
|
||||||
if ($size < $thresh) {next};
|
|
||||||
$newdu{$name} = $size;
|
|
||||||
$all{$name} = 1;
|
|
||||||
}
|
|
||||||
close NEW;
|
|
||||||
|
|
||||||
for $i (keys %all) {
|
|
||||||
if ($newdu{"$i"} > 2 * ($avgdu{"$i"})) {
|
|
||||||
printf "%s: %d -> %d\n", $i, $avgdu{$i}, $newdu{$i};
|
|
||||||
}
|
|
||||||
$avgdu{$i} = ($avgdu{$i} * ($period - 1) + $newdu{$i}) / $period;
|
|
||||||
}
|
|
||||||
|
|
||||||
open AVG, ">" . $avgfile || die;
|
|
||||||
for $i (keys %avgdu) {
|
|
||||||
printf AVG "%d %s\n", $avgdu{$i}, $i;
|
|
||||||
}
|
|
||||||
close AVG;
|
|
|
@ -1,48 +0,0 @@
|
||||||
# $Id: GNUmakefile,v 1.8 2016-07-05 19:52:03 hjp Exp $
|
|
||||||
# $Log: GNUmakefile,v $
|
|
||||||
# Revision 1.8 2016-07-05 19:52:03 hjp
|
|
||||||
# Add target distclean
|
|
||||||
#
|
|
||||||
# Revision 1.7 2011-01-30 19:41:15 hjp
|
|
||||||
# Replaced GNUmakerules.sh with GNUmakerules.pl because Debian now uses a
|
|
||||||
# /bin/sh which doesn't understand echo -e.
|
|
||||||
#
|
|
||||||
# Revision 1.6 2011-01-30 19:33:28 hjp
|
|
||||||
# removed duplicate rules
|
|
||||||
#
|
|
||||||
# Revision 1.5 2011-01-30 19:32:33 hjp
|
|
||||||
# create GNUmakerules and GNUmakevars
|
|
||||||
#
|
|
||||||
# Revision 1.4 2008-04-05 10:04:53 hjp
|
|
||||||
# added GNUmake*.sh
|
|
||||||
#
|
|
||||||
# Revision 1.3 2003/02/14 11:59:43 hjp
|
|
||||||
# Added list of #defines from HP-UX.
|
|
||||||
#
|
|
||||||
# Revision 1.2 1998/05/31 01:20:06 hjp
|
|
||||||
# GNUmakerules split into GNUmakerules and GNUmakevars.
|
|
||||||
#
|
|
||||||
|
|
||||||
include GNUmakevars
|
|
||||||
|
|
||||||
all: errno
|
|
||||||
|
|
||||||
errno: errno.o errno_list.o
|
|
||||||
errno_list.c: errno.list make_errno_list
|
|
||||||
./make_errno_list
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm errno
|
|
||||||
|
|
||||||
distclean: clean
|
|
||||||
rm -f GNUmakevars GNUmakerules errno_list.c
|
|
||||||
|
|
||||||
install: $(BINDIR)/errno
|
|
||||||
|
|
||||||
GNUmakevars: GNUmakevars.sh
|
|
||||||
sh ./$^ > $@
|
|
||||||
GNUmakerules: GNUmakerules.pl
|
|
||||||
perl ./$^ > $@
|
|
||||||
|
|
||||||
include GNUmakerules
|
|
||||||
-include *.d
|
|
|
@ -1,8 +0,0 @@
|
||||||
#!/usr/bin/perl
|
|
||||||
use warnings;
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
print "\$(BINDIR)/%: %\n";
|
|
||||||
print "\tcp \$^ \$@\n";
|
|
||||||
print "\$(MAN1DIR)/%: %\n";
|
|
||||||
print "\tcp \$^ \$@\n";
|
|
|
@ -1,15 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
prefix=${prefix:-/usr/local}
|
|
||||||
echo "BINDIR=$prefix/bin"
|
|
||||||
|
|
||||||
for i in "$prefix/share/man/man1" "$prefix/man/man1"
|
|
||||||
do
|
|
||||||
if [ -d "$i" -a -w "$i" ]
|
|
||||||
then
|
|
||||||
echo "MAN1DIR=$i"
|
|
||||||
break;
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "all:"
|
|
|
@ -1,61 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "errno_list.h"
|
|
||||||
|
|
||||||
char errno_c_rcs_id[] = "$Id: errno.c,v 1.5 2003-02-27 13:28:45 hjp Exp $";
|
|
||||||
char *cmnd;
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
int i;
|
|
||||||
|
|
||||||
cmnd = argv[0];
|
|
||||||
|
|
||||||
if (argc <= 1) {
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < wke_nr; i++) {
|
|
||||||
int e = wke[i].number;
|
|
||||||
char *d = wke[i].define;
|
|
||||||
printf("%d\t%s\t%s\n", e, d, strerror(e));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (i = 1; i < argc; i++) {
|
|
||||||
char *p;
|
|
||||||
int e = strtoul(argv[i], &p, 0);
|
|
||||||
|
|
||||||
if (*p) {
|
|
||||||
/* This is not a number, so we assume it is a define */
|
|
||||||
char *d = argv[i];
|
|
||||||
int j;
|
|
||||||
|
|
||||||
for (j = 0; j < wke_nr; j++) {
|
|
||||||
if (strcmp(wke[j].define, d) == 0) {
|
|
||||||
e = wke[j].number;
|
|
||||||
printf("%d\t%s\t%s\n", e, d, strerror(e));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
/* it is a number */
|
|
||||||
char *d = "(unknown)";
|
|
||||||
int j;
|
|
||||||
|
|
||||||
for (j = 0; j < wke_nr; j++) {
|
|
||||||
if (wke[j].number == e) {
|
|
||||||
d = wke[j].define;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("%d\t%s\t%s\n", e, d, strerror(e));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* vim:sw=4
|
|
||||||
*/
|
|
137
errno/errno.list
137
errno/errno.list
|
@ -1,137 +0,0 @@
|
||||||
E2BIG
|
|
||||||
EACCES
|
|
||||||
EADDRINUSE
|
|
||||||
EADDRNOTAVAIL
|
|
||||||
EADV
|
|
||||||
EAFNOSUPPORT
|
|
||||||
EAGAIN
|
|
||||||
EALREADY
|
|
||||||
EBADE
|
|
||||||
EBADF
|
|
||||||
EBADFD
|
|
||||||
EBADMSG
|
|
||||||
EBADR
|
|
||||||
EBADRQC
|
|
||||||
EBADSLT
|
|
||||||
EBADVER
|
|
||||||
EBFONT
|
|
||||||
EBUSY
|
|
||||||
ECANCELED
|
|
||||||
ECHILD
|
|
||||||
ECHRNG
|
|
||||||
ECOMM
|
|
||||||
ECONFIG
|
|
||||||
ECONNABORTED
|
|
||||||
ECONNREFUSED
|
|
||||||
ECONNRESET
|
|
||||||
EDEADLK
|
|
||||||
EDEADLOCK
|
|
||||||
EDESTADDRREQ
|
|
||||||
EDOM
|
|
||||||
EDOTDOT
|
|
||||||
EDQUOT
|
|
||||||
EEXIST
|
|
||||||
EFAULT
|
|
||||||
EFBIG
|
|
||||||
EHOSTDOWN
|
|
||||||
EHOSTUNREACH
|
|
||||||
EIDRM
|
|
||||||
EILSEQ
|
|
||||||
EINPROGRESS
|
|
||||||
EINTR
|
|
||||||
EINVAL
|
|
||||||
EIO
|
|
||||||
EISCONN
|
|
||||||
EISDIR
|
|
||||||
EISNAM
|
|
||||||
EL2HLT
|
|
||||||
EL2NSYNC
|
|
||||||
EL3HLT
|
|
||||||
EL3RST
|
|
||||||
ELIBACC
|
|
||||||
ELIBBAD
|
|
||||||
ELIBEXEC
|
|
||||||
ELIBMAX
|
|
||||||
ELIBSCN
|
|
||||||
ELNRNG
|
|
||||||
ELOOP
|
|
||||||
EMEDIUMTYPE
|
|
||||||
EMFILE
|
|
||||||
EMLINK
|
|
||||||
EMSGSIZE
|
|
||||||
EMULTIHOP
|
|
||||||
ENAMETOOLONG
|
|
||||||
ENAVAIL
|
|
||||||
ENETDOWN
|
|
||||||
ENETRESET
|
|
||||||
ENETUNREACH
|
|
||||||
ENFILE
|
|
||||||
ENOANO
|
|
||||||
ENOBUFS
|
|
||||||
ENOCSI
|
|
||||||
ENODATA
|
|
||||||
ENODEV
|
|
||||||
ENOENT
|
|
||||||
ENOEXEC
|
|
||||||
ENOLCK
|
|
||||||
ENOLINK
|
|
||||||
ENOLOAD
|
|
||||||
ENOMATCH
|
|
||||||
ENOMEDIUM
|
|
||||||
ENOMEM
|
|
||||||
ENOMSG
|
|
||||||
ENONET
|
|
||||||
ENOPKG
|
|
||||||
ENOPROTOOPT
|
|
||||||
ENOREG
|
|
||||||
ENOSPC
|
|
||||||
ENOSR
|
|
||||||
ENOSTR
|
|
||||||
ENOSYM
|
|
||||||
ENOSYS
|
|
||||||
ENOTBLK
|
|
||||||
ENOTCONN
|
|
||||||
ENOTDIR
|
|
||||||
ENOTEMPTY
|
|
||||||
ENOTNAM
|
|
||||||
ENOTSOCK
|
|
||||||
ENOTSUP
|
|
||||||
ENOTTY
|
|
||||||
ENOTUNIQ
|
|
||||||
ENOUNLD
|
|
||||||
ENOUNREG
|
|
||||||
ENXIO
|
|
||||||
EOPNOTSUPP
|
|
||||||
EOVERFLOW
|
|
||||||
EPERM
|
|
||||||
EPFNOSUPPORT
|
|
||||||
EPIPE
|
|
||||||
EPROTO
|
|
||||||
EPROTONOSUPPORT
|
|
||||||
EPROTOTYPE
|
|
||||||
ERANGE
|
|
||||||
EREFUSED
|
|
||||||
ERELOC
|
|
||||||
EREMCHG
|
|
||||||
EREMOTE
|
|
||||||
EREMOTEIO
|
|
||||||
EREMOTERELEASE
|
|
||||||
ERESTART
|
|
||||||
EROFS
|
|
||||||
ESHUTDOWN
|
|
||||||
ESOCKTNOSUPPORT
|
|
||||||
ESPIPE
|
|
||||||
ESRCH
|
|
||||||
ESRMNT
|
|
||||||
ESTALE
|
|
||||||
ESTRPIPE
|
|
||||||
ETIME
|
|
||||||
ETIMEDOUT
|
|
||||||
ETOOMANYREFS
|
|
||||||
ETXTBSY
|
|
||||||
EUCLEAN
|
|
||||||
EUNATCH
|
|
||||||
EUSERS
|
|
||||||
EWOULDBLOCK
|
|
||||||
EXDEV
|
|
||||||
EXFULL
|
|
|
@ -1,9 +0,0 @@
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int number;
|
|
||||||
char *define;
|
|
||||||
} errno_T;
|
|
||||||
|
|
||||||
extern errno_T wke[];
|
|
||||||
extern const size_t wke_nr;
|
|
|
@ -1,11 +0,0 @@
|
||||||
echo '#include <errno.h>' > errno_list.c
|
|
||||||
echo '#include "errno_list.h"' >> errno_list.c
|
|
||||||
echo 'errno_T wke[] = {' >> errno_list.c
|
|
||||||
for e in `cat errno.list`
|
|
||||||
do
|
|
||||||
echo " #if defined($e)" >> errno_list.c
|
|
||||||
echo " { $e, \"$e\" }," >> errno_list.c
|
|
||||||
echo " #endif" >> errno_list.c
|
|
||||||
done
|
|
||||||
echo '};' >> errno_list.c
|
|
||||||
echo 'const size_t wke_nr = sizeof(wke)/sizeof(wke[0]);' >> errno_list.c
|
|
|
@ -1,35 +0,0 @@
|
||||||
include GNUmakevars
|
|
||||||
|
|
||||||
CONFDIR=../../configure
|
|
||||||
CONFDIR_exists=$(shell [ -d $(CONFDIR) ] && echo ok)
|
|
||||||
|
|
||||||
all: configure fact
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm fact customize
|
|
||||||
|
|
||||||
install: $(BINDIR) $(BINDIR)/fact
|
|
||||||
|
|
||||||
%: %.pl customize
|
|
||||||
sh ./customize < $< > $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
%: %.sh customize
|
|
||||||
sh ./customize < $< > $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
customize: configure
|
|
||||||
sh ./configure
|
|
||||||
|
|
||||||
ifeq ($(CONFDIR_exists),ok)
|
|
||||||
|
|
||||||
configure: $(CONFDIR)/start $(CONFDIR)/perl $(CONFDIR)/finish
|
|
||||||
cat $^ > $@
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
$(BINDIR):
|
|
||||||
mkdir -p $@
|
|
||||||
|
|
||||||
include GNUmakerules
|
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
echo "#!/bin/sh" > customize.$$
|
|
||||||
echo "sed \\" > customize.$$
|
|
||||||
chmod +x customize.$$
|
|
||||||
|
|
||||||
################################################################
|
|
||||||
# find a working perl:
|
|
||||||
#
|
|
||||||
for i in /usr/bin/perl /usr/local/bin/perl /usr/bin/perl5 /usr/local/bin/perl5
|
|
||||||
do
|
|
||||||
if $i -e 'exit ($] < 5.000)'
|
|
||||||
then
|
|
||||||
echo $i works
|
|
||||||
perl="$i"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [ -z "$perl" ]
|
|
||||||
then
|
|
||||||
could not find a working perl command, sorry.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo " -e 's,@@@perl@@@,$perl,g' \\" >> customize.$$
|
|
||||||
|
|
||||||
|
|
||||||
################################################################
|
|
||||||
# finish
|
|
||||||
# Add trailing newline and rename temp file to final name
|
|
||||||
#
|
|
||||||
echo >> customize.$$
|
|
||||||
|
|
||||||
mv customize.$$ customize
|
|
||||||
|
|
31
fact/fact.pl
31
fact/fact.pl
|
@ -1,31 +0,0 @@
|
||||||
#!@@@perl@@@ -w
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
sub usage {
|
|
||||||
print STDERR "Usage: $0 number\n";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub fact {
|
|
||||||
my ($n) = @_;
|
|
||||||
|
|
||||||
my $d = 2;
|
|
||||||
|
|
||||||
my @f = ();
|
|
||||||
|
|
||||||
while ($d <= $n) {
|
|
||||||
if ($n % $d == 0) {
|
|
||||||
push (@f, $d);
|
|
||||||
$n /= $d;
|
|
||||||
} else {
|
|
||||||
$d++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return @f;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (@ARGV != 1) { usage(); }
|
|
||||||
my @f = fact($ARGV[0]);
|
|
||||||
print "@f\n";
|
|
||||||
|
|
||||||
#vim:sw=4
|
|
|
@ -1,30 +0,0 @@
|
||||||
#!/usr/bin/perl
|
|
||||||
use warnings;
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
use File::Find;
|
|
||||||
|
|
||||||
my %seen;
|
|
||||||
my %hist;
|
|
||||||
|
|
||||||
sub collect {
|
|
||||||
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
|
|
||||||
$atime,$mtime,$ctime,$blksize,$blocks) = lstat($_);
|
|
||||||
return if $seen{"$dev:$ino"};
|
|
||||||
$hist{$size}++;
|
|
||||||
$seen{"$dev:$ino"} = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
find(\&collect, @ARGV ? @ARGV : ("."));
|
|
||||||
|
|
||||||
my $total_count;
|
|
||||||
for my $c (values %hist) {
|
|
||||||
$total_count += $c;
|
|
||||||
}
|
|
||||||
|
|
||||||
my $ac = 0;
|
|
||||||
for my $s (sort {$a <=> $b } keys %hist) {
|
|
||||||
$ac += $hist{$s};
|
|
||||||
printf "%g %g %6.2f\n", $s, $ac, 100 * $ac/$total_count;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
#!/usr/bin/perl
|
|
||||||
use warnings;
|
|
||||||
use strict;
|
|
||||||
use LWP::UserAgent;
|
|
||||||
use Time::HiRes qw(time);
|
|
||||||
|
|
||||||
my $verbose = 0;
|
|
||||||
|
|
||||||
my $ua = LWP::UserAgent->new();
|
|
||||||
|
|
||||||
my @proxies;
|
|
||||||
for my $proxy (@ARGV) {
|
|
||||||
print STDERR "trying proxy $proxy\n" if $verbose;
|
|
||||||
$ua->proxy('http', $proxy);
|
|
||||||
my $t0 = time();
|
|
||||||
my $response = $ua->get('http://www.hjp.at');
|
|
||||||
if ($response->is_success) {
|
|
||||||
my $dt = time() - $t0;
|
|
||||||
print STDERR "\tsucceded in $dt seconds\n" if $verbose;
|
|
||||||
push @proxies, [ $dt, $proxy ];
|
|
||||||
} else {
|
|
||||||
print STDERR "\tfailed\n" if $verbose;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (@proxies) {
|
|
||||||
@proxies = sort { $a->[0] <=> $b->[0] } @proxies;
|
|
||||||
print $proxies[0]->[1], "\n";
|
|
||||||
} else {
|
|
||||||
print STDERR "no proxies found\n" if $verbose;
|
|
||||||
}
|
|
|
@ -1,9 +0,0 @@
|
||||||
BINDIR=/usr/local/bin
|
|
||||||
CC = gcc
|
|
||||||
CFLAGS = -Wall -ansi -pedantic -O2 -g
|
|
||||||
fix2var: fix2var.o
|
|
||||||
$(CC) $^ -lant -o $@
|
|
||||||
|
|
||||||
install: $(BINDIR)/fix2var
|
|
||||||
$(BINDIR)/%: %
|
|
||||||
install $< $@
|
|
|
@ -1,94 +0,0 @@
|
||||||
char fix2var_c_rcs_id[] =
|
|
||||||
"$Id: fix2var.c,v 1.1 1996-08-30 12:25:22 hjp Exp $";
|
|
||||||
/*
|
|
||||||
* fix2var - convert fixed length record data to line oriented format
|
|
||||||
*
|
|
||||||
* This program simply copies fixed length chunks from a file to
|
|
||||||
* stdout. Each chunk is terminated with a '\n' character.
|
|
||||||
* Optionally trailing white space can be stripped.
|
|
||||||
*
|
|
||||||
* $Log: fix2var.c,v $
|
|
||||||
* Revision 1.1 1996-08-30 12:25:22 hjp
|
|
||||||
* Initial release.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#include <assert.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <ant/io.h>
|
|
||||||
#include <ant/alloc.h>
|
|
||||||
|
|
||||||
char *cmnd;
|
|
||||||
|
|
||||||
unsigned long width = 80;
|
|
||||||
int strip = 1;
|
|
||||||
|
|
||||||
void usage(void) {
|
|
||||||
fprintf(stderr, "Usage: %s [-l width] [file ...]\n", cmnd);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void fix2var(const char *filename) {
|
|
||||||
FILE *fp;
|
|
||||||
char *buf = emalloc(width+1);
|
|
||||||
size_t rc;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (strcmp(filename, "-") == 0) {
|
|
||||||
fp = stdin;
|
|
||||||
} else {
|
|
||||||
fp = efopen(filename, "r");
|
|
||||||
}
|
|
||||||
while ((rc = fread (buf, 1, width, fp)) != 0 && (rc != (size_t)-1)) {
|
|
||||||
if (rc < width) {
|
|
||||||
fprintf(stderr, "%s: warning: short record (%lu bytes)"
|
|
||||||
" encountered\n", cmnd, (unsigned long)rc);
|
|
||||||
}
|
|
||||||
assert (rc <= INT_MAX);
|
|
||||||
if (strip) {
|
|
||||||
for (i = rc - 1; i >= 0 && isspace(buf[i]); i--);
|
|
||||||
buf[i+1] = '\0';
|
|
||||||
} else {
|
|
||||||
buf[rc] = '\0';
|
|
||||||
}
|
|
||||||
puts(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(fp);
|
|
||||||
free(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
int c;
|
|
||||||
int i;
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
cmnd = argv[0];
|
|
||||||
|
|
||||||
while ((c = getopt(argc, argv, "sw:")) != EOF) {
|
|
||||||
switch (c) {
|
|
||||||
case 's':
|
|
||||||
strip= 1;
|
|
||||||
break;
|
|
||||||
case 'w':
|
|
||||||
width= strtoul(optarg, &p, 0);
|
|
||||||
if (width == 0 || *p) usage();
|
|
||||||
break;
|
|
||||||
case '?':
|
|
||||||
usage();
|
|
||||||
default:
|
|
||||||
assert(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (optind == argc) {
|
|
||||||
fix2var("-");
|
|
||||||
} else {
|
|
||||||
for (i = optind; i < argc; i++) {
|
|
||||||
fix2var(argv[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
CC = gcc
|
|
||||||
CFLAGS = -O2
|
|
||||||
|
|
||||||
BINDIR = /usr/local/bin
|
|
||||||
|
|
||||||
fortune: fortune.c
|
|
||||||
$(CC) $(CFLAGS) -o fortune fortune.c -lant
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm fortune core
|
|
||||||
|
|
||||||
install: $(BINDIR)/fortune
|
|
||||||
|
|
||||||
$(BINDIR)/fortune: fortune
|
|
||||||
cp fortune $(BINDIR)/fortune
|
|
||||||
|
|
|
@ -1,213 +0,0 @@
|
||||||
/*
|
|
||||||
* Fortune -- Print one fortune out of an indexed fortune file
|
|
||||||
*/
|
|
||||||
|
|
||||||
static char fortune_c_rcsid[] = "$Id: fortune.c,v 3.4 1994-01-08 18:05:00 hjp Exp $";
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
#include <ant/io.h>
|
|
||||||
#include <ant/string.h>
|
|
||||||
#include <ant/globals.h>
|
|
||||||
|
|
||||||
/* The following parameters will have to be adapted to your system */
|
|
||||||
#define DELIMITER "%%\n"
|
|
||||||
#define MAXLINE (80 + 1 + 1)
|
|
||||||
char * fortunefile = "/usr/lib/fortune.dat";
|
|
||||||
char indexfile [PATH_MAX] = "/usr/lib/fortune.idx";
|
|
||||||
#define RECLEN 4 /* length of a record in the index
|
|
||||||
* file. This would normally be the
|
|
||||||
* size of a long, but could be more
|
|
||||||
* or less if you want the program
|
|
||||||
* run on systems with different lengths
|
|
||||||
* of a long and share the same index
|
|
||||||
* file.
|
|
||||||
*/
|
|
||||||
/* The rest should be generic */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void fwritelong (FILE *fp, long offset, long value) {
|
|
||||||
unsigned char c [RECLEN];
|
|
||||||
|
|
||||||
assert (value < (1UL << (8 * RECLEN - 1)));
|
|
||||||
|
|
||||||
if (fseek (fp, offset, SEEK_SET) != 0) {
|
|
||||||
eprintf ("%s: cannot seek to %ld in %s: %s\n",
|
|
||||||
cmnd, offset, indexfile, strerror (errno));
|
|
||||||
exit (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
c [0] = value & 0xFF;
|
|
||||||
c [1] = (value >> 8) & 0xFF;
|
|
||||||
c [2] = (value >> 16) & 0xFF;
|
|
||||||
c [3] = (value >> 24) & 0xFF;
|
|
||||||
|
|
||||||
if (fwrite (c, RECLEN, 1, fp) != 1) {
|
|
||||||
eprintf ("%s: cannot write to %s: %s\n",
|
|
||||||
cmnd, indexfile, strerror (errno));
|
|
||||||
exit (1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
long freadlong (FILE *fp, long offset) {
|
|
||||||
unsigned char c [RECLEN];
|
|
||||||
unsigned long value;
|
|
||||||
|
|
||||||
if (fseek (fp, offset, SEEK_SET) != 0) {
|
|
||||||
eprintf ("%s: cannot seek to %ld in %s: %s\n",
|
|
||||||
cmnd, offset, indexfile, strerror (errno));
|
|
||||||
exit (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fread (c, RECLEN, 1, fp) != 1) {
|
|
||||||
eprintf ("%s: cannot write to %s: %s\n",
|
|
||||||
cmnd, indexfile, strerror (errno));
|
|
||||||
exit (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
value = c [0] + (c [1] << 8) + (c [2] << 16) + (c [3] << 24);
|
|
||||||
return value > LONG_MAX ? - (long) (- value) : value;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
main(
|
|
||||||
int argc,
|
|
||||||
char **argv
|
|
||||||
){
|
|
||||||
FILE * ffp, * ifp;
|
|
||||||
char * p;
|
|
||||||
long pos, ipos, /* position in fortune and
|
|
||||||
* index file
|
|
||||||
*/
|
|
||||||
cnt, /* Number of fortunes in the file
|
|
||||||
*/
|
|
||||||
nr, /* number of fortune to read */
|
|
||||||
fortune_time; /* time the fortune file was last
|
|
||||||
* updated.
|
|
||||||
*/
|
|
||||||
struct stat statbuf;
|
|
||||||
char line [MAXLINE];
|
|
||||||
|
|
||||||
cmnd = argv [0];
|
|
||||||
|
|
||||||
if (argc >= 2){
|
|
||||||
fortunefile = argv [1];
|
|
||||||
strncpy (indexfile, argv [1], PATH_MAX);
|
|
||||||
if ((p = strrchr (indexfile, '.'))) {
|
|
||||||
strcpy (p, ".idx");
|
|
||||||
} else {
|
|
||||||
strcat (indexfile, ".idx");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf ("fortunefile = \"%s\"\n", fortunefile);
|
|
||||||
printf ("indexfile = \"%s\"\n", indexfile);
|
|
||||||
#endif /* DEBUG */
|
|
||||||
|
|
||||||
/* First check if index file is younger than fortune file
|
|
||||||
* and rebuild it if necessary.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (stat (fortunefile, &statbuf) < 0) {
|
|
||||||
eprintf ("%s: Cannot stat \"%s\": %s",
|
|
||||||
argv [0], fortunefile, strerror (errno));
|
|
||||||
exit (1);
|
|
||||||
}
|
|
||||||
fortune_time = statbuf.st_mtime;
|
|
||||||
if (stat (indexfile, &statbuf) < 0) {
|
|
||||||
/* Index file does not exit -- force its creation
|
|
||||||
* and pretend it is older than fortune file
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((ifp = fopen (indexfile, "wb")) == NULL) {
|
|
||||||
eprintf ("%s: Cannot fopen \"%s\": %s",
|
|
||||||
argv [0], indexfile, strerror (errno));
|
|
||||||
exit (3);
|
|
||||||
}
|
|
||||||
fclose (ifp);
|
|
||||||
statbuf.st_mtime = 0;
|
|
||||||
}
|
|
||||||
if (statbuf.st_mtime < fortune_time) {
|
|
||||||
/* Index file does either not exist or is older
|
|
||||||
* than fortune file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((ffp = fopen (fortunefile, "r")) == NULL) {
|
|
||||||
eprintf ("%s: Cannot fopen \"%s\": %s",
|
|
||||||
argv [0], fortunefile, strerror (errno));
|
|
||||||
exit (2);
|
|
||||||
}
|
|
||||||
if ((ifp = fopen (indexfile, "r+b")) == NULL) {
|
|
||||||
eprintf ("%s: Cannot fopen \"%s\": %s",
|
|
||||||
argv [0], indexfile, strerror (errno));
|
|
||||||
exit (3);
|
|
||||||
}
|
|
||||||
cnt = 0;
|
|
||||||
fwritelong (ifp, 0, cnt);
|
|
||||||
ipos = RECLEN * 2;
|
|
||||||
while (fgets (line, sizeof (line), ffp)) {
|
|
||||||
if (STREQ (line, DELIMITER)) {
|
|
||||||
pos = ftell (ffp);
|
|
||||||
fwritelong (ifp, ipos, pos);
|
|
||||||
++ cnt;
|
|
||||||
ipos += RECLEN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fwritelong (ifp, 0, cnt);
|
|
||||||
fclose (ifp);
|
|
||||||
fclose (ffp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Now that we have a valid index file, open it and choose a fortune
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((ifp = fopen (indexfile, "r+b")) == NULL) {
|
|
||||||
eprintf ("%s: Cannot fopen \"%s\": %s",
|
|
||||||
argv [0], indexfile, strerror (errno));
|
|
||||||
exit (4);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ffp = fopen (fortunefile, "r")) == NULL) {
|
|
||||||
eprintf ("%s: Cannot fopen \"%s\": %s",
|
|
||||||
argv [0], fortunefile, strerror (errno));
|
|
||||||
exit (5);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get number of entries */
|
|
||||||
cnt = freadlong (ifp, 0);
|
|
||||||
|
|
||||||
if (cnt == 0) {
|
|
||||||
eprintf ("%s: empty fortune file\n", argv [0]);
|
|
||||||
exit (6);
|
|
||||||
}
|
|
||||||
|
|
||||||
nr = freadlong (ifp, RECLEN);
|
|
||||||
nr ++;
|
|
||||||
if (nr >= cnt) nr = 0;
|
|
||||||
fwritelong (ifp, RECLEN, nr);
|
|
||||||
|
|
||||||
/* Now look for the start of the fortune in the index file */
|
|
||||||
pos = freadlong (ifp, (nr + 2) * RECLEN);
|
|
||||||
|
|
||||||
/* And seek to it in the fortune file */
|
|
||||||
fseek (ffp, pos, SEEK_SET);
|
|
||||||
|
|
||||||
/* write one fortune */
|
|
||||||
while (fgets (line, sizeof (line), ffp) && ! STREQ (line, DELIMITER)) {
|
|
||||||
fputs (line, stdout);
|
|
||||||
}
|
|
||||||
fclose (ifp);
|
|
||||||
fclose (ffp);
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,13 +0,0 @@
|
||||||
include GNUmakevars
|
|
||||||
include GNUmakerules
|
|
||||||
|
|
||||||
fotoindex:
|
|
||||||
|
|
||||||
install: /usr/local/bin/fotoindex
|
|
||||||
|
|
||||||
|
|
||||||
/usr/local/man/man8/%.8: %.man
|
|
||||||
$(INSTALL) $< $@
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.gif *.jpg core foo bar baz
|
|
|
@ -1,57 +0,0 @@
|
||||||
#!/usr/local/bin/perl
|
|
||||||
#
|
|
||||||
# Combine several images into an index image (e.g., for use as an imagemap).
|
|
||||||
#
|
|
||||||
# Usage: fotoindex [-o outputfile] [templatefile]
|
|
||||||
#
|
|
||||||
# The first three lines give the width and height of the thumbnails and
|
|
||||||
# the number of thumbnails per row. The remaining lines are file names
|
|
||||||
# of the images to be combined.
|
|
||||||
|
|
||||||
open(STDERR, ">/tmp/fotoindex.$$.debug");
|
|
||||||
|
|
||||||
$giftopnm = "/usr/local/bin/giftopnm";
|
|
||||||
$pnmscale = "/usr/local/bin/pnmscale";
|
|
||||||
$pbmmake = "/usr/local/bin/pbmmake";
|
|
||||||
$pnmpaste = "/usr/local/bin/pnmpaste";
|
|
||||||
$cjpeg = "/usr/local/bin/cjpeg";
|
|
||||||
|
|
||||||
if ($ARGV[0] eq "-o") {
|
|
||||||
shift;
|
|
||||||
$outputredirect = ">" . shift;
|
|
||||||
}
|
|
||||||
|
|
||||||
@file = (<>);
|
|
||||||
chomp(@file);
|
|
||||||
|
|
||||||
# Remove empty and comment lines
|
|
||||||
for ($i = 0; $i <= $#file;) {
|
|
||||||
if ($file[$i] =~ m/^(\#|\s*$)/ ) {
|
|
||||||
splice(@file, $i, 1);
|
|
||||||
} else {
|
|
||||||
$i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$tnw = shift(@file);
|
|
||||||
$tnh = shift(@file);
|
|
||||||
$fw = shift(@file);
|
|
||||||
$fh = int(($#file + 1 + ($fw - 1)) / $fw);
|
|
||||||
|
|
||||||
system ("$pbmmake " . $fw * $tnw . " " . $fh * $tnh . "> /tmp/fotoindex.$$.1.pnm");
|
|
||||||
|
|
||||||
|
|
||||||
for ($i = 0; $i < $fh; $i ++) {
|
|
||||||
for ($j = 0; $j < $fw; $j++) {
|
|
||||||
$pic = $file[$i * $fw + $j];
|
|
||||||
if (-f $pic) {
|
|
||||||
$cmnd = "$giftopnm $pic | $pnmscale -xysize $tnw $tnh > $pic.$$.pnm";
|
|
||||||
system ($cmnd);
|
|
||||||
system ("$pnmpaste $pic.$$.pnm " . $j * $tnw . " " . $i * $tnh . " /tmp/fotoindex.$$.1.pnm > /tmp/fotoindex.$$.2.pnm");
|
|
||||||
rename ("/tmp/fotoindex.$$.2.pnm", "/tmp/fotoindex.$$.1.pnm");
|
|
||||||
unlink ("$pic.$$.pnm");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
system("$cjpeg -progressive /tmp/fotoindex.$$.1.pnm $outputredirect");
|
|
||||||
unlink ("/tmp/fotoindex.$$.1.pnm");
|
|
|
@ -1,13 +0,0 @@
|
||||||
include GNUmakevars
|
|
||||||
include GNUmakerules
|
|
||||||
|
|
||||||
ftcp: ftcp.o
|
|
||||||
$(CC) $^ -o $@
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.o ftcp core foo bar
|
|
||||||
|
|
||||||
install: $(BINDIR)/ftcp
|
|
||||||
|
|
||||||
distclean: clean
|
|
||||||
rm -f *.bak *.d
|
|
105
ftcp/ftcp.c
105
ftcp/ftcp.c
|
@ -1,105 +0,0 @@
|
||||||
char ftcp_rcs_id[] =
|
|
||||||
"$Id: ftcp.c,v 1.1 2002-03-18 20:40:08 hjp Exp $";
|
|
||||||
/*
|
|
||||||
ftcp - fault tolerant copy
|
|
||||||
|
|
||||||
copy one file to another, ignoring any errors.
|
|
||||||
This is useful for copying files from defective media.
|
|
||||||
*/
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include <ant/io.h>
|
|
||||||
#include <ant/string.h>
|
|
||||||
|
|
||||||
char *cmnd;
|
|
||||||
|
|
||||||
|
|
||||||
off_t skip_size = 512;
|
|
||||||
size_t buf_size = 512;
|
|
||||||
|
|
||||||
static void usage(void)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Usage: %s [-s skip_size] source dest\n", cmnd);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int ftcp(char const *src, char const *dest)
|
|
||||||
{
|
|
||||||
int sfd, dfd, count;
|
|
||||||
char *buf;
|
|
||||||
off_t off = 0;
|
|
||||||
|
|
||||||
if ((buf = malloc(buf_size)) == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
sfd = open(src, O_RDONLY);
|
|
||||||
if (sfd < 0)
|
|
||||||
return -1;
|
|
||||||
dfd = open(dest, O_WRONLY|O_CREAT|O_TRUNC, 0666);
|
|
||||||
if (dfd < 0)
|
|
||||||
{
|
|
||||||
close(sfd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
for (;;) {
|
|
||||||
lseek(sfd, off, SEEK_SET);
|
|
||||||
count = read(sfd, buf, buf_size);
|
|
||||||
switch (count) {
|
|
||||||
case -1:
|
|
||||||
fprintf(stderr, "%s: error at offset %lu: %s\n",
|
|
||||||
cmnd, (unsigned long)off, strerror(errno));
|
|
||||||
off += skip_size;
|
|
||||||
break;
|
|
||||||
case 0:
|
|
||||||
goto the_end;
|
|
||||||
default:
|
|
||||||
lseek(dfd, off, SEEK_SET);
|
|
||||||
write(dfd, buf, count);
|
|
||||||
off += count;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
the_end:
|
|
||||||
|
|
||||||
close(sfd);
|
|
||||||
close(dfd);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
int c;
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
cmnd = argv[0];
|
|
||||||
|
|
||||||
while ((c = getopt(argc, argv, "s:")) != EOF) {
|
|
||||||
switch (c) {
|
|
||||||
case 's':
|
|
||||||
skip_size = strtoul(optarg, &p, 0);
|
|
||||||
if (p == optarg || *p != '\0') usage();
|
|
||||||
break;
|
|
||||||
case '?':
|
|
||||||
usage();
|
|
||||||
default:
|
|
||||||
assert(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (optind != argc - 2) {
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
ftcp(argv[optind], argv[optind+1]);
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,36 +0,0 @@
|
||||||
include GNUmakevars
|
|
||||||
|
|
||||||
CONFDIR=../../configure
|
|
||||||
CONFDIR_exists=$(shell [ -d $(CONFDIR) ] && echo ok)
|
|
||||||
|
|
||||||
all: configure grouplist groupmatch groupcount
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm grouplist groupmatch
|
|
||||||
|
|
||||||
install: \
|
|
||||||
$(BINDIR)/grouplist \
|
|
||||||
$(BINDIR)/groupmatch \
|
|
||||||
$(BINDIR)/groupcount \
|
|
||||||
|
|
||||||
|
|
||||||
%: %.pl customize
|
|
||||||
sh ./customize < $< > $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
customize: configure
|
|
||||||
sh ./configure
|
|
||||||
|
|
||||||
ifeq ($(CONFDIR_exists),ok)
|
|
||||||
|
|
||||||
configure: $(CONFDIR)/start $(CONFDIR)/perl $(CONFDIR)/finish
|
|
||||||
cat $^ > $@
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
GNUmakevars: GNUmakevars.sh
|
|
||||||
sh ./$^ > $@
|
|
||||||
GNUmakerules: GNUmakerules.pl
|
|
||||||
perl ./$^ > $@
|
|
||||||
|
|
||||||
include GNUmakerules
|
|
|
@ -1,8 +0,0 @@
|
||||||
#!/usr/bin/perl
|
|
||||||
use warnings;
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
print "\$(BINDIR)/%: %\n";
|
|
||||||
print "\tcp \$^ \$@\n";
|
|
||||||
print "\$(MAN1DIR)/%: %\n";
|
|
||||||
print "\tcp \$^ \$@\n";
|
|
|
@ -1,3 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
echo "\$(BINDIR)/%: %"
|
|
||||||
echo -e "\tcp \$^ \$@"
|
|
|
@ -1,5 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
prefix=${prefix:-/usr/local}
|
|
||||||
echo "BINDIR=$prefix/bin"
|
|
||||||
echo
|
|
||||||
echo "all:"
|
|
|
@ -1,34 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
echo "#!/bin/sh" > customize.$$
|
|
||||||
echo "sed \\" > customize.$$
|
|
||||||
chmod +x customize.$$
|
|
||||||
|
|
||||||
################################################################
|
|
||||||
# find a working perl:
|
|
||||||
#
|
|
||||||
for i in /usr/bin/perl /usr/local/bin/perl /usr/bin/perl5 /usr/local/bin/perl5
|
|
||||||
do
|
|
||||||
if $i -e 'exit ($] < 5.000)'
|
|
||||||
then
|
|
||||||
echo $i works
|
|
||||||
perl="$i"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [ -z "$perl" ]
|
|
||||||
then
|
|
||||||
echo could not find a working perl command, sorry.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo " -e 's,@@@perl@@@,$perl,g' \\" >> customize.$$
|
|
||||||
|
|
||||||
|
|
||||||
################################################################
|
|
||||||
# finish
|
|
||||||
# Add trailing newline and rename temp file to final name
|
|
||||||
#
|
|
||||||
echo >> customize.$$
|
|
||||||
|
|
||||||
mv customize.$$ customize
|
|
||||||
|
|
|
@ -1,52 +0,0 @@
|
||||||
#!@@@perl@@@ -w
|
|
||||||
|
|
||||||
=head1 NAME
|
|
||||||
|
|
||||||
groupcount - count number of groups of all users
|
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
|
||||||
|
|
||||||
groupcount
|
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
|
||||||
|
|
||||||
This script counts the number of groups each user is a member of.
|
|
||||||
|
|
||||||
=head1 AUTHOR
|
|
||||||
|
|
||||||
Peter J. Holzer <hjp@wsr.ac.at>
|
|
||||||
|
|
||||||
=head1 SEE ALSO
|
|
||||||
|
|
||||||
id(1)
|
|
||||||
|
|
||||||
=cut
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use Getopt::Long;
|
|
||||||
|
|
||||||
my $debug = 0;
|
|
||||||
my $fullname = 0;
|
|
||||||
GetOptions("debug" => \$debug,
|
|
||||||
"fullname" => \$fullname);
|
|
||||||
|
|
||||||
|
|
||||||
my $u = {};
|
|
||||||
my $g = {};
|
|
||||||
|
|
||||||
while (my @gr = getgrent()) {
|
|
||||||
|
|
||||||
my ($name,$passwd,$gid,$members) = @gr;
|
|
||||||
$g->{$gid} = $name;
|
|
||||||
for my $i (split(/ /, $members)) {
|
|
||||||
print STDERR "getgrent: $gid: $i\n" if($debug);
|
|
||||||
$u->{$i}{$name} = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
while (my @pw = getpwent()) {
|
|
||||||
my ($name,$passwd,$uid,$gid, $quota,$comment,$gcos,$dir,$shell,$expire) = @pw;
|
|
||||||
$u->{$name}{$g->{$gid}} = 1;
|
|
||||||
printf("%-10s %3d\n", $name, scalar(keys(%{$u->{$name}})));
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,85 +0,0 @@
|
||||||
#!@@@perl@@@ -w
|
|
||||||
|
|
||||||
=head1 NAME
|
|
||||||
|
|
||||||
groulist - list all members of a group
|
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
|
||||||
|
|
||||||
grouplist [--fullname] group
|
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
|
||||||
|
|
||||||
This script lists all members of a group.
|
|
||||||
For each user, the loginname, whether this is the primary or a supplemental group
|
|
||||||
of the user, and optionally the full name (from the GECOS field) is printed.
|
|
||||||
|
|
||||||
=head2 Options
|
|
||||||
|
|
||||||
=over 4
|
|
||||||
|
|
||||||
=item --fullname
|
|
||||||
|
|
||||||
Print the GECOS field.
|
|
||||||
|
|
||||||
=item --debug
|
|
||||||
|
|
||||||
Prints some debug output to stderr.
|
|
||||||
|
|
||||||
=back
|
|
||||||
|
|
||||||
=head1 AUTHOR
|
|
||||||
|
|
||||||
Peter J. Holzer <hjp@wsr.ac.at>
|
|
||||||
|
|
||||||
=head1 SEE ALSO
|
|
||||||
|
|
||||||
id(1)
|
|
||||||
|
|
||||||
=cut
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use Getopt::Long;
|
|
||||||
|
|
||||||
my $debug = 0;
|
|
||||||
my $fullname = 0;
|
|
||||||
GetOptions("debug" => \$debug,
|
|
||||||
"fullname" => \$fullname);
|
|
||||||
|
|
||||||
|
|
||||||
my $u = {};
|
|
||||||
|
|
||||||
my @gr;
|
|
||||||
@gr = getgrnam($ARGV[0]);
|
|
||||||
unless (@gr) {
|
|
||||||
print STDERR "$0: Group $ARGV[0] not found\n";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
my ($name,$passwd,$gid,$members) = @gr;
|
|
||||||
for my $i (split(/ /, $members)) {
|
|
||||||
print STDERR "getgrent: $gid: $i\n" if($debug);
|
|
||||||
$u->{$i}{s} = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (my @pw = getpwent()) {
|
|
||||||
my ($name,$passwd,$uid,$ugid, $quota,$comment,$gcos,$dir,$shell,$expire) = @pw;
|
|
||||||
print STDERR "getpwent: $ugid: $name\n" if($debug);
|
|
||||||
if ($ugid == $gid) {
|
|
||||||
$u->{$name}{p} = 1;
|
|
||||||
$u->{$name}{fn} = $gcos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for my $i (keys %$u) {
|
|
||||||
printf("%-10s %1s%1s", $i, $u->{$i}{p} ? "p" : " ", $u->{$i}{s} ? "s" : " ");
|
|
||||||
if ($fullname) {
|
|
||||||
if (!$u->{$i}{fn}) {
|
|
||||||
my @pw = getpwnam($i);
|
|
||||||
my ($name,$passwd,$uid,$ugid, $quota,$comment,$gcos,$dir,$shell,$expire) = @pw;
|
|
||||||
$u->{$i}{fn} = $gcos;
|
|
||||||
}
|
|
||||||
printf(" %s", $u->{$i}{fn});
|
|
||||||
}
|
|
||||||
print "\n";
|
|
||||||
}
|
|
|
@ -1,128 +0,0 @@
|
||||||
#!@@@perl@@@ -w
|
|
||||||
|
|
||||||
=head1 NAME
|
|
||||||
|
|
||||||
groupmatch - find best matching group for list of users
|
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
|
||||||
|
|
||||||
groupmatch [--cut value] [--allmembers] [--debug] [--miss value] user ...
|
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
|
||||||
|
|
||||||
This script takes a list of users and prints the group(s) which
|
|
||||||
are the closest match (i.e. have the least number of missing or
|
|
||||||
superfluous users).
|
|
||||||
|
|
||||||
For each group, the gid, group name, number of differences, and list of
|
|
||||||
users which are missing (marked (-)) or too much (+) is printed.
|
|
||||||
|
|
||||||
=head2 Options
|
|
||||||
|
|
||||||
=over 4
|
|
||||||
|
|
||||||
=item --cut value
|
|
||||||
|
|
||||||
Sets the cutoff value. Only groups with at most this number of
|
|
||||||
differences to the specified list of users are printed. By default the
|
|
||||||
cutoff value is set so that only the best matching group(s) are printed.
|
|
||||||
|
|
||||||
=item --allmembers
|
|
||||||
|
|
||||||
Prints all members of the group, not only the differences to the
|
|
||||||
specified list. Users which are already in the group are marked (*).
|
|
||||||
|
|
||||||
=item --debug
|
|
||||||
|
|
||||||
Prints some debug output to stderr.
|
|
||||||
|
|
||||||
=item --miss value
|
|
||||||
|
|
||||||
Penalty for missing users in a group. Default is 1, i.e., a user missing
|
|
||||||
is just as bad as a superfluous user. Larger values bias towards groups
|
|
||||||
with too many users, smaller values bias towards groups with too few users.
|
|
||||||
|
|
||||||
=back
|
|
||||||
|
|
||||||
=head1 AUTHOR
|
|
||||||
|
|
||||||
Peter J. Holzer <hjp@wsr.ac.at>
|
|
||||||
|
|
||||||
=head1 SEE ALSO
|
|
||||||
|
|
||||||
id(1)
|
|
||||||
|
|
||||||
=cut
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use Getopt::Long;
|
|
||||||
|
|
||||||
sub diffsym {
|
|
||||||
my ($diff) = @_;
|
|
||||||
if ($diff == 0) { return "*"; }
|
|
||||||
if ($diff < 0) { return "-"; }
|
|
||||||
if ($diff > 0) { return "+"; }
|
|
||||||
return "?";
|
|
||||||
}
|
|
||||||
|
|
||||||
my $cut = undef;
|
|
||||||
my $debug = 0;
|
|
||||||
my $allmembers = 0;
|
|
||||||
my $miss = 1;
|
|
||||||
GetOptions("cut=i" => \$cut,
|
|
||||||
"debug" => \$debug,
|
|
||||||
"allmembers" => \$allmembers,
|
|
||||||
"miss=f" => \$miss,
|
|
||||||
);
|
|
||||||
my $gr = {};
|
|
||||||
|
|
||||||
my @gr;
|
|
||||||
while (@gr = getgrent) {
|
|
||||||
my ($name,$passwd,$gid,$members) = @gr;
|
|
||||||
for my $i (split(/ /, $members)) {
|
|
||||||
print STDERR "getgrent: $gid: $i\n" if($debug);
|
|
||||||
$gr->{$gid}->{Members}->{$i} = 1;
|
|
||||||
$gr->{$gid}->{Name} = $name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
my @pw;
|
|
||||||
while (@pw = getpwent()) {
|
|
||||||
my ($name,$passwd,$uid,$gid, $quota,$comment,$gcos,$dir,$shell,$expire) = @pw;
|
|
||||||
print STDERR "getpwent: $gid: $name\n" if($debug);
|
|
||||||
$gr->{$gid}->{Members}->{$name} = 1;
|
|
||||||
|
|
||||||
}
|
|
||||||
for my $g (keys %$gr) {
|
|
||||||
for my $u (@ARGV) {
|
|
||||||
$gr->{$g}->{Members}->{$u} = (($gr->{$g}->{Members}->{$u} || 0) - 1) * $miss;
|
|
||||||
}
|
|
||||||
my $score = 0;
|
|
||||||
for my $u (keys(%{$gr->{$g}->{Members}})) {
|
|
||||||
$score += abs($gr->{$g}->{Members}->{$u});
|
|
||||||
}
|
|
||||||
print STDERR "$g: $score\n" if($debug);
|
|
||||||
$gr->{$g}->{Score} = $score;
|
|
||||||
}
|
|
||||||
if ($debug) {
|
|
||||||
print STDERR "\nScore list:\n";
|
|
||||||
for my $g (keys %$gr) {
|
|
||||||
print STDERR "$g: ", $gr->{$g}->{Score}, "\n";
|
|
||||||
}
|
|
||||||
print STDERR "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
for my $g (sort { $gr->{$a}->{Score} <=> $gr->{$b}->{Score} } keys %$gr) {
|
|
||||||
$cut = $gr->{$g}->{Score} unless ($cut);
|
|
||||||
next unless ($gr->{$g}->{Name});
|
|
||||||
last if ($gr->{$g}->{Score} > $cut);
|
|
||||||
|
|
||||||
print "$g: ",
|
|
||||||
$gr->{$g}->{Name}, ": ",
|
|
||||||
$gr->{$g}->{Score}, ": ";
|
|
||||||
for my $u (sort keys(%{$gr->{$g}->{Members}})) {
|
|
||||||
if ($allmembers || $gr->{$g}->{Members}->{$u}) {
|
|
||||||
print "$u(", diffsym($gr->{$g}->{Members}->{$u}), ") ";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print "\n";
|
|
||||||
}
|
|
|
@ -1,3 +0,0 @@
|
||||||
int main(void) {
|
|
||||||
for (;;);
|
|
||||||
}
|
|
10
hogs/cpuhogt
10
hogs/cpuhogt
|
@ -1,10 +0,0 @@
|
||||||
#!/usr/bin/perl
|
|
||||||
use v5.20;
|
|
||||||
use warnings;
|
|
||||||
|
|
||||||
use Time::HiRes qw(time);
|
|
||||||
my $t0 = time;
|
|
||||||
for (;;) {
|
|
||||||
my $dt = time - $t0;
|
|
||||||
last if $dt > $ARGV[0];
|
|
||||||
}
|
|
|
@ -1,10 +0,0 @@
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
size_t size = strtoul(argv[1], NULL, 0);
|
|
||||||
char *p = malloc(size);
|
|
||||||
printf("%zu bytes at %p\n", size, p);
|
|
||||||
sleep(10);
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,31 +0,0 @@
|
||||||
#include <errno.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
size_t s = 0x100000;
|
|
||||||
size_t sum = 0;
|
|
||||||
|
|
||||||
while (s) {
|
|
||||||
void *p;
|
|
||||||
errno = 0;
|
|
||||||
if (p = malloc(s)) {
|
|
||||||
sum += s;
|
|
||||||
printf("%lu - %lu\n",
|
|
||||||
(unsigned long)s,
|
|
||||||
(unsigned long)sum);
|
|
||||||
sleep (1);
|
|
||||||
memset(p, 'a', s);
|
|
||||||
s *= 2;
|
|
||||||
} else {
|
|
||||||
printf("%lu - %lu: %s\n",
|
|
||||||
(unsigned long)s,
|
|
||||||
(unsigned long)sum,
|
|
||||||
strerror(errno)
|
|
||||||
);
|
|
||||||
s /= 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
ieeefloat
|
|
|
@ -1,20 +0,0 @@
|
||||||
include GNUmakevars
|
|
||||||
|
|
||||||
all: ieeefloat
|
|
||||||
install: $(BINDIR)/ieeefloat
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.bak *.o core ieeefloat
|
|
||||||
|
|
||||||
distclean: clean
|
|
||||||
rm -f *.d GNUmakerules GNUmakevars
|
|
||||||
|
|
||||||
ieeefloat: ieeefloat.o
|
|
||||||
|
|
||||||
GNUmakevars: GNUmakevars.sh
|
|
||||||
sh ./$^ > $@
|
|
||||||
GNUmakerules: GNUmakerules.sh
|
|
||||||
sh ./$^ > $@
|
|
||||||
|
|
||||||
include GNUmakerules
|
|
||||||
-include *.d
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue