From ffef68540b76a491ff0df0c01e60f0dd703a429a Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Sun, 4 Feb 2001 19:13:45 +0000 Subject: [PATCH] creates. --- lib/silccore/silcmode.c | 172 ++++++++++++++++++++++++++++++++++++++++ lib/silccore/silcmode.h | 63 +++++++++++++++ 2 files changed, 235 insertions(+) create mode 100644 lib/silccore/silcmode.c create mode 100644 lib/silccore/silcmode.h diff --git a/lib/silccore/silcmode.c b/lib/silccore/silcmode.c new file mode 100644 index 00000000..2f04492e --- /dev/null +++ b/lib/silccore/silcmode.c @@ -0,0 +1,172 @@ +/* + + silcmode.c + + Author: Pekka Riikonen + + Copyright (C) 2001 Pekka Riikonen + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +*/ +/* $Id$ */ + +#include "silcincludes.h" +#include "silcmode.h" + +/****************************************************************************** + + Set Mode Payload + +******************************************************************************/ + +struct SilcSetModePayloadStruct { + unsigned short mode_type; + unsigned int mode_mask; + unsigned char argc; + SilcArgumentPayload args; +}; + +/* Parse Set Mode payload buffer and return data into payload structure */ + +SilcSetModePayload silc_set_mode_payload_parse(SilcBuffer buffer) +{ + SilcSetModePayload new; + unsigned short len; + + SILC_LOG_DEBUG(("Parsing Set Mode payload")); + + new = silc_calloc(1, sizeof(*new)); + + silc_buffer_unformat(buffer, + SILC_STR_UI_SHORT(&new->mode_type), + SILC_STR_UI_SHORT(&len), + SILC_STR_UI_INT(&new->mode_mask), + SILC_STR_UI_CHAR(&new->argc), + SILC_STR_END); + + if (len > buffer->len) + goto err; + + if (new->argc) { + silc_buffer_pull(buffer, 5); + new->args = silc_argument_payload_parse(buffer, new->argc); + silc_buffer_push(buffer, 5); + } + + return new; + + err: + silc_free(new); + return NULL; +} + +/* Encode Set Mode payload with variable argument list. If `argc' is > 0 + argument payloads will be associated to the Set Mode payload. Variable + arguments must be {usigned char *, unsigned int (len)}. */ + +SilcBuffer silc_set_mode_payload_encode(unsigned short mode_type, + unsigned int mode_mask, + unsigned int argc, + va_list ap) +{ + SilcBuffer buffer; + SilcBuffer args = NULL; + unsigned char **argv; + unsigned int *argv_lens = NULL, *argv_types = NULL; + unsigned char *x; + unsigned int x_len; + int i, len = 0; + + if (argc) { + argv = silc_calloc(argc, sizeof(unsigned char *)); + argv_lens = silc_calloc(argc, sizeof(unsigned int)); + argv_types = silc_calloc(argc, sizeof(unsigned int)); + + for (i = 0; i < argc; i++) { + x = va_arg(ap, unsigned char *); + x_len = va_arg(ap, unsigned int); + + argv[i] = silc_calloc(x_len + 1, sizeof(unsigned char)); + memcpy(argv[i], x, x_len); + argv_lens[i] = x_len; + argv_types[i] = i + 1; + } + + args = silc_argument_payload_encode(argc, argv, argv_lens, argv_types); + len = args->len; + + for (i = 0; i < argc; i++) + silc_free(argv[i]); + silc_free(argv); + silc_free(argv_lens); + silc_free(argv_types); + } + + len += 5; + buffer = silc_buffer_alloc(len); + silc_buffer_pull_tail(buffer, SILC_BUFFER_END(buffer)); + silc_buffer_format(buffer, + SILC_STR_UI_SHORT(mode_type), + SILC_STR_UI_SHORT(len), + SILC_STR_UI_INT(mode_mask), + SILC_STR_UI_CHAR(argc), + SILC_STR_END); + + if (argc) { + silc_buffer_pull(buffer, 5); + silc_buffer_format(buffer, + SILC_STR_UI_XNSTRING(args->data, args->len), + SILC_STR_END); + silc_buffer_push(buffer, 5); + silc_buffer_free(args); + } + + return buffer; +} + +/* Free's Set Mode payload */ + +void silc_set_mode_payload_free(SilcSetModePayload payload) +{ + if (payload) { + silc_argument_payload_free(payload->args); + silc_free(payload); + } +} + +/* Return mode type */ + +unsigned short silc_set_mode_get_type(SilcSetModePayload payload) +{ + return payload->mode_type; +} + +/* Return mode mask */ + +unsigned int silc_set_mode_get_mode(SilcSetModePayload payload) +{ + return payload->mode_mask; +} + +/* Return argument nums */ + +unsigned int silc_set_mode_get_arg_num(SilcSetModePayload payload) +{ + return payload->argc; +} + +/* Return argument payload */ + +SilcArgumentPayload silc_set_mode_get_args(SilcSetModePayload payload) +{ + return payload->args; +} diff --git a/lib/silccore/silcmode.h b/lib/silccore/silcmode.h new file mode 100644 index 00000000..2659206a --- /dev/null +++ b/lib/silccore/silcmode.h @@ -0,0 +1,63 @@ +/* + + silcmode.h + + Author: Pekka Riikonen + + Copyright (C) 2001 Pekka Riikonen + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +*/ + +#ifndef SILCMODE_H +#define SILCMODE_H + +/* Forward declarations */ +typedef struct SilcSetModePayloadStruct *SilcSetModePayload; + +/* Mode types defined for Set Mode payload */ +#define SILC_MODE_TYPE_CHANNEL 0 +#define SILC_MODE_TYPE_UCHANNEL 1 +#define SILC_MODE_RESERVED 2 /* RESERVED */ +#define SILC_MODE_PRIVATE 32768 /* RESERVED */ + +/* Channel modes */ +#define SILC_CHANNEL_MODE_NONE 0x0000 +#define SILC_CHANNEL_MODE_PRIVATE 0x0001 /* private channel */ +#define SILC_CHANNEL_MODE_SECRET 0x0002 /* secret channel */ +#define SILC_CHANNEL_MODE_PRIVKEY 0x0004 /* channel has private key */ +#define SILC_CHANNEL_MODE_INVITE 0x0008 /* invite only channel */ +#define SILC_CHANNEL_MODE_TOPIC 0x0010 /* topic setting by operator */ +#define SILC_CHANNEL_MODE_ULIMIT 0x0020 /* user limit set */ +#define SILC_CHANNEL_MODE_PASSPHRASE 0x0040 /* passphrase set */ +#define SILC_CHANNEL_MODE_BAN 0x0080 /* ban list set */ +#define SILC_CHANNEL_MODE_INVITE_LIST 0x0100 /* invite list set */ +#define SILC_CHANNEL_MODE_CIPHER 0x0200 /* sets cipher of channel */ + +/* User modes on channel */ +#define SILC_CHANNEL_UMODE_NONE 0x0000 /* Normal user */ +#define SILC_CHANNEL_UMODE_CHANFO 0x0001 /* channel founder */ +#define SILC_CHANNEL_UMODE_CHANOP 0x0002 /* channel operator */ + +/* Prototypes */ +SilcSetModePayload silc_set_mode_payload_parse(SilcBuffer buffer); +SilcBuffer silc_set_mode_payload_encode(unsigned short mode_type, + unsigned int mode_mask, + unsigned int argc, + va_list ap); +void silc_set_mode_payload_free(SilcSetModePayload payload); +unsigned short silc_set_mode_get_type(SilcSetModePayload payload); +unsigned int silc_set_mode_get_mode(SilcSetModePayload payload); +unsigned int silc_set_mode_get_arg_num(SilcSetModePayload payload); +SilcArgumentPayload silc_set_mode_get_args(SilcSetModePayload payload); + +#endif -- 2.24.0