Hello all.
I got imapd-2004g working in 64-bit mode on a Solaris 2.8 host a while back.
The changes I had to do in order to get it to work, in ip{4,6}_unix.c
and tcp_unix.c, was primarily to change size_t* arguments to socklen_t*
arguments, since a socklen_t stays 32-bit on a 64-bit host, while size_t
does not. Dereference of these pointers would do funny things...
I have attached a diff with my changes. Keep in mind that I only got
this to work for:
- a big endian CPU (Sparc),
- imap (SSL and non-SSL) IP4 connection, and
- the Unix mailbox format.
Nothing else has been tested, and I stopped making any changes once I
got the above working. If you need anything else working, you probably
have to work at it a bit more.
Good Luck!
Jorgen
--
_______________________________________________________________________
Jorgen Wahlsten phone: +1-212-522-6194
Principal Systems Engineer AIM: jorgenwahlsten
Time Inc. Internet Technologies YIM: jorgenwahlsten
http://www.time.com/time/ ICQ: 171198501
diff -c -r imap-2004g.orig/src/osdep/unix/ip4_unix.c
imap-2004g/src/osdep/unix/ip4_unix.c
*** imap-2004g.orig/src/osdep/unix/ip4_unix.c Wed May 26 18:22:15 2004
--- imap-2004g/src/osdep/unix/ip4_unix.c Fri Dec 15 10:55:57 2006
***************
*** 32,40 ****
char *ip_sockaddrtostring (struct sockaddr *sadr);
long ip_sockaddrtoport (struct sockaddr *sadr);
void *ip_stringtoaddr (char *text,size_t *len,int *family);
! struct sockaddr *ip_newsockaddr (size_t *len);
struct sockaddr *ip_sockaddr (int family,void *adr,size_t adrlen,
! unsigned short port,size_t *len);
char *ip_sockaddrtoname (struct sockaddr *sadr);
void *ip_nametoaddr (char *name,size_t *len,int *family,char **canonical,
void **next);
--- 32,40 ----
char *ip_sockaddrtostring (struct sockaddr *sadr);
long ip_sockaddrtoport (struct sockaddr *sadr);
void *ip_stringtoaddr (char *text,size_t *len,int *family);
! struct sockaddr *ip_newsockaddr (socklen_t *len);
struct sockaddr *ip_sockaddr (int family,void *adr,size_t adrlen,
! unsigned short port,socklen_t *len);
char *ip_sockaddrtoname (struct sockaddr *sadr);
void *ip_nametoaddr (char *name,size_t *len,int *family,char **canonical,
void **next);
***************
*** 88,94 ****
* Returns: new, empty socket address of maximum size
*/
! struct sockaddr *ip_newsockaddr (size_t *len)
{
return (struct sockaddr *) memset (fs_get (SADRLEN),0,*len = SADRLEN);
}
--- 88,94 ----
* Returns: new, empty socket address of maximum size
*/
! struct sockaddr *ip_newsockaddr (socklen_t *len)
{
return (struct sockaddr *) memset (fs_get (SADRLEN),0,*len = SADRLEN);
}
***************
*** 104,110 ****
*/
struct sockaddr *ip_sockaddr (int family,void *adr,size_t adrlen,
! unsigned short port,size_t *len)
{
struct sockaddr *sadr = ip_newsockaddr (len);
switch (family) { /* build socket address based upon family */
--- 104,110 ----
*/
struct sockaddr *ip_sockaddr (int family,void *adr,size_t adrlen,
! unsigned short port,socklen_t *len)
{
struct sockaddr *sadr = ip_newsockaddr (len);
switch (family) { /* build socket address based upon family */
diff -c -r imap-2004g.orig/src/osdep/unix/ip6_unix.c
imap-2004g/src/osdep/unix/ip6_unix.c
*** imap-2004g.orig/src/osdep/unix/ip6_unix.c Tue Oct 12 14:02:23 2004
--- imap-2004g/src/osdep/unix/ip6_unix.c Fri Dec 15 10:55:57 2006
***************
*** 56,64 ****
char *ip_sockaddrtostring (struct sockaddr *sadr);
long ip_sockaddrtoport (struct sockaddr *sadr);
void *ip_stringtoaddr (char *text,size_t *len,int *family);
! struct sockaddr *ip_newsockaddr (size_t *len);
struct sockaddr *ip_sockaddr (int family,void *adr,size_t adrlen,
! unsigned short port,size_t *len);
char *ip_sockaddrtoname (struct sockaddr *sadr);
void *ip_nametoaddr (char *name,size_t *len,int *family,char **canonical,
void **next);
--- 56,64 ----
char *ip_sockaddrtostring (struct sockaddr *sadr);
long ip_sockaddrtoport (struct sockaddr *sadr);
void *ip_stringtoaddr (char *text,size_t *len,int *family);
! struct sockaddr *ip_newsockaddr (socklen_t *len);
struct sockaddr *ip_sockaddr (int family,void *adr,size_t adrlen,
! unsigned short port,socklen_t *len);
char *ip_sockaddrtoname (struct sockaddr *sadr);
void *ip_nametoaddr (char *name,size_t *len,int *family,char **canonical,
void **next);
***************
*** 146,152 ****
* Returns: new, empty socket address of maximum size
*/
! struct sockaddr *ip_newsockaddr (size_t *len)
{
return (struct sockaddr *) memset (fs_get (SADRLEN),0,*len = SADRLEN);
}
--- 146,152 ----
* Returns: new, empty socket address of maximum size
*/
! struct sockaddr *ip_newsockaddr (socklen_t *len)
{
return (struct sockaddr *) memset (fs_get (SADRLEN),0,*len = SADRLEN);
}
***************
*** 162,168 ****
*/
struct sockaddr *ip_sockaddr (int family,void *adr,size_t adrlen,
! unsigned short port,size_t *len)
{
struct sockaddr *sadr = ip_newsockaddr (len);
switch (family) { /* build socket address based upon family */
--- 162,168 ----
*/
struct sockaddr *ip_sockaddr (int family,void *adr,size_t adrlen,
! unsigned short port,socklen_t *len)
{
struct sockaddr *sadr = ip_newsockaddr (len);
switch (family) { /* build socket address based upon family */
diff -c -r imap-2004g.orig/src/osdep/unix/tcp_unix.c
imap-2004g/src/osdep/unix/tcp_unix.c
*** imap-2004g.orig/src/osdep/unix/tcp_unix.c Mon Aug 8 19:09:12 2005
--- imap-2004g/src/osdep/unix/tcp_unix.c Fri Dec 15 10:57:42 2006
***************
*** 220,226 ****
char *tmp,int *ctr,char *hst)
{
int i,ti,sock,flgs;
! size_t len;
time_t now;
struct protoent *pt = getprotobyname ("tcp");
fd_set fds,efds;
--- 220,227 ----
char *tmp,int *ctr,char *hst)
{
int i,ti,sock,flgs;
! /* size_t len; */
! socklen_t len;
time_t now;
struct protoent *pt = getprotobyname ("tcp");
fd_set fds,efds;
***************
*** 721,727 ****
char *tcp_remotehost (TCPSTREAM *stream)
{
if (!stream->remotehost) {
! size_t sadrlen;
struct sockaddr *sadr = ip_newsockaddr (&sadrlen);
stream->remotehost = /* get socket's peer name */
getpeername (stream->tcpsi,sadr,(void *) &sadrlen) ?
--- 722,729 ----
char *tcp_remotehost (TCPSTREAM *stream)
{
if (!stream->remotehost) {
! /* size_t sadrlen; */
! socklen_t sadrlen;
struct sockaddr *sadr = ip_newsockaddr (&sadrlen);
stream->remotehost = /* get socket's peer name */
getpeername (stream->tcpsi,sadr,(void *) &sadrlen) ?
***************
*** 751,757 ****
char *tcp_localhost (TCPSTREAM *stream)
{
if (!stream->localhost) {
! size_t sadrlen;
struct sockaddr *sadr = ip_newsockaddr (&sadrlen);
stream->localhost = /* get socket's name */
((stream->port & 0xffff000) ||
--- 753,760 ----
char *tcp_localhost (TCPSTREAM *stream)
{
if (!stream->localhost) {
! /* size_t sadrlen; */
! socklen_t sadrlen;
struct sockaddr *sadr = ip_newsockaddr (&sadrlen);
stream->localhost = /* get socket's name */
((stream->port & 0xffff000) ||
***************
*** 771,777 ****
char *tcp_clientaddr ()
{
if (!myClientAddr) {
! size_t sadrlen;
struct sockaddr *sadr = ip_newsockaddr (&sadrlen);
myClientAddr = /* get stdin's peer name */
cpystr (getpeername (0,sadr,(void *) &sadrlen) ?
--- 774,781 ----
char *tcp_clientaddr ()
{
if (!myClientAddr) {
! /* size_t sadrlen; */
! socklen_t sadrlen;
struct sockaddr *sadr = ip_newsockaddr (&sadrlen);
myClientAddr = /* get stdin's peer name */
cpystr (getpeername (0,sadr,(void *) &sadrlen) ?
***************
*** 791,797 ****
char *tcp_clienthost ()
{
if (!myClientHost) {
! size_t sadrlen;
struct sockaddr *sadr = ip_newsockaddr (&sadrlen);
myClientHost = /* get stdin's peer name */
getpeername (0,sadr,(void *) &sadrlen) ?
--- 795,802 ----
char *tcp_clienthost ()
{
if (!myClientHost) {
! /* size_t sadrlen; */
! socklen_t sadrlen;
struct sockaddr *sadr = ip_newsockaddr (&sadrlen);
myClientHost = /* get stdin's peer name */
getpeername (0,sadr,(void *) &sadrlen) ?
***************
*** 810,816 ****
char *tcp_serveraddr ()
{
if (!myServerAddr) {
! size_t sadrlen;
struct sockaddr *sadr = ip_newsockaddr (&sadrlen);
myServerAddr = /* get stdin's peer name */
cpystr (getsockname (0,sadr,(void *) &sadrlen) ?
--- 815,822 ----
char *tcp_serveraddr ()
{
if (!myServerAddr) {
! /* size_t sadrlen; */
! socklen_t sadrlen;
struct sockaddr *sadr = ip_newsockaddr (&sadrlen);
myServerAddr = /* get stdin's peer name */
cpystr (getsockname (0,sadr,(void *) &sadrlen) ?
***************
*** 831,837 ****
char *tcp_serverhost ()
{
if (!myServerHost) { /* once-only */
! size_t sadrlen;
struct sockaddr *sadr = ip_newsockaddr (&sadrlen);
/* get stdin's name */
myServerHost = (getsockname (0,sadr,(void *) &sadrlen) ||
--- 837,844 ----
char *tcp_serverhost ()
{
if (!myServerHost) { /* once-only */
! /* size_t sadrlen; */
! socklen_t sadrlen;
struct sockaddr *sadr = ip_newsockaddr (&sadrlen);
/* get stdin's name */
myServerHost = (getsockname (0,sadr,(void *) &sadrlen) ||
_______________________________________________
Imap-uw mailing list
Imap-uw@u.washington.edu
https://mailman1.u.washington.edu/mailman/listinfo/imap-uw