Goodbye push
This commit is contained in:
		
							
								
								
									
										11
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -96,18 +96,8 @@ asn1_*.[cx] | ||||
| /appl/gssmask/gssmask | ||||
| /appl/kf/kf | ||||
| /appl/kf/kfd | ||||
| /appl/kx/kx | ||||
| /appl/kx/kxd | ||||
| /appl/kx/rxtelnet | ||||
| /appl/kx/rxterm | ||||
| /appl/kx/tenletxr | ||||
| /appl/otp/otp | ||||
| /appl/otp/otpprint | ||||
| /appl/popper/pop_debug | ||||
| /appl/popper/popper | ||||
| /appl/push/pfrom | ||||
| /appl/push/push | ||||
| /appl/rcp/rcp | ||||
| /appl/su/su | ||||
| /appl/test/gssapi_client | ||||
| /appl/test/gssapi_server | ||||
| @@ -118,7 +108,6 @@ asn1_*.[cx] | ||||
| /appl/test/tcp_server | ||||
| /appl/test/uu_client | ||||
| /appl/test/uu_server | ||||
| /appl/xnlock/xnlock | ||||
| /cf/libtool.m4 | ||||
| /cf/ltoptions.m4 | ||||
| /cf/ltsugar.m4 | ||||
|   | ||||
| @@ -6,7 +6,7 @@ env: | ||||
|  | ||||
| before_install: | ||||
|     - sudo apt-get update -qq | ||||
|     - sudo apt-get install -qq bison comerr-dev flex libcap-ng-dev libdb-dev libedit-dev libhesiod-dev libjson-perl libldap2-dev libncurses5-dev libperl4-corelibs-perl libsqlite3-dev libx11-dev libxau-dev libxt-dev pkg-config python ss-dev texinfo x11proto-core-dev unzip netbase | ||||
|     - sudo apt-get install -qq bison comerr-dev flex libcap-ng-dev libdb-dev libedit-dev libjson-perl libldap2-dev libncurses5-dev libperl4-corelibs-perl libsqlite3-dev libx11-dev libxau-dev libxt-dev pkg-config python ss-dev texinfo x11proto-core-dev unzip netbase | ||||
|     - mkdir ci-build | ||||
|     - mkdir coverity-build | ||||
|     - ./autogen.sh | ||||
|   | ||||
| @@ -16,7 +16,6 @@ SUBDIRS = 					\ | ||||
| 	  dbutils				\ | ||||
| 	  $(dir_otp)				\ | ||||
| 	  gssmask				\ | ||||
| 	  push					\ | ||||
| 	  su					\ | ||||
| 	  test					\ | ||||
| 	  kf					\ | ||||
|   | ||||
| @@ -1,200 +0,0 @@ | ||||
| 2005-04-19  Love Hörnquist Åstrand  <lha@it.su.se> | ||||
|  | ||||
| 	* push.c: catch when snprint needs a larger buffer | ||||
|  | ||||
| 2004-06-17  Johan Danielsson  <joda@pdc.kth.se> | ||||
|  | ||||
| 	* push.c: alloc memory to handle very long lines | ||||
| 	 | ||||
| 2003-04-03  Assar Westerlund  <assar@kth.se> | ||||
|  | ||||
| 	* push.c: fixed one incorrect fprintf to stderr | ||||
|  | ||||
| 2003-03-18  Love Hörnquist Åstrand  <lha@it.su.se> | ||||
|  | ||||
| 	* push.c: add names of pop states, add some more debugging and use | ||||
| 	fprintf(stderr) for all dbg stmts. | ||||
| 	 | ||||
| 2001-09-04  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* push.c (doit): check return values from snprintf being negative | ||||
|  | ||||
| 2000-12-31  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* push.c (main): handle krb5_init_context failure consistently | ||||
|  | ||||
| 2000-12-26  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* push.c: support several headers, from <mattiasa@e.kth.se> use | ||||
| 	estrdup, emalloc, erealloc | ||||
|  | ||||
| 2000-11-29  Johan Danielsson  <joda@pdc.kth.se> | ||||
|  | ||||
| 	* pfrom.1: work around bug in grog that makes it think it needs | ||||
| 	mdoc.old | ||||
|  | ||||
| 	* push.8: work around bug in grog that makes it think it needs | ||||
| 	mdoc.old | ||||
|  | ||||
| 2000-11-27  Johan Danielsson  <joda@pdc.kth.se> | ||||
|  | ||||
| 	* push.c: add space to usage | ||||
|  | ||||
| 2000-10-08  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* push.c (doit): check that fds are not too large to select on | ||||
|  | ||||
| 2000-03-04  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* add man-page for pfrom | ||||
|  | ||||
| 1999-12-28  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* push.c (main): call k_getportbyname with port number in | ||||
|  	network-byte-order | ||||
|  | ||||
| 1999-12-14  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* push.c (do_connect): remove bogus local block variable | ||||
|  | ||||
| 1999-12-05  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* push.c (do_connect): use `getaddrinfo' | ||||
| 	* push.c: add --count (print number of messages and bytes at | ||||
| 	beginning) | ||||
|  | ||||
| 1999-11-13  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* push.c: make `-v' a arg_counter | ||||
| 	 | ||||
| 1999-11-02  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* push.c (main): redo the v4/v5 selection for consistency.  -4 -> | ||||
|  	try only v4 -5 -> try only v5 none, -45 -> try v5, v4 | ||||
|  | ||||
| 1999-08-19  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* push.c (doit): remember to step over the error message when we | ||||
|  	discover that XDELE is not supported | ||||
|  | ||||
| 1999-08-12  Johan Danielsson  <joda@pdc.kth.se> | ||||
|  | ||||
| 	* push.c: use XDELE | ||||
|  | ||||
| 1999-08-05  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* push.c (do_connect): v6-ify | ||||
|  | ||||
| 1999-06-15  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* push.c: get_default_username and the resulting const propagation | ||||
|  | ||||
| 1999-05-21  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* push.c (parse_pobox): try $USERNAME | ||||
|  | ||||
| 1999-05-11  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* push.c (do_v5): remove unused and non-working code | ||||
|  | ||||
| 1999-05-10  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* push.c (do_v5): call krb5_sendauth with ccache == NULL | ||||
| 	 | ||||
| Wed Apr  7 23:40:00 1999  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* Makefile.in: fix names of hesiod variables | ||||
|  | ||||
| Wed Mar 24 04:37:04 1999  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* Makefile.am (pfrom): fix typo | ||||
|  | ||||
| 	* push.c (get_pobox): try to handle old and new hesiod APIs | ||||
|  | ||||
| Mon Mar 22 22:19:40 1999  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* Makefile.am: hesoid -> hesiod | ||||
|  | ||||
| Sun Mar 21 18:02:10 1999  Johan Danielsson  <joda@hella.pdc.kth.se> | ||||
|  | ||||
| 	* Makefile.am: bindir -> libexecdir | ||||
|  | ||||
| Sat Mar 20 00:12:26 1999  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* Makefile.am: LDADD: add missing backslash | ||||
|  | ||||
| Thu Mar 18 15:28:35 1999  Johan Danielsson  <joda@hella.pdc.kth.se> | ||||
|  | ||||
| 	* Makefile.am: clean pfrom | ||||
|  | ||||
| 	* Makefile.am: include Makefile.am.common | ||||
|  | ||||
| Mon Mar 15 18:26:16 1999  Johan Danielsson  <joda@blubb.pdc.kth.se> | ||||
|  | ||||
| 	* push.c: strncasecmp headers | ||||
|  | ||||
| Mon Feb 15 22:22:09 1999  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* Makefile.in (pfrom): use libexecdir | ||||
|  | ||||
| 	* Makefile.am: build and install pfrom | ||||
|  | ||||
| 	* push.c (do_connect): init `s' | ||||
| 	(pop_state): spell-check enums | ||||
|  | ||||
| Tue Nov 24 23:20:54 1998  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* Makefile.in: build and install pfrom | ||||
|  | ||||
| 	* pfrom.in: bindir -> libexecdir | ||||
|  | ||||
| Sun Nov 22 15:33:52 1998  Johan Danielsson  <joda@hella.pdc.kth.se> | ||||
|  | ||||
| 	* push.c: eliminate some warnings | ||||
|  | ||||
| Sun Nov 22 10:34:54 1998  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* Makefile.in (WFLAGS): set | ||||
|  | ||||
| Thu Nov 19 01:17:33 1998  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* push_locl.h: add <hesiod.h> | ||||
|  | ||||
| 	* Makefile.am, Makefile.in: link and include hesiod | ||||
|  | ||||
| 	* push.c (get_pobox): new function. add hesiod support. | ||||
|  | ||||
| 1998-11-07  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* push.8: updated | ||||
|  | ||||
| 	* push.c: --from implementation from <lha@stacken.kth.se> | ||||
|  | ||||
| Fri Jul 10 01:14:45 1998  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* push.c (net_{read,write}): remove | ||||
|  | ||||
| Wed Jun 24 14:41:41 1998  Johan Danielsson  <joda@blubb.pdc.kth.se> | ||||
|  | ||||
| 	* push.c: allow `po:user@host' mailbox syntax | ||||
|  | ||||
| Tue Jun  2 17:35:06 1998  Johan Danielsson  <joda@emma.pdc.kth.se> | ||||
|  | ||||
| 	* push.c: quote '^From ' properly | ||||
|  | ||||
| Mon May 25 05:22:47 1998  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* Makefile.in (clean): PROGS -> PROGRAMS | ||||
|  | ||||
| Sun Apr 26 11:42:13 1998  Assar Westerlund  <assar@sics.se> | ||||
|  | ||||
| 	* push.c (main): better default for v4 and v5 | ||||
|  | ||||
| 	* push.c (main): init context correctly | ||||
|  | ||||
| 	* push.c: should work with krb4 | ||||
|  | ||||
| 	* push_locl.h: krb4 compat | ||||
|  | ||||
| 	* Makefile.in: new file | ||||
|  | ||||
| @@ -1,28 +0,0 @@ | ||||
| # $Id$ | ||||
|  | ||||
| include $(top_srcdir)/Makefile.am.common | ||||
|  | ||||
| AM_CPPFLAGS += $(INCLUDE_hesiod) | ||||
|  | ||||
| WFLAGS += $(WFLAGS_LITE) | ||||
|  | ||||
| bin_SCRIPTS		= pfrom | ||||
|  | ||||
| libexec_PROGRAMS	= push | ||||
|  | ||||
| push_SOURCES = push.c push_locl.h | ||||
|  | ||||
| pfrom: pfrom.in | ||||
| 	sed -e "s!%libexecdir%!$(libexecdir)!" $(srcdir)/pfrom.in > $@ | ||||
| 	chmod +x $@ | ||||
|  | ||||
| man_MANS = push.8 pfrom.1 | ||||
|  | ||||
| CLEANFILES = pfrom | ||||
|  | ||||
| EXTRA_DIST = NTMakefile pfrom.in $(man_MANS) | ||||
|  | ||||
| LDADD = $(LIB_krb5) \ | ||||
| 	$(LIB_hcrypto) \ | ||||
| 	$(LIB_roken) \ | ||||
| 	$(LIB_hesiod) | ||||
| @@ -1,35 +0,0 @@ | ||||
| ######################################################################## | ||||
| # | ||||
| # Copyright (c) 2009, Secure Endpoints Inc. | ||||
| # All rights reserved. | ||||
| #  | ||||
| # Redistribution and use in source and binary forms, with or without | ||||
| # modification, are permitted provided that the following conditions | ||||
| # are met: | ||||
| #  | ||||
| # - Redistributions of source code must retain the above copyright | ||||
| #   notice, this list of conditions and the following disclaimer. | ||||
| #  | ||||
| # - Redistributions in binary form must reproduce the above copyright | ||||
| #   notice, this list of conditions and the following disclaimer in | ||||
| #   the documentation and/or other materials provided with the | ||||
| #   distribution. | ||||
| #  | ||||
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
| # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
| # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||||
| # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||||
| # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||
| # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||||
| # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||
| # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
| # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||||
| # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| # POSSIBILITY OF SUCH DAMAGE. | ||||
| #  | ||||
|  | ||||
| RELDIR=appl\push  | ||||
|  | ||||
| !include ../../windows/NTMakefile.w32  | ||||
|  | ||||
| @@ -1,55 +0,0 @@ | ||||
| .\" Copyright (c) 2000 - 2002 Kungliga Tekniska Högskolan | ||||
| .\" (Royal Institute of Technology, Stockholm, Sweden). | ||||
| .\" All rights reserved. | ||||
| .\" | ||||
| .\" Redistribution and use in source and binary forms, with or without | ||||
| .\" modification, are permitted provided that the following conditions | ||||
| .\" are met: | ||||
| .\" | ||||
| .\" 1. Redistributions of source code must retain the above copyright | ||||
| .\"    notice, this list of conditions and the following disclaimer. | ||||
| .\" | ||||
| .\" 2. Redistributions in binary form must reproduce the above copyright | ||||
| .\"    notice, this list of conditions and the following disclaimer in the | ||||
| .\"    documentation and/or other materials provided with the distribution. | ||||
| .\" | ||||
| .\" 3. Neither the name of the Institute nor the names of its contributors | ||||
| .\"    may be used to endorse or promote products derived from this software | ||||
| .\"    without specific prior written permission. | ||||
| .\" | ||||
| .\" THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND | ||||
| .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| .\" ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE | ||||
| .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
| .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
| .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
| .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
| .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
| .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
| .\" SUCH DAMAGE. | ||||
| .\" | ||||
| .\" $Id$ | ||||
| .\" | ||||
| .Dd March 4, 2000 | ||||
| .Dt PFROM 1 | ||||
| .Os HEIMDAL | ||||
| .Sh NAME | ||||
| .Nm pfrom | ||||
| .Nd "fetch a list of the current mail via POP" | ||||
| .Sh SYNOPSIS | ||||
| .Nm | ||||
| .Op Fl 4 | Fl Fl krb4 | ||||
| .Op Fl 5 | Fl Fl krb5 | ||||
| .Op Fl v | Fl Fl verbose | ||||
| .Op Fl c | -count | ||||
| .Op Fl Fl header | ||||
| .Oo Fl p Ar port-spec  \*(Ba Xo | ||||
| .Fl Fl port= Ns Ar port-spec | ||||
| .Xc | ||||
| .Oc | ||||
| .Sh DESCRIPTION | ||||
| .Nm | ||||
| is a script that does push --from. | ||||
| .Sh SEE ALSO | ||||
| .Xr push 8 | ||||
| @@ -1,6 +0,0 @@ | ||||
| #!/bin/sh | ||||
| # $Id$ | ||||
| libexecdir=%libexecdir% | ||||
| PATH=$libexecdir:$PATH | ||||
| export PATH | ||||
| push --from $* | ||||
							
								
								
									
										132
									
								
								appl/push/push.8
									
									
									
									
									
								
							
							
						
						
									
										132
									
								
								appl/push/push.8
									
									
									
									
									
								
							| @@ -1,132 +0,0 @@ | ||||
| .\" $Id$ | ||||
| .\" | ||||
| .Dd May 31, 1998 | ||||
| .Dt PUSH 8 | ||||
| .Os HEIMDAL | ||||
| .Sh NAME | ||||
| .Nm push | ||||
| .Nd fetch mail via POP | ||||
| .Sh SYNOPSIS | ||||
| .Nm | ||||
| .Op Fl 5 | Fl Fl krb5 | ||||
| .Op Fl v | Fl Fl verbose | ||||
| .Op Fl f | Fl Fl fork | ||||
| .Op Fl l | -leave | ||||
| .Op Fl Fl from | ||||
| .Op Fl c | -count | ||||
| .Op Fl Fl headers Ns = Ns Ar headers | ||||
| .Oo Fl p Ar port-spec  \*(Ba Xo | ||||
| .Fl Fl port Ns = Ns Ar port-spec | ||||
| .Xc | ||||
| .Oc | ||||
| .Ar po-box | ||||
| .Pa filename | ||||
| .Sh DESCRIPTION | ||||
| .Nm | ||||
| retrieves mail from the post office box | ||||
| .Ar po-box , | ||||
| and stores the mail in mbox format in | ||||
| .Pa filename . | ||||
| The | ||||
| .Ar po-box | ||||
| can have any of the following formats: | ||||
| .Bl -hang -compact -offset indent | ||||
| .It Ql hostname:username | ||||
| .It Ql po:hostname:username | ||||
| .It Ql username@hostname | ||||
| .It Ql po:username@hostname | ||||
| .It Ql hostname | ||||
| .It Ql po:username | ||||
| .El | ||||
| .Pp | ||||
| If no username is specified, | ||||
| .Nm | ||||
| assumes that it's the same as on the local machine; | ||||
| .Ar hostname | ||||
| defaults to the value of the | ||||
| .Ev MAILHOST | ||||
| environment variable. | ||||
| .Pp | ||||
| Supported options: | ||||
| .Bl -tag -width Ds | ||||
| .It Xo | ||||
| .Fl 5 , | ||||
| .Fl Fl krb5 | ||||
| .Xc | ||||
| use Kerberos 5 (if compiled with support for Kerberos 5) | ||||
| .It Xo | ||||
| .Fl f , | ||||
| .Fl Fl fork | ||||
| .Xc | ||||
| fork before starting to delete messages | ||||
| .It Xo | ||||
| .Fl l , | ||||
| .Fl Fl leave | ||||
| .Xc | ||||
| don't delete fetched mail | ||||
| .It Xo | ||||
| .Fl Fl from | ||||
| .Xc | ||||
| behave like from. | ||||
| .It Xo | ||||
| .Fl c , | ||||
| .Fl Fl count | ||||
| .Xc | ||||
| first print how many messages and bytes there are. | ||||
| .It Xo | ||||
| .Fl Fl headers Ns = Ns Ar headers | ||||
| .Xc | ||||
| a list of comma-separated headers that should get printed. | ||||
| .It Xo | ||||
| .Fl p Ar port-spec , | ||||
| .Fl Fl port Ns = Ns Ar port-spec | ||||
| .Xc | ||||
| use this port instead of the default | ||||
| .Ql kpop | ||||
| or | ||||
| .Ql 1109 . | ||||
| .El | ||||
| .Pp | ||||
| The default is to first try Kerberos 5 authentication and then, if | ||||
| that fails, Kerberos 4. | ||||
| .Sh ENVIRONMENT | ||||
| .Bl -tag -width Ds | ||||
| .It Ev MAILHOST | ||||
| points to the post office, if no other hostname is specified. | ||||
| .El | ||||
| .\".Sh FILES | ||||
| .Sh EXAMPLES | ||||
| .Bd -literal -offset indent | ||||
| $ push cornfield:roosta ~/.emacs-mail-crash-box | ||||
| .Ed | ||||
| .Pp | ||||
| tries to fetch mail for the user | ||||
| .Ar roosta | ||||
| from the post office at | ||||
| .Dq cornfield , | ||||
| and stores the mail in | ||||
| .Pa ~/.emacs-mail-crash-box | ||||
| (you are using Gnus, aren't you?) | ||||
| .Bd -literal -offset indent | ||||
| $ push --from -5 havregryn | ||||
| .Ed | ||||
| .Pp | ||||
| tries to fetch | ||||
| .Sy From: | ||||
| lines for current user at post office | ||||
| .Dq havregryn | ||||
| using Kerberos 5. | ||||
| .\".Sh DIAGNOSTICS | ||||
| .Sh SEE ALSO | ||||
| .Xr from 1 , | ||||
| .Xr pfrom 1 , | ||||
| .Xr movemail 8 , | ||||
| .Xr popper 8 | ||||
| .\".Sh STANDARDS | ||||
| .Sh HISTORY | ||||
| .Nm | ||||
| was written while waiting for | ||||
| .Nm movemail | ||||
| to finish getting the mail. | ||||
| .\".Sh AUTHORS | ||||
| .\".Sh BUGS | ||||
							
								
								
									
										788
									
								
								appl/push/push.c
									
									
									
									
									
								
							
							
						
						
									
										788
									
								
								appl/push/push.c
									
									
									
									
									
								
							| @@ -1,788 +0,0 @@ | ||||
| /* | ||||
|  * Copyright (c) 1997-2004 Kungliga Tekniska Högskolan | ||||
|  * (Royal Institute of Technology, Stockholm, Sweden). | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * | ||||
|  * 3. Neither the name of the Institute nor the names of its contributors | ||||
|  *    may be used to endorse or promote products derived from this software | ||||
|  *    without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  */ | ||||
|  | ||||
| #include "push_locl.h" | ||||
| RCSID("$Id$"); | ||||
|  | ||||
| #if defined(_AIX) && defined(STAT) | ||||
| /* | ||||
|  * AIX defines STAT to 1 in sys/dir.h | ||||
|  */ | ||||
| #  undef STAT | ||||
| #endif | ||||
|  | ||||
| #ifdef KRB5 | ||||
| static int use_v5 = -1; | ||||
| static krb5_context context; | ||||
| #endif | ||||
|  | ||||
| static char *port_str; | ||||
| static int verbose_level; | ||||
| static int do_fork; | ||||
| static int do_leave; | ||||
| static int do_version; | ||||
| static int do_help; | ||||
| static int do_from; | ||||
| static int do_count; | ||||
| static char *header_str; | ||||
|  | ||||
| struct getargs args[] = { | ||||
| #ifdef KRB5 | ||||
|     { "krb5",	'5', arg_flag,		&use_v5,	"Use Kerberos V5", | ||||
|       NULL }, | ||||
| #endif | ||||
|     { "verbose",'v', arg_counter,	&verbose_level,	"Verbose", | ||||
|       NULL }, | ||||
|     { "fork",	'f', arg_flag,		&do_fork,	"Fork deleting proc", | ||||
|       NULL }, | ||||
|     { "leave",	'l', arg_flag,		&do_leave,	"Leave mail on server", | ||||
|       NULL }, | ||||
|     { "port",	'p', arg_string,	&port_str,	"Use this port", | ||||
|       "number-or-service" }, | ||||
|     { "from",	 0,  arg_flag,		&do_from,	"Behave like from", | ||||
|       NULL }, | ||||
|     { "headers", 0,  arg_string,	&header_str,	"Headers to print", NULL }, | ||||
|     { "count", 'c',  arg_flag,		&do_count,	"Print number of messages", NULL}, | ||||
|     { "version", 0,  arg_flag,		&do_version,	"Print version", | ||||
|       NULL }, | ||||
|     { "help",	 0,  arg_flag,		&do_help,	NULL, | ||||
|       NULL } | ||||
|  | ||||
| }; | ||||
|  | ||||
| static void | ||||
| usage (int ret) | ||||
| { | ||||
|     arg_printusage (args, | ||||
| 		    sizeof(args) / sizeof(args[0]), | ||||
| 		    NULL, | ||||
| 		    "[[{po:username[@hostname] | hostname[:username]}] ...] " | ||||
| 		    "filename"); | ||||
|     exit (ret); | ||||
| } | ||||
|  | ||||
| static int | ||||
| do_connect (const char *hostname, int port, int nodelay) | ||||
| { | ||||
|     struct addrinfo *ai, *a; | ||||
|     struct addrinfo hints; | ||||
|     int error; | ||||
|     int s = -1; | ||||
|     char portstr[NI_MAXSERV]; | ||||
|  | ||||
|     memset (&hints, 0, sizeof(hints)); | ||||
|     hints.ai_socktype = SOCK_STREAM; | ||||
|     hints.ai_protocol = IPPROTO_TCP; | ||||
|  | ||||
|     snprintf (portstr, sizeof(portstr), "%u", ntohs(port)); | ||||
|  | ||||
|     error = getaddrinfo (hostname, portstr, &hints, &ai); | ||||
|     if (error) | ||||
| 	errx (1, "getaddrinfo(%s): %s", hostname, gai_strerror(error)); | ||||
|  | ||||
|     for (a = ai; a != NULL; a = a->ai_next) { | ||||
| 	s = socket (a->ai_family, a->ai_socktype, a->ai_protocol); | ||||
| 	if (s < 0) | ||||
| 	    continue; | ||||
| 	if (connect (s, a->ai_addr, a->ai_addrlen) < 0) { | ||||
| 	    warn ("connect(%s)", hostname); | ||||
|  	    close (s); | ||||
|  	    continue; | ||||
| 	} | ||||
| 	break; | ||||
|     } | ||||
|     freeaddrinfo (ai); | ||||
|     if (a == NULL) { | ||||
| 	warnx ("failed to contact %s", hostname); | ||||
| 	return -1; | ||||
|     } | ||||
|  | ||||
|     if(setsockopt(s, IPPROTO_TCP, TCP_NODELAY, | ||||
| 		  (void *)&nodelay, sizeof(nodelay)) < 0) | ||||
| 	err (1, "setsockopt TCP_NODELAY"); | ||||
|     return s; | ||||
| } | ||||
|  | ||||
| typedef enum { INIT = 0, GREET, USER, PASS, STAT, RETR, TOP, | ||||
| 	       DELE, XDELE, QUIT} pop_state; | ||||
|  | ||||
| static char *pop_state_string[] = { | ||||
|     "INIT", "GREET", "USER", "PASS", "STAT", "RETR", "TOP", | ||||
|     "DELE", "XDELE", "QUIT" | ||||
| }; | ||||
|  | ||||
| #define PUSH_BUFSIZ 65536 | ||||
|  | ||||
| #define STEP 16 | ||||
|  | ||||
| struct write_state { | ||||
|     struct iovec *iovecs; | ||||
|     size_t niovecs, maxiovecs, allociovecs; | ||||
|     int fd; | ||||
| }; | ||||
|  | ||||
| static void | ||||
| write_state_init (struct write_state *w, int fd) | ||||
| { | ||||
| #ifdef UIO_MAXIOV | ||||
|     w->maxiovecs = UIO_MAXIOV; | ||||
| #else | ||||
|     w->maxiovecs = 16; | ||||
| #endif | ||||
|     w->allociovecs = min(STEP, w->maxiovecs); | ||||
|     w->niovecs = 0; | ||||
|     w->iovecs = emalloc(w->allociovecs * sizeof(*w->iovecs)); | ||||
|     w->fd = fd; | ||||
| } | ||||
|  | ||||
| static void | ||||
| write_state_add (struct write_state *w, void *v, size_t len) | ||||
| { | ||||
|     if(w->niovecs == w->allociovecs) { | ||||
| 	if(w->niovecs == w->maxiovecs) { | ||||
| 	    if(writev (w->fd, w->iovecs, w->niovecs) < 0) | ||||
| 		err(1, "writev"); | ||||
| 	    w->niovecs = 0; | ||||
| 	} else { | ||||
| 	    w->allociovecs = min(w->allociovecs + STEP, w->maxiovecs); | ||||
| 	    w->iovecs = erealloc (w->iovecs, | ||||
| 				  w->allociovecs * sizeof(*w->iovecs)); | ||||
| 	} | ||||
|     } | ||||
|     w->iovecs[w->niovecs].iov_base = v; | ||||
|     w->iovecs[w->niovecs].iov_len  = len; | ||||
|     ++w->niovecs; | ||||
| } | ||||
|  | ||||
| static void | ||||
| write_state_flush (struct write_state *w) | ||||
| { | ||||
|     if (w->niovecs) { | ||||
| 	if (writev (w->fd, w->iovecs, w->niovecs) < 0) | ||||
| 	    err (1, "writev"); | ||||
| 	w->niovecs = 0; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| write_state_destroy (struct write_state *w) | ||||
| { | ||||
|     free (w->iovecs); | ||||
| } | ||||
|  | ||||
| static int | ||||
| doit(int s, | ||||
|      const char *host, | ||||
|      const char *user, | ||||
|      const char *outfilename, | ||||
|      const char *header_str, | ||||
|      int leavep, | ||||
|      int verbose, | ||||
|      int forkp) | ||||
| { | ||||
|     int ret; | ||||
|     char out_buf[PUSH_BUFSIZ]; | ||||
|     int out_len = 0; | ||||
|     char *in_buf; | ||||
|     size_t in_buf_size; | ||||
|     size_t in_len = 0; | ||||
|     char *in_ptr; | ||||
|     pop_state state = INIT; | ||||
|     unsigned count = 0, bytes; | ||||
|     unsigned asked_for = 0, retrieved = 0, asked_deleted = 0, deleted = 0; | ||||
|     unsigned sent_xdele = 0; | ||||
|     int out_fd; | ||||
|     char from_line[128]; | ||||
|     ssize_t from_line_length; | ||||
|     time_t now; | ||||
|     struct write_state write_state; | ||||
|     unsigned int numheaders = 1; | ||||
|     char **headers = NULL; | ||||
|     int i; | ||||
|     char *tmp = NULL; | ||||
|  | ||||
|     in_buf = emalloc(PUSH_BUFSIZ + 1); | ||||
|     in_ptr = in_buf; | ||||
|     in_buf_size = PUSH_BUFSIZ; | ||||
|  | ||||
|     if (do_from) { | ||||
| 	char *tmp2; | ||||
|  | ||||
| 	tmp2 = tmp = estrdup(header_str); | ||||
|  | ||||
| 	out_fd = -1; | ||||
| 	if (verbose) | ||||
| 	    fprintf (stderr, "%s@%s\n", user, host); | ||||
| 	while (*tmp != '\0') { | ||||
| 	    tmp = strchr(tmp, ','); | ||||
| 	    if (tmp == NULL) | ||||
| 		break; | ||||
| 	    tmp++; | ||||
| 	    numheaders++; | ||||
| 	} | ||||
|  | ||||
| 	headers = emalloc(sizeof(char *) * (numheaders + 1)); | ||||
| 	for (i = 0; i < numheaders; i++) { | ||||
| 	    headers[i] = strtok_r(tmp2, ",", &tmp2); | ||||
| 	} | ||||
| 	headers[numheaders] = NULL; | ||||
|     } else { | ||||
| 	out_fd = open(outfilename, O_WRONLY | O_APPEND | O_CREAT, 0666); | ||||
| 	if (out_fd < 0) | ||||
| 	    err (1, "open %s", outfilename); | ||||
| 	if (verbose) | ||||
| 	    fprintf (stderr, "%s@%s -> %s\n", user, host, outfilename); | ||||
|     } | ||||
|  | ||||
|     now = time(NULL); | ||||
|     from_line_length = snprintf (from_line, sizeof(from_line), | ||||
| 				 "From %s %s", "push", ctime(&now)); | ||||
|     if (from_line_length < 0 || from_line_length > sizeof(from_line)) | ||||
| 	errx (1, "snprintf failed"); | ||||
|  | ||||
|     out_len = snprintf (out_buf, sizeof(out_buf), | ||||
| 			"USER %s\r\nPASS hej\r\nSTAT\r\n", | ||||
| 			user); | ||||
|     if (out_len < 0 || out_len > sizeof(out_buf)) | ||||
| 	errx (1, "snprintf failed"); | ||||
|     if (net_write (s, out_buf, out_len) != out_len) | ||||
| 	err (1, "write"); | ||||
|     if (verbose > 1) | ||||
| 	fprintf (stderr, "%s", out_buf); | ||||
|  | ||||
|     if (!do_from) | ||||
| 	write_state_init (&write_state, out_fd); | ||||
|  | ||||
|     while(state != QUIT) { | ||||
| 	fd_set readset, writeset; | ||||
|  | ||||
| 	FD_ZERO(&readset); | ||||
| 	FD_ZERO(&writeset); | ||||
| 	if (s >= FD_SETSIZE) | ||||
| 	    errx (1, "fd too large"); | ||||
| 	FD_SET(s,&readset); | ||||
|  | ||||
| 	if (verbose > 1) | ||||
| 	    fprintf (stderr, "state: %s count: %d asked_for: %d " | ||||
| 		     "retrieved: %d asked_deleted: %d\n", | ||||
| 		     pop_state_string[state], | ||||
| 		     count, asked_for, retrieved, asked_deleted); | ||||
|  | ||||
| 	if (((state == STAT || state == RETR || state == TOP) | ||||
| 	     && asked_for < count) | ||||
| 	    || (state == XDELE && !sent_xdele) | ||||
| 	    || (state == DELE && asked_deleted < count)) | ||||
| 	    FD_SET(s,&writeset); | ||||
| 	ret = select (s + 1, &readset, &writeset, NULL, NULL); | ||||
| 	if (ret < 0) { | ||||
| 	    if (errno == EAGAIN) | ||||
| 		continue; | ||||
| 	    else | ||||
| 		err (1, "select"); | ||||
| 	} | ||||
|  | ||||
| 	if (FD_ISSET(s, &readset)) { | ||||
| 	    char *beg, *p; | ||||
| 	    size_t rem; | ||||
| 	    int blank_line = 0; | ||||
|  | ||||
| 	    if(in_len >= in_buf_size) { | ||||
| 		char *tmp = erealloc(in_buf, in_buf_size + PUSH_BUFSIZ + 1); | ||||
| 		in_ptr = tmp + (in_ptr - in_buf); | ||||
| 		in_buf = tmp; | ||||
| 		in_buf_size += PUSH_BUFSIZ; | ||||
| 	    } | ||||
|  | ||||
| 	    ret = read (s, in_ptr, in_buf_size - in_len); | ||||
| 	    if (ret < 0) | ||||
| 		err (1, "read"); | ||||
| 	    else if (ret == 0) | ||||
| 		errx (1, "EOF during read"); | ||||
|  | ||||
| 	    in_len += ret; | ||||
| 	    in_ptr += ret; | ||||
| 	    *in_ptr = '\0'; | ||||
|  | ||||
| 	    beg = in_buf; | ||||
| 	    rem = in_len; | ||||
| 	    while(rem > 1 | ||||
| 		  && (p = strstr(beg, "\r\n")) != NULL) { | ||||
| 		if (state == TOP) { | ||||
| 		    char *copy = beg; | ||||
|  | ||||
| 		    for (i = 0; i < numheaders; i++) { | ||||
| 			size_t len; | ||||
|  | ||||
| 			len = min(p - copy + 1, strlen(headers[i])); | ||||
| 			if (strncasecmp(copy, headers[i], len) == 0) { | ||||
| 			    fprintf (stdout, "%.*s\n", (int)(p - copy), copy); | ||||
| 			} | ||||
| 		    } | ||||
| 		    if (beg[0] == '.' && beg[1] == '\r' && beg[2] == '\n') { | ||||
| 			if (numheaders > 1) | ||||
| 			    fprintf (stdout, "\n"); | ||||
| 			state = STAT; | ||||
| 			if (++retrieved == count) { | ||||
| 			    state = QUIT; | ||||
| 			    net_write (s, "QUIT\r\n", 6); | ||||
| 			    if (verbose > 1) | ||||
| 				fprintf (stderr, "QUIT\r\n"); | ||||
| 			} | ||||
| 		    } | ||||
| 		    rem -= p - beg + 2; | ||||
| 		    beg = p + 2; | ||||
| 		} else if (state == RETR) { | ||||
| 		    char *copy = beg; | ||||
| 		    if (beg[0] == '.') { | ||||
| 			if (beg[1] == '\r' && beg[2] == '\n') { | ||||
| 			    if(!blank_line) | ||||
| 				write_state_add(&write_state, "\n", 1); | ||||
| 			    state = STAT; | ||||
| 			    rem -= p - beg + 2; | ||||
| 			    beg = p + 2; | ||||
| 			    if (++retrieved == count) { | ||||
| 				write_state_flush (&write_state); | ||||
| 				if (fsync (out_fd) < 0) | ||||
| 				    err (1, "fsync"); | ||||
| 				close(out_fd); | ||||
| 				if (leavep) { | ||||
| 				    state = QUIT; | ||||
| 				    net_write (s, "QUIT\r\n", 6); | ||||
| 				    if (verbose > 1) | ||||
| 					fprintf (stderr, "QUIT\r\n"); | ||||
| 				} else { | ||||
| 				    if (forkp) { | ||||
| 					pid_t pid; | ||||
|  | ||||
| 					pid = fork(); | ||||
| 					if (pid < 0) | ||||
| 					    warn ("fork"); | ||||
| 					else if(pid != 0) { | ||||
| 					    if(verbose) | ||||
| 						fprintf (stderr, | ||||
| 							 "(exiting)"); | ||||
| 					    return 0; | ||||
| 					} | ||||
| 				    } | ||||
|  | ||||
| 				    state = XDELE; | ||||
| 				    if (verbose) | ||||
| 					fprintf (stderr, "deleting... "); | ||||
| 				} | ||||
| 			    } | ||||
| 			    continue; | ||||
| 			} else | ||||
| 			    ++copy; | ||||
| 		    } | ||||
| 		    *p = '\n'; | ||||
| 		    if(blank_line && | ||||
| 		       strncmp(copy, "From ", min(p - copy + 1, 5)) == 0) | ||||
| 			write_state_add(&write_state, ">", 1); | ||||
| 		    write_state_add(&write_state, copy, p - copy + 1); | ||||
| 		    blank_line = (*copy == '\n'); | ||||
| 		    rem -= p - beg + 2; | ||||
| 		    beg = p + 2; | ||||
| 		} else if (rem >= 3 && strncmp (beg, "+OK", 3) == 0) { | ||||
| 		    if (state == STAT) { | ||||
| 			if (!do_from) | ||||
| 			    write_state_add(&write_state, | ||||
| 					    from_line, from_line_length); | ||||
| 			blank_line = 0; | ||||
| 			if (do_from) | ||||
| 			    state = TOP; | ||||
| 			else | ||||
| 			    state = RETR; | ||||
| 		    } else if (state == XDELE) { | ||||
| 			state = QUIT; | ||||
| 			net_write (s, "QUIT\r\n", 6); | ||||
| 			if (verbose > 1) | ||||
| 			    fprintf (stderr, "QUIT\r\n"); | ||||
| 			break; | ||||
| 		    } else if (state == DELE) { | ||||
| 			if (++deleted == count) { | ||||
| 			    state = QUIT; | ||||
| 			    net_write (s, "QUIT\r\n", 6); | ||||
| 			    if (verbose > 1) | ||||
| 				fprintf (stderr, "QUIT\r\n"); | ||||
| 			    break; | ||||
| 			} | ||||
| 		    } else if (++state == STAT) { | ||||
| 			if(sscanf (beg + 4, "%u %u", &count, &bytes) != 2) | ||||
| 			    errx(1, "Bad STAT-line: %.*s", (int)(p - beg), beg); | ||||
| 			if (verbose) { | ||||
| 			    fprintf (stderr, "%u message(s) (%u bytes). " | ||||
| 				     "fetching... ", | ||||
| 				     count, bytes); | ||||
| 			    if (do_from) | ||||
| 				fprintf (stderr, "\n"); | ||||
| 			} else if (do_count) { | ||||
| 			    fprintf (stderr, "%u message(s) (%u bytes).\n", | ||||
| 				     count, bytes); | ||||
| 			} | ||||
| 			if (count == 0) { | ||||
| 			    state = QUIT; | ||||
| 			    net_write (s, "QUIT\r\n", 6); | ||||
| 			    if (verbose > 1) | ||||
| 				fprintf (stderr, "QUIT\r\n"); | ||||
| 			    break; | ||||
| 			} | ||||
| 		    } | ||||
|  | ||||
| 		    rem -= p - beg + 2; | ||||
| 		    beg = p + 2; | ||||
| 		} else { | ||||
| 		    if(state == XDELE) { | ||||
| 			state = DELE; | ||||
| 			rem -= p - beg + 2; | ||||
| 			beg = p + 2; | ||||
| 		    } else | ||||
| 			errx (1, "Bad response: %.*s", (int)(p - beg), beg); | ||||
| 		} | ||||
| 	    } | ||||
| 	    if (!do_from) | ||||
| 		write_state_flush (&write_state); | ||||
|  | ||||
| 	    memmove (in_buf, beg, rem); | ||||
| 	    in_len = rem; | ||||
| 	    in_ptr = in_buf + rem; | ||||
| 	} | ||||
| 	if (FD_ISSET(s, &writeset)) { | ||||
| 	    if ((state == STAT && !do_from) || state == RETR) | ||||
| 		out_len = snprintf (out_buf, sizeof(out_buf), | ||||
| 				    "RETR %u\r\n", ++asked_for); | ||||
| 	    else if ((state == STAT && do_from) || state == TOP) | ||||
| 		out_len = snprintf (out_buf, sizeof(out_buf), | ||||
| 				    "TOP %u 0\r\n", ++asked_for); | ||||
| 	    else if(state == XDELE) { | ||||
| 		out_len = snprintf(out_buf, sizeof(out_buf), | ||||
| 				   "XDELE %u %u\r\n", 1, count); | ||||
| 		sent_xdele++; | ||||
| 	    } | ||||
| 	    else if(state == DELE) | ||||
| 		out_len = snprintf (out_buf, sizeof(out_buf), | ||||
| 				    "DELE %u\r\n", ++asked_deleted); | ||||
| 	    if (out_len < 0 || out_len > sizeof(out_buf)) | ||||
| 		errx (1, "snprintf failed"); | ||||
| 	    if (net_write (s, out_buf, out_len) != out_len) | ||||
| 		err (1, "write"); | ||||
| 	    if (verbose > 1) | ||||
| 		fprintf (stderr, "%s", out_buf); | ||||
| 	} | ||||
|     } | ||||
|     if (verbose) | ||||
| 	fprintf (stderr, "Done\n"); | ||||
|     if (do_from) { | ||||
| 	free (tmp); | ||||
| 	free (headers); | ||||
|     } else { | ||||
| 	write_state_destroy (&write_state); | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| #ifdef KRB5 | ||||
| static int | ||||
| do_v5 (const char *host, | ||||
|        int port, | ||||
|        const char *user, | ||||
|        const char *filename, | ||||
|        const char *header_str, | ||||
|        int leavep, | ||||
|        int verbose, | ||||
|        int forkp) | ||||
| { | ||||
|     krb5_error_code ret; | ||||
|     krb5_auth_context auth_context = NULL; | ||||
|     krb5_principal server; | ||||
|     const char *estr; | ||||
|     int s; | ||||
|  | ||||
|     s = do_connect (host, port, 1); | ||||
|     if (s < 0) | ||||
| 	return 1; | ||||
|  | ||||
|     ret = krb5_sname_to_principal (context, | ||||
| 				   host, | ||||
| 				   "pop", | ||||
| 				   KRB5_NT_SRV_HST, | ||||
| 				   &server); | ||||
|     if (ret) { | ||||
| 	estr = krb5_get_error_message(context, ret); | ||||
| 	warnx ("krb5_sname_to_principal: %s", estr); | ||||
| 	krb5_free_error_message(context, estr); | ||||
| 	return 1; | ||||
|     } | ||||
|  | ||||
|     ret = krb5_sendauth (context, | ||||
| 			 &auth_context, | ||||
| 			 &s, | ||||
| 			 "KPOPV1.0", | ||||
| 			 NULL, | ||||
| 			 server, | ||||
| 			 0, | ||||
| 			 NULL, | ||||
| 			 NULL, | ||||
| 			 NULL, | ||||
| 			 NULL, | ||||
| 			 NULL, | ||||
| 			 NULL); | ||||
|     krb5_free_principal (context, server); | ||||
|     if (ret) { | ||||
| 	estr = krb5_get_error_message(context, ret); | ||||
| 	warnx ("krb5_sendauth: %s", estr); | ||||
| 	krb5_free_error_message(context, estr); | ||||
| 	return 1; | ||||
|     } | ||||
|     return doit (s, host, user, filename, header_str, leavep, verbose, forkp); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #ifdef HESIOD | ||||
|  | ||||
| #ifdef HESIOD_INTERFACES | ||||
|  | ||||
| static char * | ||||
| hesiod_get_pobox (const char **user) | ||||
| { | ||||
|     void *context; | ||||
|     struct hesiod_postoffice *hpo; | ||||
|     char *ret = NULL; | ||||
|  | ||||
|     if(hesiod_init (&context) != 0) | ||||
| 	err (1, "hesiod_init"); | ||||
|  | ||||
|     hpo = hesiod_getmailhost (context, *user); | ||||
|     if (hpo == NULL) { | ||||
| 	warn ("hesiod_getmailhost %s", *user); | ||||
|     } else { | ||||
| 	if (strcasecmp(hpo->hesiod_po_type, "pop") != 0) | ||||
| 	    errx (1, "Unsupported po type %s", hpo->hesiod_po_type); | ||||
|  | ||||
| 	ret = estrdup(hpo->hesiod_po_host); | ||||
| 	*user = estrdup(hpo->hesiod_po_name); | ||||
| 	hesiod_free_postoffice (context, hpo); | ||||
|     } | ||||
|     hesiod_end (context); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| #else /* !HESIOD_INTERFACES */ | ||||
|  | ||||
| static char * | ||||
| hesiod_get_pobox (const char **user) | ||||
| { | ||||
|     char *ret = NULL; | ||||
|     struct hes_postoffice *hpo; | ||||
|  | ||||
|     hpo = hes_getmailhost (*user); | ||||
|     if (hpo == NULL) { | ||||
| 	warn ("hes_getmailhost %s", *user); | ||||
|     } else { | ||||
| 	if (strcasecmp(hpo->po_type, "pop") != 0) | ||||
| 	    errx (1, "Unsupported po type %s", hpo->po_type); | ||||
|  | ||||
| 	ret = estrdup(hpo->po_host); | ||||
| 	*user = estrdup(hpo->po_name); | ||||
|     } | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| #endif /* HESIOD_INTERFACES */ | ||||
|  | ||||
| #endif /* HESIOD */ | ||||
|  | ||||
| static char * | ||||
| get_pobox (const char **user) | ||||
| { | ||||
|     char *ret = NULL; | ||||
|  | ||||
| #ifdef HESIOD | ||||
|     ret = hesiod_get_pobox (user); | ||||
| #endif | ||||
|  | ||||
|     if (ret == NULL) | ||||
| 	ret = getenv("MAILHOST"); | ||||
|     if (ret == NULL) | ||||
| 	errx (1, "MAILHOST not set"); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| static void | ||||
| parse_pobox (char *a0, const char **host, const char **user) | ||||
| { | ||||
|     const char *h, *u; | ||||
|     char *p; | ||||
|     int po = 0; | ||||
|  | ||||
|     if (a0 == NULL) { | ||||
|  | ||||
| 	*user = getenv ("USERNAME"); | ||||
| 	if (*user == NULL) { | ||||
| 	    struct passwd *pwd = getpwuid (getuid ()); | ||||
|  | ||||
| 	    if (pwd == NULL) | ||||
| 		errx (1, "Who are you?"); | ||||
| 	    *user = estrdup (pwd->pw_name); | ||||
| 	} | ||||
| 	*host = get_pobox (user); | ||||
| 	return; | ||||
|     } | ||||
|  | ||||
|     /* if the specification starts with po:, remember this information */ | ||||
|     if(strncmp(a0, "po:", 3) == 0) { | ||||
| 	a0 += 3; | ||||
| 	po++; | ||||
|     } | ||||
|     /* if there is an `@', the hostname is after it, otherwise at the | ||||
|        beginning of the string */ | ||||
|     p = strchr(a0, '@'); | ||||
|     if(p != NULL) { | ||||
| 	*p++ = '\0'; | ||||
| 	h = p; | ||||
|     } else { | ||||
| 	h = a0; | ||||
|     } | ||||
|     /* if there is a `:', the username comes before it, otherwise at | ||||
|        the beginning of the string */ | ||||
|     p = strchr(a0, ':'); | ||||
|     if(p != NULL) { | ||||
| 	*p++ = '\0'; | ||||
| 	u = p; | ||||
|     } else { | ||||
| 	u = a0; | ||||
|     } | ||||
|     if(h == u) { | ||||
| 	/* some inconsistent compatibility with various mailers */ | ||||
| 	if(po) { | ||||
| 	    h = get_pobox (&u); | ||||
| 	} else { | ||||
| 	    u = get_default_username (); | ||||
| 	    if (u == NULL) | ||||
| 		errx (1, "Who are you?"); | ||||
| 	} | ||||
|     } | ||||
|     *host = h; | ||||
|     *user = u; | ||||
| } | ||||
|  | ||||
| int | ||||
| main(int argc, char **argv) | ||||
| { | ||||
|     int port = 0; | ||||
|     int optind = 0; | ||||
|     int ret = 1; | ||||
|     const char *host, *user, *filename = NULL; | ||||
|     char *pobox = NULL; | ||||
|  | ||||
|     setprogname (argv[0]); | ||||
|  | ||||
| #ifdef KRB5 | ||||
|     { | ||||
| 	krb5_error_code ret; | ||||
|  | ||||
| 	ret = krb5_init_context (&context); | ||||
| 	if (ret) | ||||
| 	    errx (1, "krb5_init_context failed: %d", ret); | ||||
|     } | ||||
| #endif | ||||
|  | ||||
|     if (getarg (args, sizeof(args) / sizeof(args[0]), argc, argv, | ||||
| 		&optind)) | ||||
| 	usage (1); | ||||
|  | ||||
|     argc -= optind; | ||||
|     argv += optind; | ||||
|  | ||||
|     if (do_help) | ||||
| 	usage (0); | ||||
|  | ||||
|     if (do_version) { | ||||
| 	print_version(NULL); | ||||
| 	return 0; | ||||
|     } | ||||
|  | ||||
|     if (do_from && header_str == NULL) | ||||
| 	header_str = "From:"; | ||||
|     else if (header_str != NULL) | ||||
| 	do_from = 1; | ||||
|  | ||||
|     if (do_from) { | ||||
| 	if (argc == 0) | ||||
| 	    pobox = NULL; | ||||
| 	else if (argc == 1) | ||||
| 	    pobox = argv[0]; | ||||
| 	else | ||||
| 	    usage (1); | ||||
|     } else { | ||||
| 	if (argc == 1) { | ||||
| 	    filename = argv[0]; | ||||
| 	    pobox    = NULL; | ||||
| 	} else if (argc == 2) { | ||||
| 	    filename = argv[1]; | ||||
| 	    pobox    = argv[0]; | ||||
| 	} else | ||||
| 	    usage (1); | ||||
|     } | ||||
|  | ||||
|     if (port_str) { | ||||
| 	struct servent *s = roken_getservbyname (port_str, "tcp"); | ||||
|  | ||||
| 	if (s) | ||||
| 	    port = s->s_port; | ||||
| 	else { | ||||
| 	    char *ptr; | ||||
|  | ||||
| 	    port = strtol (port_str, &ptr, 10); | ||||
| 	    if (port == 0 && ptr == port_str) | ||||
| 		errx (1, "Bad port `%s'", port_str); | ||||
| 	    port = htons(port); | ||||
| 	} | ||||
|     } | ||||
|     if (port == 0) { | ||||
| #ifdef KRB5 | ||||
| 	port = krb5_getportbyname (context, "kpop", "tcp", 1109); | ||||
| #else | ||||
| #error must define KRB5 | ||||
| #endif | ||||
|     } | ||||
|  | ||||
|     parse_pobox (pobox, &host, &user); | ||||
|  | ||||
| #ifdef KRB5 | ||||
|     if (ret && use_v5) { | ||||
| 	ret = do_v5 (host, port, user, filename, header_str, | ||||
| 		     do_leave, verbose_level, do_fork); | ||||
|     } | ||||
| #endif | ||||
|     return ret; | ||||
| } | ||||
| @@ -1,94 +0,0 @@ | ||||
| /* | ||||
|  * Copyright (c) 1997, 1998 Kungliga Tekniska Högskolan | ||||
|  * (Royal Institute of Technology, Stockholm, Sweden). | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * | ||||
|  * 3. Neither the name of the Institute nor the names of its contributors | ||||
|  *    may be used to endorse or promote products derived from this software | ||||
|  *    without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  */ | ||||
|  | ||||
| /* $Id$ */ | ||||
|  | ||||
| #ifdef HAVE_CONFIG_H | ||||
| #include <config.h> | ||||
| #endif | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #ifdef HAVE_FCNTL_H | ||||
| #include <fcntl.h> | ||||
| #endif | ||||
| #ifdef HAVE_ERRNO_H | ||||
| #include <errno.h> | ||||
| #endif | ||||
| #include <ctype.h> | ||||
| #include <limits.h> | ||||
| #include <time.h> | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SELECT_H | ||||
| #include <sys/select.h> | ||||
| #endif | ||||
| #ifdef HAVE_UNISTD_H | ||||
| #include <unistd.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_UIO_H | ||||
| #include <sys/uio.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN6_H | ||||
| #include <netinet/in6.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET6_IN6_H | ||||
| #include <netinet6/in6.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_TCP_H | ||||
| #include <netinet/tcp.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETDB_H | ||||
| #include <netdb.h> | ||||
| #endif | ||||
| #ifdef HAVE_PWD_H | ||||
| #include <pwd.h> | ||||
| #endif | ||||
| #ifdef HESIOD | ||||
| #include <hesiod.h> | ||||
| #endif | ||||
|  | ||||
| #include <roken.h> | ||||
| #include <err.h> | ||||
| #include <getarg.h> | ||||
| #ifdef KRB5 | ||||
| #include <krb5.h> | ||||
| #endif | ||||
| @@ -48,11 +48,6 @@ LIB_door_create		= @LIB_door_create@ | ||||
| LIB_openssl_crypto      = @LIB_openssl_crypto@ | ||||
| INCLUDE_openssl_crypto  = @INCLUDE_openssl_crypto@ | ||||
|  | ||||
| HESIODLIB = @HESIODLIB@ | ||||
| HESIODINCLUDE = @HESIODINCLUDE@ | ||||
| INCLUDE_hesiod = @INCLUDE_hesiod@ | ||||
| LIB_hesiod = @LIB_hesiod@ | ||||
|  | ||||
| INCLUDE_krb4 = @INCLUDE_krb4@ | ||||
| LIB_krb4 = @LIB_krb4@ | ||||
|  | ||||
|   | ||||
| @@ -309,8 +309,6 @@ rk_TEST_PACKAGE(libedit, | ||||
|  | ||||
| AC_CONFIG_SUBDIRS([lib/libedit]) | ||||
|  | ||||
| rk_TEST_PACKAGE(hesiod,[#include <hesiod.h>],-lhesiod,,, HESIOD) | ||||
|  | ||||
| KRB_C_BIGENDIAN | ||||
| AC_C_INLINE | ||||
|  | ||||
| @@ -634,7 +632,6 @@ AC_CONFIG_FILES(Makefile 		\ | ||||
| 	appl/dbutils/Makefile		\ | ||||
| 	appl/gssmask/Makefile		\ | ||||
| 	appl/otp/Makefile		\ | ||||
| 	appl/push/Makefile		\ | ||||
| 	appl/su/Makefile		\ | ||||
| 	appl/test/Makefile		\ | ||||
| 	appl/kf/Makefile		\ | ||||
|   | ||||
| @@ -1234,9 +1234,6 @@ static const char *const rcsid[] = { (const char *)rcsid, "@(#)" msg } | ||||
| /* Define if you have the `__progname' variable. */ | ||||
| /* #define HAVE___PROGNAME 1 */ | ||||
|  | ||||
| /* Define if you have the hesiod package. */ | ||||
| /* #undef HESIOD */ | ||||
|  | ||||
| /* Define if you are running IRIX 4. */ | ||||
| /* #undef IRIX4 */ | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Viktor Dukhovni
					Viktor Dukhovni