From c314690b25b449e079fce8b215a3e96924898578 Mon Sep 17 00:00:00 2001 From: ianmdlvl Date: Wed, 2 Jul 2003 18:20:29 +0000 Subject: [PATCH] stuff from chiark:/usr/local/src/misc/ (as found) --- cprogs/myopt.c | 96 +++++++++++++ cprogs/myopt.c~ | 84 +++++++++++ cprogs/myopt.h | 43 ++++++ cprogs/myopt.h~ | 41 ++++++ cprogs/really | Bin 0 -> 30078 bytes cprogs/really-test | Bin 0 -> 22962 bytes cprogs/really.c | 210 ++++++++++++++++++++++++++++ cprogs/really.c~ | 209 +++++++++++++++++++++++++++ cprogs/really.testcases | 164 ++++++++++++++++++++++ cprogs/smtpallow.c | 44 ++++++ cprogs/smtpallow.c~ | 35 +++++ cprogs/smtpallow.o | Bin 0 -> 1420 bytes cprogs/smtpallow.so | Bin 0 -> 3930 bytes cprogs/usernice.c | 67 +++++++++ cprogs/usr-local-src-misc-Makefile | 18 +++ cprogs/usr-local-src-misc-Makefile~ | 9 ++ debian/changelog | 5 + scripts/cvsweb-list | 56 ++++++++ scripts/cvsweb-list~ | 55 ++++++++ 19 files changed, 1136 insertions(+) create mode 100644 cprogs/myopt.c create mode 100644 cprogs/myopt.c~ create mode 100644 cprogs/myopt.h create mode 100644 cprogs/myopt.h~ create mode 100755 cprogs/really create mode 100755 cprogs/really-test create mode 100644 cprogs/really.c create mode 100644 cprogs/really.c~ create mode 100755 cprogs/really.testcases create mode 100644 cprogs/smtpallow.c create mode 100644 cprogs/smtpallow.c~ create mode 100644 cprogs/smtpallow.o create mode 100755 cprogs/smtpallow.so create mode 100644 cprogs/usernice.c create mode 100644 cprogs/usr-local-src-misc-Makefile create mode 100644 cprogs/usr-local-src-misc-Makefile~ create mode 100755 scripts/cvsweb-list create mode 100755 scripts/cvsweb-list~ diff --git a/cprogs/myopt.c b/cprogs/myopt.c new file mode 100644 index 0000000..ab89df8 --- /dev/null +++ b/cprogs/myopt.c @@ -0,0 +1,96 @@ +/* + * libdpkg - Debian packaging suite library routines + * myopt.c - my very own option parsing + * + * Copyright (C) 1994,1995 Ian Jackson + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this file; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include + +#include "myopt.h" + +void badusage(const char *fmt, ...) { + va_list al; + + va_start(al,fmt); + vfprintf(stderr,fmt,al); + va_end(al); + fputc('\n',stderr); + usagemessage(); + exit(-1); +} + +void myopt(const char *const **argvp, const struct cmdinfo *cmdinfos) { + const struct cmdinfo *cip; + const char *p, *value; + int l; + + ++(*argvp); + while ((p= **argvp) && *p == '-') { + ++(*argvp); + if (!strcmp(p,"--")) break; + if (*++p == '-') { + ++p; value=0; + for (cip= cmdinfos; + cip->olong || cip->oshort; + cip++) { + if (!cip->olong) continue; + if (!strcmp(p,cip->olong)) break; + l= strlen(cip->olong); + if (!strncmp(p,cip->olong,l) && + (p[l]== ((cip->takesvalue==2) ? '-' : '='))) { value=p+l+1; break; } + } + if (!cip->olong) badusage("unknown option --%s",p); + if (cip->takesvalue) { + if (!value) { + value= *(*argvp)++; + if (!value) badusage("--%s option takes a value",cip->olong); + } + if (cip->call) cip->call(cip,value); + else *cip->sassignto= value; + } else { + if (value) badusage("--%s option does not take a value",cip->olong); + if (cip->call) cip->call(cip,0); + else *cip->iassignto= cip->arg; + } + } else { + while (*p) { + for (cip= cmdinfos; (cip->olong || cip->oshort) && *p != cip->oshort; cip++); + if (!cip->oshort) badusage("unknown option -%c",*p); + p++; + if (cip->takesvalue) { + if (!*p) { + value= *(*argvp)++; + if (!value) badusage("-%c option takes a value",cip->oshort); + } else { + value= p; p=""; + if (*value == '=') value++; + } + if (cip->call) cip->call(cip,value); + else *cip->sassignto= value; + } else { + if (*p == '=') badusage("-%c option does not take a value",cip->oshort); + if (cip->call) cip->call(cip,0); + else *cip->iassignto= cip->arg; + } + } + } + } +} diff --git a/cprogs/myopt.c~ b/cprogs/myopt.c~ new file mode 100644 index 0000000..b3c2167 --- /dev/null +++ b/cprogs/myopt.c~ @@ -0,0 +1,84 @@ +/* + * libdpkg - Debian packaging suite library routines + * myopt.c - my very own option parsing + * + * Copyright (C) 1994,1995 Ian Jackson + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this file; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include + +#include "config.h" +#include "myopt.h" +#include "dpkg.h" + +void myopt(const char *const **argvp, const struct cmdinfo *cmdinfos) { + const struct cmdinfo *cip; + const char *p, *value; + int l; + + ++(*argvp); + while ((p= **argvp) && *p == '-') { + ++(*argvp); + if (!strcmp(p,"--")) break; + if (*++p == '-') { + ++p; value=0; + for (cip= cmdinfos; + cip->olong || cip->oshort; + cip++) { + if (!cip->olong) continue; + if (!strcmp(p,cip->olong)) break; + l= strlen(cip->olong); + if (!strncmp(p,cip->olong,l) && + (p[l]== ((cip->takesvalue==2) ? '-' : '='))) { value=p+l+1; break; } + } + if (!cip->olong) badusage("unknown option --%s",p); + if (cip->takesvalue) { + if (!value) { + value= *(*argvp)++; + if (!value) badusage("--%s option takes a value",cip->olong); + } + if (cip->call) cip->call(cip,value); + else *cip->sassignto= value; + } else { + if (value) badusage("--%s option does not take a value",cip->olong); + if (cip->call) cip->call(cip,0); + else *cip->iassignto= cip->arg; + } + } else { + while (*p) { + for (cip= cmdinfos; (cip->olong || cip->oshort) && *p != cip->oshort; cip++); + if (!cip->oshort) badusage("unknown option -%c",*p); + p++; + if (cip->takesvalue) { + if (!*p) { + value= *(*argvp)++; + if (!value) badusage("-%c option takes a value",cip->oshort); + } else { + value= p; p=""; + if (*value == '=') value++; + } + if (cip->call) cip->call(cip,value); + else *cip->sassignto= value; + } else { + if (*p == '=') badusage("-%c option does not take a value",cip->oshort); + if (cip->call) cip->call(cip,0); + else *cip->iassignto= cip->arg; + } + } + } + } +} diff --git a/cprogs/myopt.h b/cprogs/myopt.h new file mode 100644 index 0000000..6e1200c --- /dev/null +++ b/cprogs/myopt.h @@ -0,0 +1,43 @@ +/* + * myopt.h - declarations for my very own option parsing + * + * Copyright (C) 1994,1995 Ian Jackson + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this file; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef MYOPT_H +#define MYOPT_H + +extern void usagemessage(void); /* supply this */ + +typedef void (*voidfnp)(void); + +struct cmdinfo { + const char *olong; + char oshort; + int takesvalue; /* 0 = normal 1 = standard value 2 = option string cont */ + int *iassignto; + const char **sassignto; + void (*call)(const struct cmdinfo*, const char *value); + int arg; + void *parg; + voidfnp farg; +}; + +void myopt(const char *const **argvp, const struct cmdinfo *cmdinfos); +void badusage(const char *fmt, ...); + +#endif /* MYOPT_H */ diff --git a/cprogs/myopt.h~ b/cprogs/myopt.h~ new file mode 100644 index 0000000..0b28d09 --- /dev/null +++ b/cprogs/myopt.h~ @@ -0,0 +1,41 @@ +/* + * libdpkg - Debian packaging suite library routines + * myopt.h - declarations for my very own option parsing + * + * Copyright (C) 1994,1995 Ian Jackson + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this file; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef MYOPT_H +#define MYOPT_H + +typedef void (*voidfnp)(void); + +struct cmdinfo { + const char *olong; + char oshort; + int takesvalue; /* 0 = normal 1 = standard value 2 = option string cont */ + int *iassignto; + const char **sassignto; + void (*call)(const struct cmdinfo*, const char *value); + int arg; + void *parg; + voidfnp farg; +}; + +void myopt(const char *const **argvp, const struct cmdinfo *cmdinfos); + +#endif /* MYOPT_H */ diff --git a/cprogs/really b/cprogs/really new file mode 100755 index 0000000000000000000000000000000000000000..083f0efee0bcf95848b874f65724bdd6719468f3 GIT binary patch literal 30078 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 E006CWW&i*H literal 0 HcmV?d00001 diff --git a/cprogs/really-test b/cprogs/really-test new file mode 100755 index 0000000000000000000000000000000000000000..d8d9b3e59ae815681c80d57758c229656e9adb7e GIT binary patch literal 22962 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 FUjf{1Q#}9x literal 0 HcmV?d00001 diff --git a/cprogs/really.c b/cprogs/really.c new file mode 100644 index 0000000..b240ea4 --- /dev/null +++ b/cprogs/really.c @@ -0,0 +1,210 @@ +/**/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "myopt.h" + +void usagemessage(void) { + if (fputs("usage: really [] [ ...] [--]" + " [ [ ...]]\n" + "user-options:\n" + " if no options given, set the uid to 0;\n" + " -u|--user also sets their default group list\n" + " -i|--useronly } set the uid\n" + " -I|--uidonly } but inherits the group list\n" + "group-options:\n" + " -z|--groupsclear only groups specified are to be used\n" + " -g|--group } add this to\n" + " -G|--gid } the group list\n", + stderr) == EOF) { perror("write usage"); exit(-1); } +} + +static const char *opt_user, *opt_useronly; +static int opt_groupsclear= 0, opt_ngids= 0, opt_uidonly= -1; +static int opt_gids[512]; + +static void af_group(const struct cmdinfo *cip, const char *value) { + struct group *gr; + + if (opt_ngids >= sizeof(opt_gids)/sizeof(opt_gids[0])) + badusage("too many groups specified"); + gr= getgrnam(value); + if (!gr) { fprintf(stderr,"unknown group `%s'\n",value); exit(-1); } + opt_gids[opt_ngids++]= gr->gr_gid; +} + +static void af_gid(const struct cmdinfo *cip, const char *value) { + char *ep; + unsigned long ul; + + if (opt_ngids >= sizeof(opt_gids)/sizeof(opt_gids[0])) + badusage("too many gids specified"); + ul= strtoul(value,&ep,0); + if ((*ep) || (uid_t)ul != ul || ul>INT_MAX) badusage("bad gid `%s'",value); + opt_gids[opt_ngids++]= ul; +} + +static void af_help(const struct cmdinfo *cip, const char *value) { + usagemessage(); exit(0); +} + +static const struct cmdinfo cmdinfos[]= { + { "user", 'u', 1, 0, &opt_user, 0, }, + { "useronly", 'i', 1, 0, &opt_useronly, 0 }, + { "uidonly", 'I', 1, &opt_uidonly, 0, 0 }, + { "groupsclear", 'z', 0, &opt_groupsclear, 0, 0, 1 }, + { "group", 'g', 1, 0, 0, af_group }, + { "gid", 'G', 1, 0, 0, af_gid }, + { "help", 'h', 0, 0, 0, af_help }, + { 0, 0 } +}; + +#ifdef REALLY_CHECK_FILE +static void checkroot(void) { + int r; + r= access(REALLY_CHECK_FILE,W_OK); + if (r) { perror("sorry"); exit(-1); } +} +#endif +#ifdef REALLY_CHECK_GID +static void checkroot(void) { + gid_t groups[512]; + int r; + + r= getgid(); if (r==REALLY_CHECK_GID) return; + if (r<0) { perror("getgid check"); exit(-1); } + r= getgroups(sizeof(groups)/sizeof(groups[0]),groups); + if (r<0) { perror("getgroups check"); exit(-1); } + for (i=0; ipw_uid; + } + orgmaingid= getgid(); + orgmainuid= getuid(); + if (orgmaingid<0) { perror("getgid failed"); exit(-1); } + if (opt_user) { + r= initgroups(opt_user,pw->pw_gid); + if (r) { perror("initgroups failed"); exit(-1); } + maingid= pw->pw_gid; + } else { + maingid= -1; + } + if (opt_groupsclear) { + ngroups= 0; + if (opt_ngids > sizeof(groups)/sizeof(groups[0])) { + fputs("too many groups to set\n",stderr); + exit(-1); + } + } else { + ngroups= getgroups(0,0); + if (ngroups<0) { perror("getgroups(0,0) failed"); exit(-1); } + if (ngroups+opt_ngids > sizeof(groups)/sizeof(groups[0])) { + fputs("too many groups already set for total to fit\n",stderr); + exit(-1); + } + ngroups= getgroups(ngroups,groups); + if (ngroups<0) { perror("getgroups failed"); exit(-1); } + } + if (opt_ngids) { + maingid= opt_gids[0]; + } + if (opt_ngids || opt_groupsclear) { + ngroups_in= ngroups; ngroups= 0; + for (i=0; i=0) { fputs("could seteuid 0",stderr); exit(-1); } + if (errno != EPERM) { + perror("unexpected failure mode for seteuid 0"); exit(-1); + } + } + r= getuid(); if (r<0) { perror("getuid failed"); exit(-1); } + if (r != mainuid) { fputs("getuid mismatch",stderr); exit(-1); } + r= geteuid(); if (r<0) { perror("geteuid failed"); exit(-1); } + if (r != mainuid) { fputs("geteuid mismatch",stderr); exit(-1); } + if (maingid != -1) { + for (i=0; i=ngroups && maingid != orgmaingid) { + r= setgid(orgmaingid); + if (r>=0) { fputs("could setgid back",stderr); exit(-1); } + if (errno != EPERM) { + perror("unexpected failure mode for setgid back"); exit(-1); + } + } + r= getgid(); if (r<0) { perror("getgid failed"); exit(-1); } + if (r != maingid) { fputs("getgid mismatch",stderr); exit(-1); } + r= getegid(); if (r<0) { perror("getegid failed"); exit(-1); } + if (r != maingid) { fputs("getegid mismatch",stderr); exit(-1); } + } + if (!*argv) { + cp= getenv("SHELL"); + if (!cp) cp= "sh"; + execlp(cp,cp,"-i",(const char*)0); + } else { + execvp(argv[0],(char**)argv); + } + perror("exec failed"); + exit(-1); +} diff --git a/cprogs/really.c~ b/cprogs/really.c~ new file mode 100644 index 0000000..19e642e --- /dev/null +++ b/cprogs/really.c~ @@ -0,0 +1,209 @@ +/**/ + +#include +#include +#include +#include +#include +#include +#include + +#include "myopt.h" + +void usagemessage(void) { + if (fputs("usage: really [] [ ...] [--]" + " [ [ ...]]\n" + "user-options:\n" + " if no options given, set the uid to 0;\n" + " -u|--user also sets their default group list\n" + " -i|--useronly } set the uid\n" + " -I|--uidonly } but inherits the group list\n" + "group-options:\n" + " -z|--groupsclear only groups specified are to be used\n" + " -g|--group } add this to\n" + " -G|--gid } the group list\n", + stderr) == EOF) { perror("write usage"); exit(-1); } +} + +static const char *opt_user, *opt_useronly; +static int opt_groupsclear= 0, opt_ngids= 0, opt_uidonly= -1; +static int opt_gids[512]; + +static void af_group(const struct cmdinfo *cip, const char *value) { + struct group *gr; + + if (opt_ngids >= sizeof(opt_gids)/sizeof(opt_gids[0])) + badusage("too many groups specified"); + gr= getgrnam(value); + if (!gr) { fprintf(stderr,"unknown group `%s'\n",value); exit(-1); } + opt_gids[opt_ngids++]= gr->gr_gid; +} + +static void af_gid(const struct cmdinfo *cip, const char *value) { + char *ep; + unsigned long ul; + + if (opt_ngids >= sizeof(opt_gids)/sizeof(opt_gids[0])) + badusage("too many gids specified"); + ul= strtoul(value,&ep,0); + if ((*ep) || (uid_t)ul != ul || ul>INT_MAX) badusage("bad gid `%s'",value); + opt_gids[opt_ngids++]= ul; +} + +static void af_help(const struct cmdinfo *cip, const char *value) { + usagemessage(); exit(0); +} + +static const struct cmdinfo cmdinfos[]= { + { "user", 'u', 1, 0, &opt_user, 0, }, + { "useronly", 'i', 1, 0, &opt_useronly, 0 }, + { "uidonly", 'I', 1, &opt_uidonly, 0, 0 }, + { "groupsclear", 'z', 0, &opt_groupsclear, 0, 0, 1 }, + { "group", 'g', 1, 0, 0, af_group }, + { "gid", 'G', 1, 0, 0, af_gid }, + { "help", 'h', 0, 0, 0, af_help }, + { 0, 0 } +}; + +#ifdef REALLY_CHECK_FILE +void checkroot(void) { + int r; + r= access(REALLY_CHECK_FILE,W_OK); + if (r) { perror("sorry"); exit(-1); } +} +#endif +#ifdef REALLY_CHECK_GID +void checkroot(void) { + gid_t groups[512]; + int r; + + r= getgid(); if (r==REALLY_CHECK_GID) return; + if (r<0) { perror("getgid check"); exit(-1); } + r= getgroups(sizeof(groups)/sizeof(groups[0]),groups); + if (r<0) { perror("getgroups check"); exit(-1); } + for (i=0; ipw_uid; + } + orgmaingid= getgid(); + orgmainuid= getuid(); + if (orgmaingid<0) { perror("getgid failed"); exit(-1); } + if (opt_user) { + r= initgroups(opt_user,pw->pw_gid); + if (r) { perror("initgroups failed"); exit(-1); } + maingid= pw->pw_gid; + } else { + maingid= -1; + } + if (opt_groupsclear) { + ngroups= 0; + if (opt_ngids > sizeof(groups)/sizeof(groups[0])) { + fputs("too many groups to set\n",stderr); + exit(-1); + } + } else { + ngroups= getgroups(0,0); + if (ngroups<0) { perror("getgroups(0,0) failed"); exit(-1); } + if (ngroups+opt_ngids > sizeof(groups)/sizeof(groups[0])) { + fputs("too many groups already set for total to fit\n",stderr); + exit(-1); + } + ngroups= getgroups(ngroups,groups); + if (ngroups<0) { perror("getgroups failed"); exit(-1); } + } + if (opt_ngids) { + maingid= opt_gids[0]; + } + if (opt_ngids || opt_groupsclear) { + ngroups_in= ngroups; ngroups= 0; + for (i=0; i=0) { fputs("could seteuid 0",stderr); exit(-1); } + if (errno != EPERM) { + perror("unexpected failure mode for seteuid 0"); exit(-1); + } + } + r= getuid(); if (r<0) { perror("getuid failed"); exit(-1); } + if (r != mainuid) { fputs("getuid mismatch",stderr); exit(-1); } + r= geteuid(); if (r<0) { perror("geteuid failed"); exit(-1); } + if (r != mainuid) { fputs("geteuid mismatch",stderr); exit(-1); } + if (maingid != -1) { + for (i=0; i=ngroups && maingid != orgmaingid) { + r= setgid(orgmaingid); + if (r>=0) { fputs("could setgid back",stderr); exit(-1); } + if (errno != EPERM) { + perror("unexpected failure mode for setgid back"); exit(-1); + } + } + r= getgid(); if (r<0) { perror("getgid failed"); exit(-1); } + if (r != maingid) { fputs("getgid mismatch",stderr); exit(-1); } + r= getegid(); if (r<0) { perror("getegid failed"); exit(-1); } + if (r != maingid) { fputs("getegid mismatch",stderr); exit(-1); } + } + if (!*argv) { + cp= getenv("SHELL"); + if (!cp) cp= "sh"; + execlp(cp,cp,"-i",(const char*)0); + } else { + execvp(argv[0],(char**)argv); + } + perror("exec failed"); + exit(-1); +} diff --git a/cprogs/really.testcases b/cprogs/really.testcases new file mode 100755 index 0000000..153e47c --- /dev/null +++ b/cprogs/really.testcases @@ -0,0 +1,164 @@ +#!/usr/bin/perl + +$testuser= 'testac'; +$testgroup= 'testac'; +$testuid= 1000; +$testgid= 1000; +@testxgids= qw(1000); +$numgid= 50008; +$othergroup= 'daemon'; +$othergid= 1; + +sub parseid ($) { + my ($id) = @_; + my $orgid= $id; + my $out= ''; + my $part; + chomp($id); + $id =~ s/^uid=// or return $id =~ m/\n/ ? "ERROR: $`" : "ERROR: $id"; + $id =~ s/^(\d+)// or return $orgid; + $out= $1; + $id =~ s/^\([^\)]+\)//; $id =~ s/^\s+// or return $orgid; + $id =~ s/^gid=(\d+)// or return $orgid; + $out.= " $1"; + $id =~ s/^\([^\)]+\)//; $id =~ s/^\s+// or return $orgid; + $id =~ s/^groups=// or return $orgid; + for $part (split(/,/,$id)) { + $part =~ s/^(\d+)// or return $orgid; + $out.= " $1"; + $part =~ s/^\([^\)]+\)//; $part eq '' or return $orgid; + } + return $out; +} + +$org= `id`; +$org =~ m/^uid=\d+\(([^\)]+)\) gid=\d+\(([^\)]+)\) / or die "$org ?"; +$orguser= $1; $orggroup= $2; +$org= parseid($org); +$org =~ m/^\d+ \d+ / or die $org; +($orguid,$orggid,@orgxgids)= split(/ /,$org); + +$tests= <&1`; + $newout= parseid($out); + print("OK $tests[$i] ($tests[$i+2])\n"), next if $newout eq $tests[$i+1]; + die "$newout != $tests[$i+1] ($tests[$i]) $i"; +} diff --git a/cprogs/smtpallow.c b/cprogs/smtpallow.c new file mode 100644 index 0000000..d8c8532 --- /dev/null +++ b/cprogs/smtpallow.c @@ -0,0 +1,44 @@ +/**/ + +#include +#include +#include +#include + +_syscall2(long,socketcall,int,call,unsigned long *,args); + +int real_connect(int sockfd, const struct sockaddr *saddr, int addrlen) +{ + unsigned long args[3]; + + args[0] = sockfd; + args[1] = (unsigned long)saddr; + args[2] = addrlen; + return socketcall(SYS_CONNECT, args); +} + +int connect(int fd, const struct sockaddr *them_any, int addrlen) { + struct sockaddr_in *them= (struct sockaddr_in*)them_any; + int r,l,i; + struct sockaddr_in us; + + if (addrlen == sizeof(us) && + them->sin_family == AF_INET && + them->sin_port == htons(25)) { + memset(&us,0,sizeof(us)); + us.sin_port= 0; + us.sin_family= AF_INET; + us.sin_addr.s_addr= INADDR_ANY; + r= getsockname(fd,(struct sockaddr*)&us,&l); + if (r<0 && errno != EINVAL) return r; + if (!ntohs(us.sin_port)) { + for (i=1023; i>0; i--) { + us.sin_port= htons(i); + if (!bind(fd,(struct sockaddr*)&us,sizeof(us))) break; + if (errno != EADDRINUSE) return -1; + } + if (!i) return -1; + } else if (r<0) return r; + } + return real_connect(fd,them_any,addrlen); +} diff --git a/cprogs/smtpallow.c~ b/cprogs/smtpallow.c~ new file mode 100644 index 0000000..83d0fc4 --- /dev/null +++ b/cprogs/smtpallow.c~ @@ -0,0 +1,35 @@ +/**/ + +#include + +_syscall2(long,socketcall,int,call,unsigned long *,args); +int real_connect(int sockfd, const struct sockaddr *saddr, int addrlen) +{ + unsigned long args[3]; + + args[0] = sockfd; + args[1] = (unsigned long)saddr; + args[2] = addrlen; + return socketcall(SYS_CONNECT, args); +} + +int connect(int fd, struct sockaddr_in *them, int *addrlen) { + int r,l; + struct sockaddr_in us; + pid_t c; + + if (*addrlen == sizeof(us) && + them->sin_family == AF_INET && + them->sin_port == htons(13)) { + r= getsockname(fd,&us,&l); if (r<0) return r; + if (!ntohs(us.port)) { + for (i=1023; i>0; i++) { + us.port= htons(i); + if (!bind(fd,&us,sizeof(us))) break; + if (errno != EADDRINUSE) return -1; + } + if (!i) return -1; + } + } + return real_connect(fd,them,addrlen); +} diff --git a/cprogs/smtpallow.o b/cprogs/smtpallow.o new file mode 100644 index 0000000000000000000000000000000000000000..3d66f7aebda16abb246dc9db67ef9a714657eb59 GIT binary patch literal 1420 zcma)6-%Aux6h8Z-TGy?eL?o#Pd#IFTP!Y{2NM)30)fHQf#D?8*)?9aHWp|b`5|d$~ zVHogV=%GI#=)oruU9gux`tcGy^b!b4Y$E1^VCU@2rO}rV+(wPT~l73M?wJjX?i72FYzm)5)dQR6L=^x~W!>Z8UR^fO!r>|%Me zqMP0jb}_sml>M+F>|q#eVJAL1R*9Nxdg%i8Rqgbp->54-Ok2Y4%Tn4{E#6x>!co{A zW*NCD>}EJyD94>jy%aH4HICJ#idBQg{=yeyzj(!&OtagF3%E(d+}y5X^TII-^sTD@P#==OQsODyn~OKr^!z> z;PY~pcf84@mIOXkC;+eKG#Pj)rzon^8vM)uyLMV#`;sCTOUS6&C^cwaN=)#4g6CVvYTm`|~9NNQM;Cw3lv zwkL&uVxB;bYfOXC{aIBaB`U&2ngN}g`k>hm_v)1}FpF!%N{z3V~vb##^m5Piow zA$@N)aqo`A*;E~o0N~|#EP%Ir$>nzuYf$f+Cr*9bKEZpD$MNgLkMhZ1!tcQ4bob1t zUStH3_{<3o1x1@pX0y2`yaZE{)F$Fnot@6glROl1(u}N07zMFEHq_G{6NmcxMuhv~ z{qCNaAcCCFt2xNa$t+f>sw`>1P?42_tihD5k&2pBWJpb`lMuoE!+1GOh=H(kKH|@j k2k`=5yYbJ&arpR00>N`QdmJ_8HzNk409`JBM!Xu}58kE#cmMzZ literal 0 HcmV?d00001 diff --git a/cprogs/smtpallow.so b/cprogs/smtpallow.so new file mode 100755 index 0000000000000000000000000000000000000000..3fa334669b1a42e80123fe8cbca4c1693483fd8b GIT binary patch literal 3930 zcma)9Z){Ul6u(<16sWF@1xCbVCew_#G)M>_QR3J-K(;a1#)JuPUHiH}tnF-HaWf(# zO_kb|EI|`LnGvG#gBtuBK9PkjLPAUyjnViCKN!2fhe;M#%%uK)_r2S`HjDA3r|16e zIrrRq&pr3Pd(U}WTguAHgd&G<2%YZ#}%Pu~j?V($eYe(z+V=wR$z74TXmc zp#>pCEaE?{8-Cx&h|r_aa709P--zaqgu}Yu5K4yhP)s+(fNsz}>LmdP9iZ*H|c#yTV)|<*qQJ23efHlLKAh z3Jp>{KPPcDF)Qb%C9Wan-~3gHw-DD7Pf5(;U_J39Fr=hoomtA>^D~Xu3Yo+bbeYkL z#8`zeDl=z9dR1;N@qI;NuZS=9o|>7=n^(cScV@CX^+&!chfS64cBb20*MjibnfmF6 ziQd$W;yLK}3jZE*9j4>fXs23&UUHo-6P2GrIIT)7`Fg zn>*!QOm#1%+Lklk#g1V|_SZ+bT>9jKY`xRozPhI{tzmjN>r9+=yDO8|F$fGVn0TSQ zGWjJy@cekW*j$kdAq+<_gCjlJzyHBX>34chX$-)mMTLpK zj@-y37Ug;_C&rd@w)I?2?9G*|=RTOH6U>kFB_1^Cs+2qX9s1~<;p7!%Z=;I&3Sym- z>Re-87_)yHd=dN+_zUoLu$`FQJnQ87ioL|_=l6lf$7|RUs1gl0Fu6@W0rQMzveOOE zOqhsmVD18}u-F9N0wv28kjPHK&A{&hHw~H;)BdKWJ+<}w+q<{cZuji+Y!~AH)Ocd! zA;Z@%JTW6`%0X2c^u-2+Comp{i7Ab!@I>_y&p^a53!@__$V1E{i}IZD$n(r24;zo) zh(u#(Z3@{C9(|!9zwqE35*~jf6w<>+@m&4`JqaCS%6Kup+>2KMiJ#X~(#e zw}BaN2x-UoZw0fCc3dYi*GCa;Nza3E|TWpc~ol5Kl&rLgO%MJY{+%&)FS1t3s~97&M|n`b6*@bO(+!r;lWBe4+jvNDXNbHw;mG`L$ z3q$1N{1(a_5AFEvzQsm1QvIGs9p|Blb~_b-R66cQ`cm`=cJCDUGII9zT$KVjnR>2pfb#d=ZeDRz})XHfcZd>Bh zeiN~kmV7%rRidveY5yFs{Vmd1qHif_FZ@v>X2gR*k6#S<{o8T%4vh|t=m8II%z=nD zFcRtKg`6KU%@-d-ZBy6bqnfw9S%q=0c;d&?@?`a3DPkdG6t9EG8yKK^4&>h#=958P^jCZgn2!zHGebTcie4G^r-Aj- VFdrxRhlDw&l^-*FOV}SK{{q(+ftdgR literal 0 HcmV?d00001 diff --git a/cprogs/usernice.c b/cprogs/usernice.c new file mode 100644 index 0000000..1f05e19 --- /dev/null +++ b/cprogs/usernice.c @@ -0,0 +1,67 @@ +/**/ + +#include +#include +#include +#include +#include +#include +#include + +int main(int argc,char **argv) { + long l; + int mrenice,wrenice,newprio,eflag; + uid_t ruid; + char *ep; + struct passwd *pw; + + mrenice=0; + if (argc < 3) { + fputs("usernice: too few args\n" + " usage: usernice \n" + " usernice p ...\n" + " usernice u ...\n", + stderr); + exit(-1); + } + l= strtol(*++argv,&ep,10); + if (*ep == 'p' || *ep == 'u') { mrenice= *ep++; } + if (*ep) { fputs("usernice: priority not numeric or bad flags\n",stderr); exit(-1); } + if (l<-20 || l>20) + { fputs("usernice: priority must be -20 .. 20\n",stderr); exit(-1); } + newprio= l; + if (mrenice) { + eflag=0; + while (*++argv) { + if (mrenice == 'p') { + wrenice= PRIO_PROCESS; + l= strtoul(*argv,&ep,10); + if (*ep) { + fprintf(stderr,"usernice: pid `%s' not numeric\n",*argv); eflag=2; + continue; + } + } else { + wrenice= PRIO_USER; + l= strtoul(*argv,&ep,10); + if (*ep) { + pw= getpwnam(*argv); + if (!pw) { + fprintf(stderr,"usernice: unknown user `%s'\n",*argv); eflag=2; + continue; + } + l= pw->pw_uid; + } + } + if (setpriority(wrenice,l,newprio)) { + perror(*argv); if (!eflag) eflag=1; + } + } + exit(eflag); + } else { + if (setpriority(PRIO_PROCESS,0,newprio)) + { perror("usernice: setpriority"); exit(-1); } + ruid= getuid(); if (ruid == (uid_t)-1) { perror("usernice: getuid"); exit(-1); } + if (setreuid(ruid,ruid)) { perror("usernice: setreuid"); exit(-1); } + execvp(argv[1],argv+1); perror("usernice: exec"); exit(-1); + } +} diff --git a/cprogs/usr-local-src-misc-Makefile b/cprogs/usr-local-src-misc-Makefile new file mode 100644 index 0000000..a1a96f2 --- /dev/null +++ b/cprogs/usr-local-src-misc-Makefile @@ -0,0 +1,18 @@ +CFLAGS= -Wall -Wwrite-strings -Wmissing-prototypes -Wstrict-prototypes \ + -Wpointer-arith -O2 -g -DREALLY_CHECK_FILE='"/etc/inittab"' +LDFLAGS= + +TARGETS=really + +all: $(TARGETS) + +really: really.o myopt.o + +really-test: really Makefile + rm -f really-test + cp really really-test + really chown root.staff really-test + really chmod 4770 really-test + +really-check: really-test really.testcases + ./really.testcases diff --git a/cprogs/usr-local-src-misc-Makefile~ b/cprogs/usr-local-src-misc-Makefile~ new file mode 100644 index 0000000..edac912 --- /dev/null +++ b/cprogs/usr-local-src-misc-Makefile~ @@ -0,0 +1,9 @@ +CFLAGS= -Wall -Wwrite-strings -Wmissing-prototypes -Wstrict-prototypes \ + -Wpointer-arith -O2 -g -DREALLY_CHECK_FILE='"/etc/inittab"' +LDFLAGS= + +TARGETS=really + +all: $(TARGETS) + +really: really.o myopt.o diff --git a/debian/changelog b/debian/changelog index 56742a8..2574dfd 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,11 @@ chiark-utils (3.99.1.0.2) unstable; urgency=low * foreign zones checked from delegation by default. + * from chiark:/usr/local/src/misc/ (as found): + really (incl. myopt) + usernice + cvsweb-list + smtpallow -- diff --git a/scripts/cvsweb-list b/scripts/cvsweb-list new file mode 100755 index 0000000..b5ac819 --- /dev/null +++ b/scripts/cvsweb-list @@ -0,0 +1,56 @@ +#!/usr/bin/perl + +print < +chiark public CVS + + + +

