Attempt to port SSH v3.2.9.1 to QNX4. Problems. (+)

Stuck on two problems so far:
Here is a snip from SSH v3.2.9.1 code (sshunixeloop.c)

void ssh_io_unregister_fd(int fd, Boolean keep_nonblocking)
{
  IORec *iter;
 
  assert(ssh_eloop_initialized);
  iter = ssh_eloop_event_rec.io_records;
  while (iter != NULL)
    {
      if ((iter->fd == fd) && (iter->killed == FALSE))
        {
          if (!iter->was_nonblocking && !keep_nonblocking)
            {
#ifdef VXWORKS
              /* nothing, we cannot know of it was blocking */
#else /* VXWORKS */
#  if defined(O_NONBLOCK) && !defined(O_NONBLOCK_BROKEN)
              fcntl(iter->fd, F_SETFL,
                    fcntl(iter->fd, F_GETFL, 0) & 
~O_NONBLOCK);
#  else /* O_NONBLOCK && !O_NONBLOCK_BROKEN */
              fcntl(iter->fd, F_SETFL,
                    fcntl(iter->fd, F_GETFL, 0) & ~O_NDELAY);
#  endif /* O_NONBLOCK && !O_NONBLOCK_BROKEN */
#endif  /* VXWORKS */
            }
          iter->killed = TRUE;
          SSH_DEBUG(7, ("Killed the file descriptor %d, 
waiting for removal",
                        fd));
          return;
        }
      iter = iter->next;
    }
  /* File descriptor was not found. */
  ssh_warning("ssh_io_unregister_fd: file descriptor %d was 
not found.", fd);
}

I get an error on O_NDELAY not being defined. If I include
<unix.h>, the only header where it is defined - I get much
more errors that sound rather severe to me.
Is it possible to define O_NDELAY separately? To what value?

The second error comes from sshpk.h (SSH v3.2.9.1):

struct SshPkTypeRec
{
  /* Name for key. Keys are named/typed as follows:
 
       if-modn    for RSA etc.
       dl-modp    for DSA, ElGamal etc.
       ec-modp    for ECDSA, ECElGamal etc.
       ec-gf2n    for ECDSA, etc.
     */
  const char *name;
 
  /* Special actions, for key management. I.e. things like 
inserting
     parameters, fixing exponent etc. */
  const SshPkAction *action_list;
 
  /
********************************************************************
   * 1. Group actions
   
********************************************************************/
  void * (*pk_group_action_init)(void);
  void * (*pk_group_action_make)(void *context);
  void   (*pk_group_action_free)(void *context);
 
  Boolean (*pk_group_import)(const unsigned char *buf,
                             size_t length,
                             void **pk_group);
  Boolean (*pk_group_export)(const void *pk_group,
                             unsigned char **buf,
                             size_t *length_return);
  void   (*pk_group_free)(void *pk_group);
  void   (*pk_group_copy)(void *op_src, void **op_dest);
 
  char * (*pk_group_get_predefined_groups)(void);
  void   (*pk_group_precompute)(void *context);
 
  /* Randomizer handling. */
  unsigned int (*pk_group_count_randomizers)(void *pk_group);
  Boolean (*pk_group_generate_randomizer)(void *pk_group);
  Boolean (*pk_group_export_randomizer)(void *pk_group,
                                        unsigned char **buf,
                                        size_t 
*length_return);
  Boolean (*pk_group_import_randomizer)(void *pk_group,
                                        const unsigned char 
*buf,
                                        size_t length);
 
  /
********************************************************************
   * 2. Public key actions
   
********************************************************************/
  void *(*public_key_action_init)(void);
  void *(*public_key_action_make)(void *context);
  void (*public_key_action_free)(void *context);
 
  Boolean (*public_key_import)(const unsigned char *buf,
                               size_t len,
                               void **public_key);
  Boolean (*public_key_export)(const void *public_key,
                               unsigned char **buf,
                               size_t *length_return);
  void (*public_key_free)(void *public_key);
  void (*public_key_copy)(void *op_src, void **op_dest);
 
  void (*public_key_derive_pk_group)(void *public_key,
                                     void **pk_group);
  void (*public_key_precompute)(void *context);
 
  /
********************************************************************
   * 3. Private key actions
   
********************************************************************/
  void *(*private_key_action_init)(void);
  void *(*private_key_action_define)(void *context);
  void *(*private_key_action_generate)(void *context);
  void (*private_key_action_free)(void *context);
 
  Boolean (*private_key_import)(const unsigned char *buf,
                                size_t len,
                                void **private_key);
  Boolean (*private_key_export)(const void *private_key,
                                unsigned char **buf,
                                size_t *length_return);
  void (*private_key_free)(void *private_key);
  void (*private_key_derive_public_key)(const void 
*private_key,
                                        void **public_key);
 
  void (*private_key_copy)(void *op_src, void **op_dest);
 
  void (*private_key_derive_pk_group)(void *private_key,
                                      void **pk_group);
  void (*private_key_precompute)(void *context);
 
  /* More to come... */
};
 
/* Maximum of provider slots. It is assumed that SSH modules 
will not
   add very many providers. */
 
#define SSH_PK_TYPE_MAX_SLOTS 16
extern SshPkType const * 
ssh_pk_type_slots[SSH_PK_TYPE_MAX_SLOTS];

Here is a snip from sshcrypt.h:

[code]/************************* Public key cryptography
************************/

typedef struct SshPkTypeRec SshPkType;
SshCryptoStatus ssh_pk_provider_register(const SshPkType
*type);

#ifdef SSHDIST_CRYPT_RSA
extern const SshPkType ssh_pk_if_modn;
extern const SshPkType ssh_pk_if_modn_generator;
#endif /* SSHDIST_CRYPT_RSA */

#ifdef SSHDIST_CRYPT_DSA
extern const SshPkType ssh_pk_dl_modp;
extern const SshPkType ssh_pk_dl_modp_generator;
#endif /* SSHDIST_CRYPT_DSA */
[/code]
I get an error “Variable has incomplete type” regarding all
four:
ssh_pk_if_modn
ssh_pk_if_modn_generator
ssh_pk_if_modp
ssh_pk_if_modp_generator

How to solve the problem?

maybe you can add the following:
#define O_NDELAY O_NONBLOCK

Yes, I did.
I’ve defined O_NDELAY 0, O_NONBLOCK was resolved already.
I just wonder if I was right with the value “0”…

BTW.
Has something changed significantly in “make” since “make v3.79.1”? Seems part of my probs are “make”-related…