View | Details | Raw Unified | Return to bug 236
Collapse All | Expand All

(-)session.c (-1 / +10 lines)
Lines 1820-1832 Link Here
1820
{
1820
{
1821
	static char buf[1024];
1821
	static char buf[1024];
1822
	int i;
1822
	int i;
1823
	char *cp;
1824
1823
	buf[0] = '\0';
1825
	buf[0] = '\0';
1824
	for (i = 0; i < MAX_SESSIONS; i++) {
1826
	for (i = 0; i < MAX_SESSIONS; i++) {
1825
		Session *s = &sessions[i];
1827
		Session *s = &sessions[i];
1826
		if (s->used && s->ttyfd != -1) {
1828
		if (s->used && s->ttyfd != -1) {
1829
			
1830
			if (strncmp(s->tty, "/dev/", 5) != 0) {
1831
				cp = strrchr(s->tty, '/');
1832
				cp = (cp == NULL) ? s->tty : cp + 1;
1833
			} else
1834
				cp = s->tty + 5;
1835
			
1827
			if (buf[0] != '\0')
1836
			if (buf[0] != '\0')
1828
				strlcat(buf, ",", sizeof buf);
1837
				strlcat(buf, ",", sizeof buf);
1829
			strlcat(buf, strrchr(s->tty, '/') + 1, sizeof buf);
1838
			strlcat(buf, cp, sizeof buf);
1830
		}
1839
		}
1831
	}
1840
	}
1832
	if (buf[0] == '\0')
1841
	if (buf[0] == '\0')
(-)sshd.c (-1 / +9 lines)
Lines 796-804 Link Here
796
	__progname = get_progname(av[0]);
796
	__progname = get_progname(av[0]);
797
	init_rng();
797
	init_rng();
798
798
799
	/* Save argv. */
799
	/* Save argv. Duplicate so setproctitle emulation doesn't clobber it */
800
	saved_argc = ac;
800
	saved_argc = ac;
801
	saved_argv = av;
801
	saved_argv = av;
802
	saved_argv = xmalloc(sizeof(*saved_argv) * ac);
803
	for (i = 0; i < ac; i++)
804
		saved_argv[i] = xstrdup(av[i]);
805
806
#ifndef HAVE_SETPROCTITLE
807
	/* Prepare for later setproctitle emulation */
808
	compat_init_setproctitle(ac, av);
809
#endif
802
810
803
	/* Initialize configuration options to their default values. */
811
	/* Initialize configuration options to their default values. */
804
	initialize_server_options(&options);
812
	initialize_server_options(&options);
(-)openbsd-compat/bsd-misc.c (-2 / +8 lines)
Lines 23-37 Link Here
23
 */
23
 */
24
24
25
#include "includes.h"
25
#include "includes.h"
26
#include "xmalloc.h"
26
27
27
RCSID("$Id: bsd-misc.c,v 1.5 2001/10/10 20:38:56 mouring Exp $");
28
RCSID("$Id: bsd-misc.c,v 1.5 2001/10/10 20:38:56 mouring Exp $");
28
29
29
char *get_progname(char *argv0)
30
char *get_progname(char *argv0)
30
{
31
{
32
	/*
33
	 * XXX: duplicate __progname in case it is an alias for argv[0]
34
	 * Otherwise it may get clobbered by setproctitle()
35
	 */
31
#ifdef HAVE___PROGNAME
36
#ifdef HAVE___PROGNAME
32
	extern char *__progname;
37
	extern char *__progname;
33
38
34
	return __progname;
39
	return xstrdup(__progname);
35
#else
40
#else
36
	char *p;
41
	char *p;
37
42
Lines 42-48 Link Here
42
		p = argv0;
47
		p = argv0;
43
	else
48
	else
44
		p++;
49
		p++;
45
	return p;
50
51
	return xstrdup(p);
46
#endif
52
#endif
47
}
53
}
48
54
(-)openbsd-compat/setproctitle.c (-70 / +216 lines)
Lines 1-102 Link Here
1
/*
1
/*
2
 * Modified for OpenSSH by Kevin Steves
2
 * Based on src/backend/utils/misc/pg_status.c from 
3
 * October 2000
3
 * PostgreSQL Database Management System
4
 * 
5
 * Portions Copyright (c) 1996-2001, The PostgreSQL Global Development Group
6
 * 
7
 * Portions Copyright (c) 1994, The Regents of the University of California
8
 * 
9
 * Permission to use, copy, modify, and distribute this software and its
10
 * documentation for any purpose, without fee, and without a written agreement
11
 * is hereby granted, provided that the above copyright notice and this
12
 * paragraph and the following two paragraphs appear in all copies.
13
 * 
14
 * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
15
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING
16
 * LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS
17
 * DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE
18
 * POSSIBILITY OF SUCH DAMAGE.
19
 * 
20
 * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
21
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
22
 * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
23
 * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO
24
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
4
 */
25
 */
5
26
6
/*
27
/*--------------------------------------------------------------------
7
 * Copyright (c) 1994, 1995 Christopher G. Demetriou
28
 * ps_status.c
8
 * All rights reserved.
29
 *
30
 * Routines to support changing the ps display of PostgreSQL backends
31
 * to contain some useful information. Mechanism differs wildly across
32
 * platforms.
9
 *
33
 *
10
 * Redistribution and use in source and binary forms, with or without
34
 * $Header: /cvsroot/pgsql/src/backend/utils/misc/ps_status.c,v 1.12 2001/12/21 15:22:09 tgl Exp $
11
 * modification, are permitted provided that the following conditions
12
 * are met:
13
 * 1. Redistributions of source code must retain the above copyright
14
 *    notice, this list of conditions and the following disclaimer.
15
 * 2. Redistributions in binary form must reproduce the above copyright
16
 *    notice, this list of conditions and the following disclaimer in the
17
 *    documentation and/or other materials provided with the distribution.
18
 * 3. All advertising materials mentioning features or use of this software
19
 *    must display the following acknowledgement:
20
 *      This product includes software developed by Christopher G. Demetriou
21
 *	for the NetBSD Project.
22
 * 4. The name of the author may not be used to endorse or promote products
23
 *    derived from this software without specific prior written permission
24
 *
35
 *
25
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
36
 * Copyright 2000 by PostgreSQL Global Development Group
26
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37
 * various details abducted from various places
27
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
38
 *--------------------------------------------------------------------
28
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
29
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
30
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
34
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
 */
39
 */
36
40
37
#if defined(LIBC_SCCS) && !defined(lint)
38
static char rcsid[] = "$OpenBSD: setproctitle.c,v 1.8 2001/11/06 19:21:40 art Exp $";
39
#endif /* LIBC_SCCS and not lint */
40
41
#include "includes.h"
41
#include "includes.h"
42
42
43
#ifndef HAVE_SETPROCTITLE
43
#ifndef HAVE_SETPROCTITLE
44
44
45
#define SPT_NONE	0
45
#include <unistd.h>
46
#define SPT_PSTAT	1
46
#ifdef HAVE_SYS_PSTAT_H
47
#include <sys/pstat.h>		/* for HP-UX */
48
#endif
49
#ifdef HAVE_PS_STRINGS
50
#include <machine/vmparam.h>	/* for old BSD */
51
#include <sys/exec.h>
52
#endif
53
54
extern char **environ;
47
55
48
#ifndef SPT_TYPE
56
/*------
49
#define SPT_TYPE	SPT_NONE
57
 * Alternative ways of updating ps display:
58
 *
59
 * PS_USE_PSTAT
60
 *	   use the pstat(PSTAT_SETCMD, )
61
 *	   (HPUX)
62
 * PS_USE_PS_STRINGS
63
 *	   assign PS_STRINGS->ps_argvstr = "string"
64
 *	   (some BSD systems)
65
 * PS_USE_CHANGE_ARGV
66
 *	   assign argv[0] = "string"
67
 *	   (some other BSD systems)
68
 * PS_USE_CLOBBER_ARGV
69
 *	   write over the argv and environment area
70
 *	   (most SysV-like systems)
71
 * PS_USE_NONE
72
 *	   don't update ps display
73
 *	   (This is the default, as it is safest.)
74
 */
75
#if defined(HAVE_PSTAT) && defined(PSTAT_SETCMD)
76
#define PS_USE_PSTAT
77
#elif defined(HAVE_PS_STRINGS)
78
#define PS_USE_PS_STRINGS
79
#elif defined(BSD) || defined(__bsdi__) || defined(__hurd__)
80
#define PS_USE_CHANGE_ARGV
81
#elif defined(__linux__) || defined(_AIX) || defined(__sgi) || (defined(sun) && !defined(BSD)) || defined(ultrix) || defined(__ksr__) || defined(__osf__) || defined(__QNX__) || defined(__svr4__) || defined(__svr5__) || defined(__darwin__)
82
#define PS_USE_CLOBBER_ARGV
83
#else
84
#define PS_USE_NONE
50
#endif
85
#endif
51
86
52
#if SPT_TYPE == SPT_PSTAT
87
/* Different systems want the buffer padded differently */
53
#include <sys/param.h>
88
#if defined(_AIX) || defined(__linux__) || defined(__QNX__) || defined(__svr4__)
54
#include <sys/pstat.h>
89
#define PS_PADDING '\0'
55
#endif /* SPT_TYPE == SPT_PSTAT */
90
#else
91
#define PS_PADDING ' '
92
#endif
56
93
57
#define	MAX_PROCTITLE	2048
94
/*
95
 * argv clobbering uses existing argv space, all other methods need a buffer
96
 */
97
#ifndef PS_USE_CLOBBER_ARGV
98
static char ps_buffer[256];
99
static const size_t ps_buffer_size = sizeof(ps_buffer);
100
#else /* PS_USE_CLOBBER_ARGV */
101
static char *ps_buffer;			/* will point to argv area */
102
static size_t ps_buffer_size;		/* space determined at run time */
103
#endif   /* PS_USE_CLOBBER_ARGV */
104
105
/* save the original argv[] location here */
106
static int	save_argc;
107
static char **save_argv;
58
108
59
extern char *__progname;
109
extern char *__progname;
60
110
61
/*
111
/*
62
 * Set Process Title (SPT) defines.  Modeled after sendmail's
112
 * Call this to update the ps status display to a fixed prefix plus an
63
 * SPT type definition strategy.
113
 * indication of what you're currently doing passed in the argument.
64
 *
65
 * SPT_TYPE:
66
 *
67
 * SPT_NONE:	Don't set the process title.  Default.
68
 * SPT_PSTAT:	Use pstat(PSTAT_SETCMD).  HP-UX specific.
69
 */
114
 */
70
71
void
115
void
72
setproctitle(const char *fmt, ...)
116
setproctitle(const char *fmt, ...)
73
{
117
{
74
#if SPT_TYPE != SPT_NONE
118
#ifdef PS_USE_PSTAT
119
	union pstun pst;
120
#endif
121
#ifndef PS_USE_NONE
122
	ssize_t used;
75
	va_list ap;
123
	va_list ap;
76
	
77
	char buf[MAX_PROCTITLE];
78
	size_t used;
79
124
80
#if SPT_TYPE == SPT_PSTAT
125
	/* no ps display if you didn't call save_ps_display_args() */
81
	union pstun pst;
126
	if (save_argv == NULL)
82
#endif /* SPT_TYPE == SPT_PSTAT */
127
		return;
128
#ifdef PS_USE_CLOBBER_ARGV
129
	/* If ps_buffer is a pointer, it might still be null */
130
	if (ps_buffer == NULL)
131
		return;
132
#endif /* PS_USE_CLOBBER_ARGV */
133
134
	/*
135
	 * Overwrite argv[] to point at appropriate space, if needed
136
	 */
137
#ifdef PS_USE_CHANGE_ARGV
138
	save_argv[0] = ps_buffer;
139
	save_argv[1] = NULL;
140
#endif /* PS_USE_CHANGE_ARGV */
141
142
#ifdef PS_USE_CLOBBER_ARGV
143
	save_argv[1] = NULL;
144
#endif /* PS_USE_CLOBBER_ARGV */
145
146
	/*
147
	 * Make fixed prefix of ps display.
148
	 */
83
149
84
	va_start(ap, fmt);
150
	va_start(ap, fmt);
85
	if (fmt != NULL) {
151
	if (fmt == NULL)
86
		used = snprintf(buf, MAX_PROCTITLE, "%s: ", __progname);
152
		snprintf(ps_buffer, ps_buffer_size, "%s", __progname);
87
		if (used >= MAX_PROCTITLE)
153
	else {
88
			used = MAX_PROCTITLE - 1;
154
		used = snprintf(ps_buffer, ps_buffer_size, "%s: ", __progname);
89
		(void)vsnprintf(buf + used, MAX_PROCTITLE - used, fmt, ap);
155
		if (used == -1 || used >= ps_buffer_size)
90
	} else
156
			used = ps_buffer_size;
91
		(void)snprintf(buf, MAX_PROCTITLE, "%s", __progname);
157
		vsnprintf(ps_buffer + used, ps_buffer_size - used, fmt, ap);
158
	}
92
	va_end(ap);
159
	va_end(ap);
93
	used = strlen(buf);
94
160
95
#if SPT_TYPE == SPT_PSTAT
161
	error("XXXXXXXXX %s", __progname);
96
	pst.pst_command = buf;
162
	error("XXXXXXXXX %d", ps_buffer_size);
97
	pstat(PSTAT_SETCMD, pst, used, 0, 0);
163
	error("XXXXXXXXX %s", ps_buffer);
98
#endif /* SPT_TYPE == SPT_PSTAT */
164
165
#ifdef PS_USE_PSTAT
166
	pst.pst_command = ps_buffer;
167
	pstat(PSTAT_SETCMD, pst, strlen(ps_buffer), 0, 0);
168
#endif   /* PS_USE_PSTAT */
169
170
#ifdef PS_USE_PS_STRINGS
171
	PS_STRINGS->ps_nargvstr = 1;
172
	PS_STRINGS->ps_argvstr = ps_buffer;
173
#endif   /* PS_USE_PS_STRINGS */
174
175
#ifdef PS_USE_CLOBBER_ARGV
176
	/* pad unused memory */
177
	used = strlen(ps_buffer);
178
	memset(ps_buffer + used, PS_PADDING, ps_buffer_size - used);
179
#endif   /* PS_USE_CLOBBER_ARGV */
99
180
100
#endif /* SPT_TYPE != SPT_NONE */
181
#endif /* PS_USE_NONE */
101
}
182
}
183
102
#endif /* HAVE_SETPROCTITLE */
184
#endif /* HAVE_SETPROCTITLE */
185
186
/*
187
 * Call this early in startup to save the original argc/argv values.
188
 *
189
 * argv[] will not be overwritten by this routine, but may be overwritten
190
 * during setproctitle. Also, the physical location of the environment
191
 * strings may be moved, so this should be called before any code that
192
 * might try to hang onto a getenv() result.
193
 */
194
void
195
compat_init_setproctitle(int argc, char *argv[])
196
{
197
#ifdef PS_USE_CLOBBER_ARGV
198
	char *end_of_area = NULL;
199
	char **new_environ;
200
	int i;
201
#endif
202
203
	save_argc = argc;
204
	save_argv = argv;
205
206
#ifdef PS_USE_CLOBBER_ARGV
207
	/*
208
	 * If we're going to overwrite the argv area, count the available
209
	 * space.  Also move the environment to make additional room.
210
	 */
211
212
	/*
213
	 * check for contiguous argv strings
214
	 */
215
	for (i = 0; i < argc; i++) {
216
		if (i == 0 || end_of_area + 1 == argv[i])
217
			end_of_area = argv[i] + strlen(argv[i]);
218
	}
219
220
	/* probably can't happen? */
221
	if (end_of_area == NULL) {
222
		ps_buffer = NULL;
223
		ps_buffer_size = 0;
224
		return;
225
	}
226
227
	/*
228
	 * check for contiguous environ strings following argv
229
	 */
230
	for (i = 0; environ[i] != NULL; i++) {
231
		if (end_of_area + 1 == environ[i])
232
			end_of_area = environ[i] + strlen(environ[i]);
233
	}
234
235
	ps_buffer = argv[0];
236
	ps_buffer_size = end_of_area - argv[0] - 1;
237
238
	/*
239
	 * Duplicate and move the environment out of the way
240
	 */
241
	new_environ = malloc(sizeof(char *) * (i + 1));
242
	for (i = 0; environ[i] != NULL; i++)
243
		new_environ[i] = strdup(environ[i]);
244
	new_environ[i] = NULL;
245
	environ = new_environ;
246
#endif /* PS_USE_CLOBBER_ARGV */
247
}
248
(-)openbsd-compat/setproctitle.h (+1 lines)
Lines 7-12 Link Here
7
7
8
#ifndef HAVE_SETPROCTITLE
8
#ifndef HAVE_SETPROCTITLE
9
void setproctitle(const char *fmt, ...);
9
void setproctitle(const char *fmt, ...);
10
void compat_init_setproctitle(int argc, char *argv[]);
10
#endif
11
#endif
11
12
12
#endif /* _BSD_SETPROCTITLE_H */
13
#endif /* _BSD_SETPROCTITLE_H */

Return to bug 236