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?