Let me start this with the disclaimer that I am a Linux lover that only
pretends to
have any clue about coding.
I grabbed the latest version of OpenSSH (v2.9p1) and went to install it
on my Sparc
(RH 6.2, v2.4.2). Unlike OpenSSH 2.5.2p2, however, when I tried to
compile it
I got the following error:
... <compiling away> ...
gcc -g -O2 -Wall -I. -I. -I/usr/local/ssl/include
-DETCDIR=\"/usr/local/etc\" -
D_PATH_SSH_PROGRAM=\"/usr/local/bin/ssh\"
-D_PATH_SSH_ASKPASS_DEFAULT=\"/usr/loc
al/libexec/ssh-askpass\"
-D_PATH_SFTP_SERVER=\"/usr/local/libexec/sftp-server\"
-D_PATH_SSH_PIDDIR=\"/var/run\" -DHAVE_CONFIG_H -c channels.c
channels.c: In function `auth_input_request_forwarding':
channels.c:2613: warning: implicit declaration of function `mkdtemp'
channels.c:2613: warning: comparison between pointer and integer
channels.c:2626: warning: passing arg 1 of `on_exit' from incompatible
pointer type
channels.c:2626: too few arguments to function `on_exit'
make: *** [channels.o] Error 1
This was not good.
After doing a little research I discovered that atexit() apparently
doesn't work
on my current system (in glibc > 2.1 it is declared external, which
breaks things
on Sparc...I don't claim to fully follow, so read the news groups for
more info).
Further reading indicated that on_exit() has a different parameter list
than atexit(),
as shown below:
int atexit(void (*function)(void));
int on_exit(void (*function)(int , void *), void *arg);
Since the differing parameter is for arguments I thought it might be
safe to just
set it to NULL, as shown below:
/* if (atexit(cleanup_socket) < 0) { */ /* Original, causes
gcc to barf */
if (on_exit(cleanup_socket, NULL) < 0) { /* Revised, now
finger-lickin' good */
This seems to do the trick, allowing me to compile. Furthermore, I've
been running
the daemon for a little while now and I don't *seem* to have any bad
things happening.
I put together a patch to fix the required files (channels.c,
ssh-agent.c) and listed it
below.
Anyhow, I've posted this for two reasons:
1) So that all the C-impaired people of the world (such as myself) who
want to compile
OpenSSH2.9p1 on Sparc can do so without the crying, screaming, and
cursing that I
had to endure. Just remember, I am not a coder (nor do I play one on
TV), so this
is not guaranteed to be good or even recommended; it may not even
work; it may break
things; standard disclaimers apply.
2) So that all the C/OpenSSH/General-UNIX gurus out there can point out
if there is a
better way to fix this, if this is harmful, etc.
Please drop a line to me at the (obviously spam-protected) address
DELETEcbodzin at home.com
and let me know.
Patch follows - put the text into a file and then type "cat
<patchfile>
| patch -p1" from
your openssh2.9p1 directory to install.
----------------------------------------------------------
*** channels.c Fri May 11 16:06:04 2001
--- channels.c.new Fri May 11 16:07:29 2001
***************
*** 2623,2629 ****
snprintf(channel_forwarded_auth_socket_name, MAX_SOCKET_NAME,
"%s/agent.%d",
channel_forwarded_auth_socket_dir, (int) getpid());
! if (atexit(cleanup_socket) < 0) {
int saved = errno;
cleanup_socket();
packet_disconnect("socket: %.100s", strerror(saved));
--- 2623,2633 ----
snprintf(channel_forwarded_auth_socket_name, MAX_SOCKET_NAME,
"%s/agent.%d",
channel_forwarded_auth_socket_dir, (int) getpid());
! /* This is bad...on_exit requires 2 parameters, whereas
! at_exit only takes one. Field 2 is arguments, so let's
! see if we can fool it by passing null - Corey 5/11/01 */
! /* if (atexit(cleanup_socket) < 0) { */
! if (on_exit(cleanup_socket, NULL) < 0) {
int saved = errno;
cleanup_socket();
packet_disconnect("socket: %.100s", strerror(saved));
*** ssh-agent.c Fri May 11 16:05:57 2001
--- ssh-agent.c.new Fri May 11 16:07:20 2001
***************
*** 860,866 ****
perror("setsid");
cleanup_exit(1);
}
! if (atexit(cleanup_socket) < 0) {
perror("atexit");
cleanup_exit(1);
}
--- 860,870 ----
perror("setsid");
cleanup_exit(1);
}
! /* This is bad...on_exit requires 2 parameters, whereas
! at_exit only takes one. Field 2 is arguments, so let's
! see if we can fool it by passing null - Corey 5/11/01 */
! /* if (atexit(cleanup_socket) < 0) { */
! if (on_exit(cleanup_socket, NULL) < 0) {
perror("atexit");
cleanup_exit(1);
}
mouring at etoh.eviladmin.org
2001-May-11 23:48 UTC
Problems with OpenSSH2.9p1 on Linux/Sparc
The real issue is here in defines.h... #if !defined(HAVE_ATEXIT) && defined(HAVE_ON_EXIT) # define atexit(a) on_exit(a) ^^^^^^^^^^^ On Linux on_exit() takes two arguments What platform does on_exit() have a single argument? I believe this should be: # define atexit(a) on_exit(a, NULL) SunOS 4.x requires two arguments also. - Ben On Fri, 11 May 2001, Corey Bodzin wrote:> Let me start this with the disclaimer that I am a Linux lover that only > pretends to > have any clue about coding. > > I grabbed the latest version of OpenSSH (v2.9p1) and went to install it > on my Sparc > (RH 6.2, v2.4.2). Unlike OpenSSH 2.5.2p2, however, when I tried to > compile it > I got the following error: > > ... <compiling away> ... > gcc -g -O2 -Wall -I. -I. -I/usr/local/ssl/include > -DETCDIR=\"/usr/local/etc\" - > D_PATH_SSH_PROGRAM=\"/usr/local/bin/ssh\" > -D_PATH_SSH_ASKPASS_DEFAULT=\"/usr/loc > al/libexec/ssh-askpass\" > -D_PATH_SFTP_SERVER=\"/usr/local/libexec/sftp-server\" > -D_PATH_SSH_PIDDIR=\"/var/run\" -DHAVE_CONFIG_H -c channels.c > channels.c: In function `auth_input_request_forwarding': > channels.c:2613: warning: implicit declaration of function `mkdtemp' > channels.c:2613: warning: comparison between pointer and integer > channels.c:2626: warning: passing arg 1 of `on_exit' from incompatible > pointer type > channels.c:2626: too few arguments to function `on_exit' > make: *** [channels.o] Error 1 > > This was not good. > > After doing a little research I discovered that atexit() apparently > doesn't work > on my current system (in glibc > 2.1 it is declared external, which > breaks things > on Sparc...I don't claim to fully follow, so read the news groups for > more info). > Further reading indicated that on_exit() has a different parameter list > than atexit(), > as shown below: > > int atexit(void (*function)(void)); > int on_exit(void (*function)(int , void *), void *arg); > > Since the differing parameter is for arguments I thought it might be > safe to just > set it to NULL, as shown below: > > /* if (atexit(cleanup_socket) < 0) { */ /* Original, causes > gcc to barf */ > if (on_exit(cleanup_socket, NULL) < 0) { /* Revised, now > finger-lickin' good */ > > This seems to do the trick, allowing me to compile. Furthermore, I've > been running > the daemon for a little while now and I don't *seem* to have any bad > things happening. > I put together a patch to fix the required files (channels.c, > ssh-agent.c) and listed it > below. > > Anyhow, I've posted this for two reasons: > > 1) So that all the C-impaired people of the world (such as myself) who > want to compile > OpenSSH2.9p1 on Sparc can do so without the crying, screaming, and > cursing that I > had to endure. Just remember, I am not a coder (nor do I play one on > TV), so this > is not guaranteed to be good or even recommended; it may not even > work; it may break > things; standard disclaimers apply. > > 2) So that all the C/OpenSSH/General-UNIX gurus out there can point out > if there is a > better way to fix this, if this is harmful, etc. > > Please drop a line to me at the (obviously spam-protected) address > DELETEcbodzin at home.com > and let me know. > > Patch follows - put the text into a file and then type "cat <patchfile> > | patch -p1" from > your openssh2.9p1 directory to install. > > ---------------------------------------------------------- > > *** channels.c Fri May 11 16:06:04 2001 > --- channels.c.new Fri May 11 16:07:29 2001 > *************** > *** 2623,2629 **** > snprintf(channel_forwarded_auth_socket_name, MAX_SOCKET_NAME, > "%s/agent.%d", > channel_forwarded_auth_socket_dir, (int) getpid()); > > ! if (atexit(cleanup_socket) < 0) { > int saved = errno; > cleanup_socket(); > packet_disconnect("socket: %.100s", strerror(saved)); > --- 2623,2633 ---- > snprintf(channel_forwarded_auth_socket_name, MAX_SOCKET_NAME, > "%s/agent.%d", > channel_forwarded_auth_socket_dir, (int) getpid()); > > ! /* This is bad...on_exit requires 2 parameters, whereas > ! at_exit only takes one. Field 2 is arguments, so let's > ! see if we can fool it by passing null - Corey 5/11/01 */ > ! /* if (atexit(cleanup_socket) < 0) { */ > ! if (on_exit(cleanup_socket, NULL) < 0) { > int saved = errno; > cleanup_socket(); > packet_disconnect("socket: %.100s", strerror(saved)); > *** ssh-agent.c Fri May 11 16:05:57 2001 > --- ssh-agent.c.new Fri May 11 16:07:20 2001 > *************** > *** 860,866 **** > perror("setsid"); > cleanup_exit(1); > } > ! if (atexit(cleanup_socket) < 0) { > perror("atexit"); > cleanup_exit(1); > } > --- 860,870 ---- > perror("setsid"); > cleanup_exit(1); > } > ! /* This is bad...on_exit requires 2 parameters, whereas > ! at_exit only takes one. Field 2 is arguments, so let's > ! see if we can fool it by passing null - Corey 5/11/01 */ > ! /* if (atexit(cleanup_socket) < 0) { */ > ! if (on_exit(cleanup_socket, NULL) < 0) { > perror("atexit"); > cleanup_exit(1); > } > >