mirror of
https://github.com/0intro/wmii
synced 2024-11-22 13:52:17 +03:00
170 lines
3.6 KiB
C
170 lines
3.6 KiB
C
/*
|
|
* (C)opyright MMIV-MMV Anselm R. Garbe <garbeam at gmail dot com>
|
|
* See LICENSE file for license details.
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "ixp.h"
|
|
|
|
/* encode/decode stuff */
|
|
|
|
void *ixp_enc_u8(u8 * msg, u8 val)
|
|
{
|
|
msg[0] = val;
|
|
return &msg[1];
|
|
}
|
|
|
|
void *ixp_dec_u8(u8 * msg, u8 * val)
|
|
{
|
|
*val = msg[0];
|
|
return &msg[1];
|
|
}
|
|
|
|
void *ixp_enc_u16(u8 * msg, u16 val)
|
|
{
|
|
msg[0] = val;
|
|
msg[1] = val >> 8;
|
|
return &msg[2];
|
|
}
|
|
|
|
void *ixp_dec_u16(u8 * msg, u16 * val)
|
|
{
|
|
*val = msg[0] | (msg[1] << 8);
|
|
return &msg[2];
|
|
}
|
|
|
|
void *ixp_enc_u32(u8 * msg, u32 val)
|
|
{
|
|
msg[0] = val;
|
|
msg[1] = val >> 8;
|
|
msg[2] = val >> 16;
|
|
msg[3] = val >> 24;
|
|
return &msg[4];
|
|
}
|
|
|
|
void *ixp_dec_u32(u8 * msg, u32 * val)
|
|
{
|
|
*val = msg[0] | (msg[1] << 8) | (msg[2] << 16) | (msg[3] << 24);
|
|
return &msg[4];
|
|
}
|
|
|
|
void *ixp_enc_u64(u8 * msg, u64 val)
|
|
{
|
|
msg[0] = val;
|
|
msg[1] = val >> 8;
|
|
msg[2] = val >> 16;
|
|
msg[3] = val >> 24;
|
|
msg[4] = val >> 32;
|
|
msg[5] = val >> 40;
|
|
msg[6] = val >> 48;
|
|
msg[7] = val >> 56;
|
|
return &msg[8];
|
|
}
|
|
|
|
void *ixp_dec_u64(u8 * msg, u64 * val)
|
|
{
|
|
*val = (u64) msg[0] | ((u64) msg[1] << 8) |
|
|
((u64) msg[2] << 16) | ((u64) msg[3] << 24) |
|
|
((u64) msg[4] << 32) | ((u64) msg[5] << 40) |
|
|
((u64) msg[6] << 48) | ((u64) msg[7] << 56);
|
|
return &msg[8];
|
|
}
|
|
|
|
void *ixp_enc_string(u8 * msg, const char *s)
|
|
{
|
|
u16 len = s ? strlen(s) : 0;
|
|
msg = ixp_enc_u16(msg, len);
|
|
if (s)
|
|
memcpy(msg, s, len);
|
|
return &msg[len];
|
|
}
|
|
|
|
void *ixp_dec_string(u8 * msg, char *string, u16 stringlen, u16 * len)
|
|
{
|
|
msg = ixp_dec_u16(msg, len);
|
|
if (!(*len))
|
|
return msg;
|
|
if (*len > stringlen - 1)
|
|
/* might never happen if stringlen == IXP_MAX_MSG */
|
|
string[0] = '\0';
|
|
else {
|
|
memcpy(string, msg, *len);
|
|
string[*len] = 0;
|
|
}
|
|
return &msg[*len];
|
|
}
|
|
|
|
void *ixp_enc_data(u8 * msg, u8 * data, u32 datalen)
|
|
{
|
|
memcpy(msg, data, datalen);
|
|
return &msg[datalen];
|
|
}
|
|
|
|
void *ixp_dec_data(u8 * msg, u8 * data, u32 datalen)
|
|
{
|
|
memcpy(data, msg, datalen);
|
|
return &msg[datalen];
|
|
}
|
|
|
|
void *ixp_enc_prefix(u8 * msg, u32 size, u8 id, u16 tag)
|
|
{
|
|
msg = ixp_enc_u32(msg, size);
|
|
msg = ixp_enc_u8(msg, id);
|
|
return ixp_enc_u16(msg, tag);
|
|
}
|
|
|
|
void *ixp_dec_prefix(u8 * msg, u32 * size, u8 * id, u16 * tag)
|
|
{
|
|
msg = ixp_dec_u32(msg, size);
|
|
msg = ixp_dec_u8(msg, id);
|
|
return ixp_dec_u16(msg, tag);
|
|
}
|
|
|
|
void *ixp_enc_qid(u8 * msg, Qid * qid)
|
|
{
|
|
msg = ixp_enc_u8(msg, qid->type);
|
|
msg = ixp_enc_u32(msg, qid->version);
|
|
return ixp_enc_u64(msg, qid->path);
|
|
}
|
|
|
|
void *ixp_dec_qid(u8 * msg, Qid * qid)
|
|
{
|
|
msg = ixp_dec_u8(msg, &qid->type);
|
|
msg = ixp_dec_u32(msg, &qid->version);
|
|
return ixp_dec_u64(msg, &qid->path);
|
|
}
|
|
|
|
void *ixp_enc_stat(u8 * msg, Stat * stat)
|
|
{
|
|
msg = ixp_enc_u16(msg, stat->size);
|
|
msg = ixp_enc_u16(msg, stat->type);
|
|
msg = ixp_enc_u32(msg, stat->dev);
|
|
msg = ixp_enc_qid(msg, &stat->qid);
|
|
msg = ixp_enc_u32(msg, stat->mode);
|
|
msg = ixp_enc_u32(msg, stat->atime);
|
|
msg = ixp_enc_u32(msg, stat->mtime);
|
|
msg = ixp_enc_u64(msg, stat->length);
|
|
msg = ixp_enc_string(msg, stat->name);
|
|
msg = ixp_enc_string(msg, stat->uid);
|
|
msg = ixp_enc_string(msg, stat->gid);
|
|
return ixp_enc_string(msg, stat->muid);
|
|
}
|
|
|
|
void *ixp_dec_stat(u8 * msg, Stat * stat)
|
|
{
|
|
u16 len;
|
|
msg = ixp_dec_u16(msg, &stat->size);
|
|
msg = ixp_dec_u16(msg, &stat->type);
|
|
msg = ixp_dec_u32(msg, &stat->dev);
|
|
msg = ixp_dec_qid(msg, &stat->qid);
|
|
msg = ixp_dec_u32(msg, &stat->mode);
|
|
msg = ixp_dec_u32(msg, &stat->atime);
|
|
msg = ixp_dec_u32(msg, &stat->mtime);
|
|
msg = ixp_dec_u64(msg, &stat->length);
|
|
msg = ixp_dec_string(msg, stat->name, sizeof(stat->name), &len);
|
|
msg = ixp_dec_string(msg, stat->uid, sizeof(stat->uid), &len);
|
|
msg = ixp_dec_string(msg, stat->gid, sizeof(stat->gid), &len);
|
|
return ixp_dec_string(msg, stat->muid, sizeof(stat->muid), &len);
|
|
}
|