mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-25 01:02:24 +00:00
Some miscellaneous marshalling helpers.
I'm about to use these in a new piece of code, but they may come in helpful elsewhere as well. match_ssh_id in particular wraps an idiom that's quite common in the rest of the codebase.
This commit is contained in:
parent
2968563180
commit
1e453d1f97
34
misc.c
34
misc.c
@ -9,6 +9,7 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include "putty.h"
|
#include "putty.h"
|
||||||
|
#include "misc.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Parse a string block size specification. This is approximately a
|
* Parse a string block size specification. This is approximately a
|
||||||
@ -1035,3 +1036,36 @@ int smemeq(const void *av, const void *bv, size_t len)
|
|||||||
* we want to return 1, so then we can just shift down. */
|
* we want to return 1, so then we can just shift down. */
|
||||||
return (0x100 - val) >> 8;
|
return (0x100 - val) >> 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int match_ssh_id(int stringlen, const void *string, const char *id)
|
||||||
|
{
|
||||||
|
int idlen = strlen(id);
|
||||||
|
return (idlen == stringlen && !memcmp(string, id, idlen));
|
||||||
|
}
|
||||||
|
|
||||||
|
void *get_ssh_string(int *datalen, const void **data, int *stringlen)
|
||||||
|
{
|
||||||
|
void *ret;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
if (*datalen < 4)
|
||||||
|
return NULL;
|
||||||
|
len = GET_32BIT_MSB_FIRST((const unsigned char *)*data);
|
||||||
|
if (*datalen < len+4)
|
||||||
|
return NULL;
|
||||||
|
ret = (void *)((const char *)*data + 4);
|
||||||
|
*datalen -= len + 4;
|
||||||
|
*data = (const char *)*data + len + 4;
|
||||||
|
*stringlen = len;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_ssh_uint32(int *datalen, const void **data, unsigned *ret)
|
||||||
|
{
|
||||||
|
if (*datalen < 4)
|
||||||
|
return FALSE;
|
||||||
|
*ret = GET_32BIT_MSB_FIRST((const unsigned char *)*data);
|
||||||
|
*datalen -= 4;
|
||||||
|
*data = (const char *)*data + 4;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
17
misc.h
17
misc.h
@ -78,6 +78,23 @@ void smemclr(void *b, size_t len);
|
|||||||
* by the 'eq' in the name. */
|
* by the 'eq' in the name. */
|
||||||
int smemeq(const void *av, const void *bv, size_t len);
|
int smemeq(const void *av, const void *bv, size_t len);
|
||||||
|
|
||||||
|
/* Extracts an SSH-marshalled string from the start of *data. If
|
||||||
|
* successful (*datalen is not too small), advances data/datalen past
|
||||||
|
* the string and returns a pointer to the string itself and its
|
||||||
|
* length in *stringlen. Otherwise does nothing and returns NULL.
|
||||||
|
*
|
||||||
|
* Like strchr, this function can discard const from its parameter.
|
||||||
|
* Treat it as if it was a family of two functions, one returning a
|
||||||
|
* non-const string given a non-const pointer, and one taking and
|
||||||
|
* returning const. */
|
||||||
|
void *get_ssh_string(int *datalen, const void **data, int *stringlen);
|
||||||
|
/* Extracts an SSH uint32, similarly. Returns TRUE on success, and
|
||||||
|
* leaves the extracted value in *ret. */
|
||||||
|
int get_ssh_uint32(int *datalen, const void **data, unsigned *ret);
|
||||||
|
/* Given a not-necessarily-zero-terminated string in (length,data)
|
||||||
|
* form, check if it equals an ordinary C zero-terminated string. */
|
||||||
|
int match_ssh_id(int stringlen, const void *string, const char *id);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Debugging functions.
|
* Debugging functions.
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user