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

Reply via email to