chiark users' public CVS

+
    +END + +open UL, "/etc/userlist" or die $!; +while (
      ) { + next if m/^\#/ or !m/\S/; + chomp($user= $_); + next unless readlink "/home/$user/public-cgi/cvsweb" + eq '/usr/local/lib/cvsweb'; + $hd= 0; + $pc= "/home/$user/public-CVS/"; + next unless opendir D, $pc; + while (defined($mod= readdir D)) { + next unless -d "$pc/$mod"; + next if $mod =~ m/^\./; + if (!$hd) { + print "
    • $user" or die $!; + print " (homepage)" or die $! + if -d "/home/$user/public-html"; + print ":" or die $!; + $hd= 1; + } else { + print "," or die $!; + } + print " $mod" or die $!; + } + next unless $hd; + print "
    • \n" or die $!; +} + +close UL or die $!; + +print < +
      +
      + maintained by + $ENV{SERVER_ADMIN}; + chiark home page +
      + +END + +exit 0 diff --git a/scripts/cvsweb-list~ b/scripts/cvsweb-list~ new file mode 100755 index 0000000..124235a --- /dev/null +++ b/scripts/cvsweb-list~ @@ -0,0 +1,55 @@ +#!/usr/bin/perl + +print < +chiark public CVS + + + +

      list of users exporting CVS repositories via cvsweb from chiark

      +
        +END + +open UL, "/etc/userlist" or die $!; +while (
          ) { + next if m/^\#/ or !m/\S/; + chomp($user= $_); + next unless readlink "/home/$user/public-cgi/cvsweb" + eq '/usr/local/lib/cvsweb'; + $hd= 0; + $pc= "/home/$user/public-CVS/"; + next unless opendir D, $pc; + while (defined($mod= readdir D)) { + next unless -d "$pc/$mod"; + next if $mod =~ m/^\./; + if (!$hd) { + print "
        • $user" or die $!; + print " (homepage)" or die $! + if -d "/home/$user/public-html"; + print ":" or die $!; + $hd= 1; + } else { + print "," or die $!; + } + print " $mod" or die $!; + } + next unless $hd; + print "
        • \n" or die $!; +} + +close UL or die $!; + +print < +
          +
          + maintained by + $ENV{SERVER_ADMIN}; + chiark home page +
          + +END + +exit 0 -- 2.30.2