From 7f7f772444634b36f815d5f5d7a1a38aa4f68c40 Mon Sep 17 00:00:00 2001 From: Mark Janssen Date: Sun, 26 Feb 2006 09:13:40 +0000 Subject: [PATCH] Fosdem changes git-svn-id: https://proxytunnel.svn.sourceforge.net/svnroot/proxytunnel/trunk/proxytunnel@120 bc163920-b10d-0410-b2c5-a5491ca2ceef --- LICENSE.txt | 19 ++- Makefile | 27 +++- Makefile.cygwin | 33 ----- Makefile.darwin | 32 ----- Makefile.no-gcc | 31 ----- Makefile.no-gnu-getopts | 38 ----- Makefile.solaris | 31 ----- cmdline.c | 15 +- http.c | 3 +- io.c | 25 +--- proxytunnel.c | 71 ++++++++-- proxytunnel.h | 8 +- setproctitle.c | 299 +++++++++++++--------------------------- strlcat.c | 72 ++++++++++ strlcpy.c | 68 +++++++++ 15 files changed, 344 insertions(+), 428 deletions(-) delete mode 100755 Makefile.cygwin delete mode 100755 Makefile.darwin delete mode 100644 Makefile.no-gcc delete mode 100755 Makefile.no-gnu-getopts delete mode 100755 Makefile.solaris create mode 100644 strlcat.c create mode 100644 strlcpy.c diff --git a/LICENSE.txt b/LICENSE.txt index 9fea64b..35a5ca2 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,6 +1,6 @@ -Proxytunnel is covered by the GNU GPL included below. Most of the code -was written by Jos Visser and Mark Janssen, the snippet of base64 code -came from mutt, and was written by: Brendan Cully +Proxytunnel is covered by the GNU GPL, version 2, included below. Most of +the code was written by Jos Visser and Mark Janssen, the snippet of base64 +code came from mutt, and was written by: Brendan Cully and came with the following copyright notice: /* @@ -15,10 +15,12 @@ and came with the following copyright notice: * redistribution of source. */ -The setproctitle code came from sendmail, and comes with the following -license-text (it's a 4-clause BSD license) +The setproctitle code (including strlcat/strlcpy) came from openssh, and +comes with the following license-text (it's a 3-clause BSD license) +/* Based on conf.c from UCB sendmail 8.8.8 */ /* + * Copyright 2003 Damien Miller * Copyright (c) 1983, 1995-1997 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. @@ -31,11 +33,7 @@ license-text (it's a 4-clause BSD license) * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -53,6 +51,7 @@ license-text (it's a 4-clause BSD license) */ + Other contributors can be found in the CREDITS file diff --git a/Makefile b/Makefile index 9c65b8e..bcf707a 100755 --- a/Makefile +++ b/Makefile @@ -2,10 +2,27 @@ # # Please uncomment the appropriate settings -CC ?= gcc -CFLAGS ?= -Wall -O2 -g -CFLAGS += -DHAVE_GETOPT_LONG -DUSE_SSL -CFLAGS += -DSETPROCTITLE -DSPT_TYPE=1 +CC ?= cc +CFLAGS ?= -Wall -O2 -ggdb +CFLAGS += -DHAVE_GETOPT_LONG # Comment on non-gnu systems +CFLAGS += -DUSE_SSL # Comment if you don't have/want ssl +# Most systems +CFLAGS += -DSETPROCTITLE -DSPT_TYPE=2 + +# System dependant blocks... if your system is listed below, uncomment +# the relevant lines + +# OpenBSD +#CFLAGS += -DHAVE_SYS_PSTAT_H +# DARWIN +#CFLAGS += -DDARWIN +# CYGWIN +#CFLAGS += -DCYGWIN +# SOLARIS +#LDFLAGS += -lsocket -lnsl +#LDFLAGS += -L/usr/local/ssl/lib # Path to your SSL lib dir + +# END system dependant block SSL_LIBS := $(shell pkg-config --libs libssl 2>/dev/null) ifeq ($(SSL_LIBS),) @@ -23,6 +40,8 @@ MANDIR = $(PREFIX)/man/man1 PROGNAME = proxytunnel OBJ = proxytunnel.o \ base64.o \ + strlcpy.o \ + strlcat.o \ setproctitle.o \ io.o \ http.o \ diff --git a/Makefile.cygwin b/Makefile.cygwin deleted file mode 100755 index 4e51138..0000000 --- a/Makefile.cygwin +++ /dev/null @@ -1,33 +0,0 @@ -# Makefile for proxytunnel -# -# Please uncomment the appropriate settings - -CC ?= gcc -CFLAGS ?= -Wall -DHAVE_GETOPT_LONG -DCYGWIN -CFLAGS += -DUSE_SSL -CFLAGS += -DSETPROCTITLE -LDFLAGS ?= -lssl -lcrypto -INSTALLPATH ?= $(DESTDIR)/usr/local/bin -MANPATH ?= $(DESTDIR)/usr/local/man/man1 - -PROGNAME = proxytunnel -OBJ = proxytunnel.o \ - base64.o \ - io.o \ - http.o \ - ntlm.o \ - basicauth.o \ - messages.o \ - setproctitle.o \ - cmdline.o - -proxytunnel: $(OBJ) - $(CC) -o $(PROGNAME) -static $(OBJ) $(LDFLAGS) - -clean: - @rm -f $(PROGNAME) $(OBJ) - -install: - mkdir -p $(INSTALLPATH) - install -g root -m755 -o root $(PROGNAME) $(INSTALLPATH)/$(PROGNAME) - install -g root -m644 -o root debian/$(PROGNAME).1 $(MANPATH)/$(PROGNAME).1 diff --git a/Makefile.darwin b/Makefile.darwin deleted file mode 100755 index cc8a932..0000000 --- a/Makefile.darwin +++ /dev/null @@ -1,32 +0,0 @@ -# Makefile for proxytunnel -# -# Please uncomment the appropriate settings - -CC ?= gcc -CFLAGS ?= -Wall -DDARWIN -DHAVE_GETOPT_LONG -CFLAGS += -DUSE_SSL -CFLAGS += -DSETPROCTITLE -LDFLAGS ?= -lcrypto -lssl -INSTALLPATH ?= $(DESTDIR)/usr/local/bin -MANPATH ?= $(DESTDIR)/usr/local/man/man1 - -PROGNAME = proxytunnel -OBJ = proxytunnel.o \ - base64.o \ - io.o \ - ntlm.o \ - http.o \ - basicauth.o \ - messages.o \ - cmdline.o - -proxytunnel: $(OBJ) - $(CC) -o $(PROGNAME) $(OBJ) $(LDFLAGS) - -clean: - @rm -f $(PROGNAME) $(OBJ) - -install: - mkdir -p $(INSTALLPATH) - install -g root -m755 -o root $(PROGNAME) $(INSTALLPATH)/$(PROGNAME) - install -g root -m644 -o root debian/$(PROGNAME).1 $(MANPATH)/$(PROGNAME).1 diff --git a/Makefile.no-gcc b/Makefile.no-gcc deleted file mode 100644 index e304e4c..0000000 --- a/Makefile.no-gcc +++ /dev/null @@ -1,31 +0,0 @@ -# Makefile for proxytunnel -# -# Please uncomment the appropriate settings - -CC ?= cc -CFLAGS ?= -CFLAGS += -DUSE_SSL -CFLAGS += -DPROCTITLE -LDFLAGS += -lssl -lcrypto -INSTALLPATH ?= $(DESTDIR)/usr/bin - -PROGNAME = proxytunnel -OBJ = proxytunnel.o \ - base64.o \ - io.o \ - setproctitle.o \ - http.o \ - ntlm.o \ - basicauth.o \ - messages.o \ - cmdline.o - -proxytunnel: $(OBJ) - $(CC) -o $(PROGNAME) $(OBJ) $(LDFLAGS) - -clean: - @rm -f $(PROGNAME) $(OBJ) - -install: - mkdir -p $(INSTALLPATH) - install -g root -m755 -o root $(PROGNAME) $(INSTALLPATH)/$(PROGNAME) diff --git a/Makefile.no-gnu-getopts b/Makefile.no-gnu-getopts deleted file mode 100755 index f26a572..0000000 --- a/Makefile.no-gnu-getopts +++ /dev/null @@ -1,38 +0,0 @@ -# Makefile for proxytunnel -# -# Please uncomment the appropriate settings - -CC ?= gcc -CFLAGS ?= -Wall -O2 -CFLAGS += -DUSE_SSL -CFLAGS += -DSETPROCTITLE -LDFLAGS += -lssl -lcrypto - -PREFIX =/usr/local -BINDIR = $(PREFIX)/bin -DATADIR = $(PREFIX)/share -MANDIR = $(DATADIR)/man - -DESTDIR = - -PROGNAME = proxytunnel -OBJ = proxytunnel.o \ - base64.o \ - setproctitle.o \ - io.o \ - http.o \ - basicauth.o \ - messages.o \ - cmdline.o \ - ntlm.o - -proxytunnel: $(OBJ) - $(CC) -o $(PROGNAME) $(CFLAGS) $(OBJ) $(LDFLAGS) - -clean: - @rm -f $(PROGNAME) $(OBJ) - -install: - mkdir -p $(INSTALLPATH) $(INSTALLMANPATH) - install -D -m755 $(PROGNAME) $(DESTDIR)$(BINDIR)/$(PROGNAME) - install -D -m644 debian/$(PROGNAME).1 $(DESTDIR)$(MANDIR))/$(PROGNAME).1 diff --git a/Makefile.solaris b/Makefile.solaris deleted file mode 100755 index 12b6869..0000000 --- a/Makefile.solaris +++ /dev/null @@ -1,31 +0,0 @@ -# Makefile for proxytunnel -# -# Please uncomment the appropriate settings - -CC ?= gcc -CFLAGS ?= -Wall -I/usr/local/ssl/include -CFLAGS += -DUSE_SSL -CFLAGS += -DSETPROCTITLE -LDFLAGS = -lsocket -lnsl -L/usr/local/ssl/lib -lssl -lcrypto -INSTALLPATH = /usr/local/bin - -PROGNAME = proxytunnel -OBJ = proxytunnel.o \ - base64.o \ - io.o \ - http.o \ - ntlm.o \ - basicauth.o \ - setproctitle.o \ - messages.o \ - cmdline.o - -proxytunnel: $(OBJ) - $(CC) -o $(PROGNAME) $(OBJ) $(LDFLAGS) - -clean: - @rm -f $(PROGNAME) $(OBJ) - -install: - mkdir -p $(INSTALLPATH) - install -g root -m755 -o root $(PROGNAME) $(INSTALLPATH)/$(PROGNAME) diff --git a/cmdline.c b/cmdline.c index 8e4f18f..51b362a 100755 --- a/cmdline.c +++ b/cmdline.c @@ -32,7 +32,6 @@ #include "cmdline.h" - void cmdline_parser_print_version (void) { @@ -404,10 +403,11 @@ if (args_info->proxy_given ) char * phost; int pport; - phost = malloc( 51 ); + phost = malloc( 50+1 ); -/* fprintf( stderr, "%s: proxyhost (pre parse) given, it is: '%s'\n", PACKAGE, args_info->proxy_arg ); */ - r = sscanf( args_info->proxy_arg, "%50[^:]:%d", phost, &pport ); + //fprintf( stderr, "%s: proxyhost (pre parse) given, it is: '%s'\n", PACKAGE, args_info->proxy_arg ); + + r = sscanf( args_info->proxy_arg, "%50[^:]:%5u", phost, &pport ); if ( r == 2 ) { args_info->proxyhost_arg = phost; @@ -415,7 +415,12 @@ if (args_info->proxy_given ) args_info->proxyhost_given = 1; args_info->proxyport_given = 1; } -/* fprintf( stderr, "%s: proxyhost (post parse) is '%s':'%d'\n", PACKAGE, args_info->proxyhost_arg, args_info->proxyport_arg ); */ + else + { + message( "parse_cmdline: couln't find your proxy hostname/ip\n" ); + missing_required_options++; + } + //message( "%s: proxyhost (post parse) is '%s':'%d'\n", PACKAGE, args_info->proxyhost_arg, args_info->proxyport_arg ); } if ( missing_required_options ) diff --git a/http.c b/http.c index 2d97498..5378f07 100644 --- a/http.c +++ b/http.c @@ -161,7 +161,8 @@ void proxy_protocol() */ analyze_HTTP(); - if (args_info.remproxy_given ) { + if (args_info.remproxy_given ) + { /* * Clean buffer for next analysis */ diff --git a/io.c b/io.c index 6d1fe6d..b9784d7 100644 --- a/io.c +++ b/io.c @@ -295,28 +295,5 @@ void cpio() break; } } - - /* - * Close all files we deal with - */ - close( read_fd ); -#ifdef USE_SSL - if( args_info.encrypt_flag ) - { - SSL_free (ssl); - SSL_CTX_free (ctx); - } -#else - close( sd ); -#endif - - if( read_fd != write_fd ) /* When not running from inetd */ - { - close( write_fd ); - } - - if( args_info.verbose_flag ) - { - message( "Tunnel closed\n" ); - } + closeall(); } diff --git a/proxytunnel.c b/proxytunnel.c index e32fda9..8fa5dfd 100755 --- a/proxytunnel.c +++ b/proxytunnel.c @@ -61,14 +61,8 @@ SSL_METHOD *meth; */ void signal_handler( int signal ) { - close(0); - close(1); - - if ( sd != 0 ) - close( sd ); - message( "Tunnel closed on signal %d\n", signal ); - exit(1); + closeall(); } /* @@ -157,13 +151,46 @@ void do_ssl() /* * Leave a goodbye message */ -void einde() { +void closeall() { + message( "In closeall\n"); + + if( args_info.verbose_flag ) + { + message( "Tunnel closed\n" ); + } + #ifdef CYGWIN message( "Goodbye" ); #else syslog(LOG_NOTICE,"Goodbye..."); closelog(); #endif + + /* + * Close all files we deal with + */ + close(0); + close(1); + + if ( sd != 0 ) + close( sd ); + + +#ifdef USE_SSL + if( args_info.encrypt_flag ) + { + SSL_free (ssl); + SSL_CTX_free (ctx); + } +#else + close( sd ); +#endif + + if( read_fd != write_fd ) /* When not running from inetd */ + { + close( write_fd ); + } + close( read_fd ); } /* @@ -200,6 +227,14 @@ void do_daemon() signal(SIGHUP,SIG_IGN); signal(SIGCHLD,SIG_IGN); +#ifdef SETPROCTITLE + if( args_info.proctitle_given ) + setproctitle( "%s [daemon]\0", args_info.proctitle_arg ); +#else + if( args_info.proctitle_given ) + message( "Setting process-title is not supported in this build\n"); +#endif + /* For the moment, turn of forking into background on the cygwin platform * so users can run it in a command window and ctrl-c it to cancel. * Also so we can put logging there, since there's nog syslog on cygwin (AFAIK) @@ -220,7 +255,7 @@ void do_daemon() openlog( program_name, LOG_CONS|LOG_PID,LOG_DAEMON ); i_am_daemon = 1; #endif /* CYGWIN */ - atexit( einde ); + atexit( closeall ); listen( listen_sd, 5 ); while (1==1) @@ -261,6 +296,18 @@ void do_daemon() proxy_protocol(); proxy_protocol(); } + +#ifdef USE_SSL + if( args_info.encrypt_flag ) + do_ssl(); +#endif +#ifdef SETPROCTITLE + if( args_info.proctitle_given ) + setproctitle( "%s [child]\0", args_info.proctitle_arg ); +#else + if( args_info.proctitle_given ) + message( "Setting process-title is not supported in this build\n"); +#endif cpio(); exit( 0 ); } @@ -283,7 +330,7 @@ void do_daemon() /* * We begin at the beginning */ -int main( int argc, char *argv[], char *envp[] ) +int main( int argc, char *argv[] ) { program_name = argv[0]; @@ -293,7 +340,7 @@ int main( int argc, char *argv[], char *envp[] ) cmdline_parser( argc, argv, &args_info ); #ifdef SETPROCTITLE - initsetproctitle( argc, argv, envp ); + initsetproctitle( argc, argv ); #endif /* @@ -355,7 +402,7 @@ int main( int argc, char *argv[], char *envp[] ) #endif #ifdef SETPROCTITLE if( args_info.proctitle_given ) - setproctitle( "%s\0", args_info.proctitle_arg ); + setproctitle( "%s [cpio]\0", args_info.proctitle_arg ); #else if( args_info.proctitle_given ) message( "Setting process-title is not supported in this build\n"); diff --git a/proxytunnel.h b/proxytunnel.h index 87eff36..41da5c5 100644 --- a/proxytunnel.h +++ b/proxytunnel.h @@ -35,11 +35,13 @@ void tunnel_connect(); void analyze_HTTP(); void proxy_protocol(); void do_ssl(); -void einde(); +void closeall(); void do_daemon(); -int initsetproctitle(int argc, char *argv[], char* envp[]); +void initsetproctitle(int argc, char *argv[]); void setproctitle(const char *fmt, ...); -int main( int argc, char *argv[], char *envp[] ); +size_t strlcat(char *dst, const char *src, size_t siz); +size_t strlcpy(char *dst, const char *src, size_t siz); +int main( int argc, char *argv[] ); /* Globals */ int sd; /* The tunnel's socket descriptor */ diff --git a/setproctitle.c b/setproctitle.c index 1c285ca..7fc6edb 100644 --- a/setproctitle.c +++ b/setproctitle.c @@ -1,4 +1,7 @@ +/* Based on conf.c from UCB sendmail 8.8.8 */ + /* + * Copyright 2003 Damien Miller * Copyright (c) 1983, 1995-1997 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. @@ -11,11 +14,7 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -32,242 +31,134 @@ * SUCH DAMAGE. */ -#ifdef SETPROCTITLE - #include #include #include #include #include #include - #include +#include "proxytunnel.h" -#define VA_LOCAL_DECL va_list ap; -#define VA_START(f) va_start(ap, f) -#define VA_END va_end(ap) - -/* return number of bytes left in a buffer */ -#define SPACELEFT(buf, ptr) (sizeof buf - ((ptr) - buf)) - -/* -** SETPROCTITLE -- set process title for ps -** -** Parameters: -** fmt -- a printf style format string. -** a, b, c -- possible parameters to fmt. -** -** Returns: -** none. -** -** Side Effects: -** Clobbers argv of our main procedure so ps(1) will -** display the title. -*/ +#ifndef HAVE_SETPROCTITLE #define SPT_NONE 0 /* don't use it at all */ -#define SPT_REUSEARGV 1 /* cover argv with title information */ -#define SPT_BUILTIN 2 /* use libc builtin */ -#define SPT_PSTAT 3 /* use pstat(PSTAT_SETCMD, ...) */ -#define SPT_PSSTRINGS 4 /* use PS_STRINGS->... */ -#define SPT_SYSMIPS 5 /* use sysmips() supported by NEWS-OS 6 */ -#define SPT_SCO 6 /* write kernel u. area */ -#define SPT_CHANGEARGV 7 /* write our own strings into argv[] */ +#define SPT_PSTAT 1 /* use pstat(PSTAT_SETCMD, ...) */ +#define SPT_REUSEARGV 2 /* cover argv with title information */ -#define MAXLINE 2048 /* max line length */ +#include +#ifdef HAVE_SYS_PSTAT_H +#include +#define SPT_TYPE SPT_PSTAT +#endif #ifndef SPT_TYPE # define SPT_TYPE SPT_NONE #endif -#if SPT_TYPE != SPT_NONE && SPT_TYPE != SPT_BUILTIN +#ifndef SPT_PADCHAR +# define SPT_PADCHAR '\0' +#endif -# if SPT_TYPE == SPT_PSTAT -# include -# endif -# if SPT_TYPE == SPT_PSSTRINGS -# include -# include -# ifndef PS_STRINGS /* hmmmm.... apparently not available after all */ -# undef SPT_TYPE -# define SPT_TYPE SPT_REUSEARGV -# else -# ifndef NKPDE /* FreeBSD 2.0 */ -# define NKPDE 63 -typedef unsigned int *pt_entry_t; -# endif -# endif -# endif +#if SPT_TYPE == SPT_REUSEARGV +static char *argv_start = NULL; +static size_t argv_env_len = 0; +#endif -# if SPT_TYPE == SPT_PSSTRINGS || SPT_TYPE == SPT_CHANGEARGV -# define SETPROC_STATIC static -# else -# define SETPROC_STATIC -# endif +#endif /* HAVE_SETPROCTITLE */ -# if SPT_TYPE == SPT_SYSMIPS -# include -# include -# endif - -# if SPT_TYPE == SPT_SCO -# include -# include -# include -# include -# if PSARGSZ > MAXLINE -# define SPT_BUFSIZE PSARGSZ -# endif -# endif - -# ifndef SPT_PADCHAR -# define SPT_PADCHAR '\0' -# endif - -# ifndef SPT_BUFSIZE -# define SPT_BUFSIZE MAXLINE -# endif - -#endif /* SPT_TYPE != SPT_NONE && SPT_TYPE != SPT_BUILTIN */ - -/* -** Pointers for setproctitle. -** This allows "ps" listings to give more useful information. -*/ - -char **Argv = NULL; /* pointer to argument vector */ -char *LastArgv = NULL; /* end of argv */ - -int -initsetproctitle(argc, argv, envp) - int argc; - char **argv; - char **envp; +void initsetproctitle(int argc, char *argv[]) { - register int i, envpsize = 0; +#if defined(SPT_TYPE) && SPT_TYPE == SPT_REUSEARGV extern char **environ; + char *lastargv = NULL; + char **envp = environ; + int i; /* - ** Move the environment so setproctitle can use the space at - ** the top of memory. - */ + * NB: This assumes that argv has already been copied out of the + * way. This is true for sshd, but may not be true for other + * programs. Beware. + */ + if (argc == 0 || argv[0] == NULL) + return; + + /* Fail if we can't allocate room for the new environment */ for (i = 0; envp[i] != NULL; i++) - envpsize += strlen(envp[i]) + 1; - environ = (char **) malloc(sizeof (char *) * (i + 1)); - if (environ == NULL) - return -1; - /* ---> removed some macro calls */ - for (i = 0; envp[i] != NULL; i++) { - size_t len = strlen(envp[i]) + 1; - char *p = malloc(len); - if (p == NULL) - return -1; - environ[i] = strncpy(p, envp[i], len); - p[len - 1] = (int)NULL; + ; + if ((environ = malloc(sizeof(*environ) * (i + 1))) == NULL) { + environ = envp; /* put it back */ + return; } + + /* + * Find the last argv string or environment variable within + * our process memory area. + */ + for (i = 0; i < argc; i++) { + if (lastargv == NULL || lastargv + 1 == argv[i]) + lastargv = argv[i] + strlen(argv[i]); + } + for (i = 0; envp[i] != NULL; i++) { + if (lastargv + 1 == envp[i]) + lastargv = envp[i] + strlen(envp[i]); + } + + argv[1] = NULL; + argv_start = argv[0]; + argv_env_len = lastargv - argv[0] - 1; + + /* + * Copy environment + * XXX - will truncate env on strdup fail + */ + for (i = 0; envp[i] != NULL; i++) + environ[i] = strdup(envp[i]); environ[i] = NULL; - - /* - ** Save start and extent of argv for setproctitle. - */ - - Argv = argv; - - /* - ** Find the last environment variable within sendmail's - ** process memory area. - */ - while (i > 0 && (envp[i - 1] < argv[0] || - envp[i - 1] > (argv[argc - 1] + - strlen(argv[argc - 1]) + 1 + envpsize))) - i--; - - if (i > 0) - LastArgv = envp[i - 1] + strlen(envp[i - 1]); - else - LastArgv = argv[argc - 1] + strlen(argv[argc - 1]); - - return 0; +#endif /* SPT_REUSEARGV */ } -#if SPT_TYPE != SPT_BUILTIN - - -/*VARARGS1*/ +#ifndef HAVE_SETPROCTITLE void setproctitle(const char *fmt, ...) { -# if SPT_TYPE != SPT_NONE - register char *p; - register int i; - SETPROC_STATIC char buf[SPT_BUFSIZE]; - VA_LOCAL_DECL -# if SPT_TYPE == SPT_PSTAT +#if SPT_TYPE != SPT_NONE + va_list ap; + char buf[1024]; + size_t len; + extern char *__progname; +#if SPT_TYPE == SPT_PSTAT union pstun pst; -# endif -# if SPT_TYPE == SPT_SCO - off_t seek_off; - static int kmem = -1; - static int kmempid = -1; - struct user u; -# endif +#endif - p = buf; +#if SPT_TYPE == SPT_REUSEARGV + if (argv_env_len <= 0) + return; +#endif - /* print the argument string */ - VA_START(fmt); - vsnprintf(p, SPACELEFT(buf, p), fmt, ap); - VA_END; + strlcpy(buf, __progname, sizeof(buf)); - i = strlen(buf); + va_start(ap, fmt); + if (fmt != NULL) { + len = strlcat(buf, ": ", sizeof(buf)); + if (len < sizeof(buf)) + vsnprintf(buf + len, sizeof(buf) - len , fmt, ap); + } + va_end(ap); -# if SPT_TYPE == SPT_PSTAT +#if SPT_TYPE == SPT_PSTAT pst.pst_command = buf; - pstat(PSTAT_SETCMD, pst, i, 0, 0); -# endif -# if SPT_TYPE == SPT_PSSTRINGS - PS_STRINGS->ps_nargvstr = 1; - PS_STRINGS->ps_argvstr = buf; -# endif -# if SPT_TYPE == SPT_SYSMIPS - sysmips(SONY_SYSNEWS, NEWS_SETPSARGS, buf); -# endif -# if SPT_TYPE == SPT_SCO - if (kmem < 0 || kmempid != getpid()) - { - if (kmem >= 0) - close(kmem); - kmem = open(_PATH_KMEM, O_RDWR, 0); - if (kmem < 0) - return; - (void) fcntl(kmem, F_SETFD, 1); - kmempid = getpid(); - } - buf[PSARGSZ - 1] = '\0'; - seek_off = UVUBLK + (off_t) u.u_psargs - (off_t) &u; - if (lseek(kmem, (off_t) seek_off, SEEK_SET) == seek_off) - (void) write(kmem, buf, PSARGSZ); -# endif -# if SPT_TYPE == SPT_REUSEARGV - if (i > LastArgv - Argv[0] - 2) - { - i = LastArgv - Argv[0] - 2; - buf[i] = '\0'; - } - (void) strcpy(Argv[0], buf); - p = &Argv[0][i]; - while (p < LastArgv) - *p++ = SPT_PADCHAR; - Argv[1] = NULL; -# endif -# if SPT_TYPE == SPT_CHANGEARGV - Argv[0] = buf; - Argv[1] = 0; -# endif -# endif /* SPT_TYPE != SPT_NONE */ + pstat(PSTAT_SETCMD, pst, strlen(buf), 0, 0); +#elif SPT_TYPE == SPT_REUSEARGV +/* debug("setproctitle: copy \"%s\" into len %d", + buf, argv_env_len); */ + len = strlcpy(argv_start, buf, argv_env_len); + for(; len < argv_env_len; len++) + argv_start[len] = SPT_PADCHAR; +#endif + +#endif /* SPT_NONE */ } -#endif /* SPT_TYPE != SPT_BUILTIN */ - -#endif /* SETPROCTITLE */ +#endif /* HAVE_SETPROCTITLE */ diff --git a/strlcat.c b/strlcat.c new file mode 100644 index 0000000..912767a --- /dev/null +++ b/strlcat.c @@ -0,0 +1,72 @@ +/* OPENBSD ORIGINAL: lib/libc/string/strlcat.c */ + +/* $OpenBSD: strlcat.c,v 1.11 2003/06/17 21:56:24 millert Exp $ */ + +/* + * Copyright (c) 1998 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include +#include +#include + +#ifndef HAVE_STRLCAT + +#if defined(LIBC_SCCS) && !defined(lint) +static char *rcsid = "$OpenBSD: strlcat.c,v 1.11 2003/06/17 21:56:24 millert Exp $"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +/* + * Appends src to string dst of size siz (unlike strncat, siz is the + * full size of dst, not space left). At most siz-1 characters + * will be copied. Always NUL terminates (unless siz <= strlen(dst)). + * Returns strlen(src) + MIN(siz, strlen(initial dst)). + * If retval >= siz, truncation occurred. + */ +size_t +strlcat(char *dst, const char *src, size_t siz) +{ + register char *d = dst; + register const char *s = src; + register size_t n = siz; + size_t dlen; + + /* Find the end of dst and adjust bytes left but don't go past end */ + while (n-- != 0 && *d != '\0') + d++; + dlen = d - dst; + n = siz - dlen; + + if (n == 0) + return(dlen + strlen(s)); + while (*s != '\0') { + if (n != 1) { + *d++ = *s; + n--; + } + s++; + } + *d = '\0'; + + return(dlen + (s - src)); /* count does not include NUL */ +} + +#endif /* !HAVE_STRLCAT */ diff --git a/strlcpy.c b/strlcpy.c new file mode 100644 index 0000000..18dca7f --- /dev/null +++ b/strlcpy.c @@ -0,0 +1,68 @@ +/* OPENBSD ORIGINAL: lib/libc/string/strlcpy.c */ + +/* $OpenBSD: strlcpy.c,v 1.8 2003/06/17 21:56:24 millert Exp $ */ + +/* + * Copyright (c) 1998 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include +#include +#include + +#ifndef HAVE_STRLCPY + +#if defined(LIBC_SCCS) && !defined(lint) +static char *rcsid = "$OpenBSD: strlcpy.c,v 1.8 2003/06/17 21:56:24 millert Exp $"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +/* + * Copy src to string dst of size siz. At most siz-1 characters + * will be copied. Always NUL terminates (unless siz == 0). + * Returns strlen(src); if retval >= siz, truncation occurred. + */ +size_t +strlcpy(char *dst, const char *src, size_t siz) +{ + register char *d = dst; + register const char *s = src; + register size_t n = siz; + + /* Copy as many bytes as will fit */ + if (n != 0 && --n != 0) { + do { + if ((*d++ = *s++) == 0) + break; + } while (--n != 0); + } + + /* Not enough room in dst, add NUL and traverse rest of src */ + if (n == 0) { + if (siz != 0) + *d = '\0'; /* NUL-terminate dst */ + while (*s++) + ; + } + + return(s - src - 1); /* count does not include NUL */ +} + +#endif /* !HAVE_STRLCPY */