6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina/*
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina Authors:
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina Pavel Březina <pbrezina@redhat.com>
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina Copyright (C) 2011 Red Hat
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina This program is free software; you can redistribute it and/or modify
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina it under the terms of the GNU General Public License as published by
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina the Free Software Foundation; either version 3 of the License, or
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina (at your option) any later version.
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina This program is distributed in the hope that it will be useful,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina GNU General Public License for more details.
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina You should have received a copy of the GNU General Public License
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina*/
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
c9b2b7f3f02bf40b698c70640f151d0113736195Jakub Hrozek#include "config.h"
c9b2b7f3f02bf40b698c70640f151d0113736195Jakub Hrozek
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina#include <stdlib.h>
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina#include <errno.h>
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina#include <string.h>
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina#include <stdint.h>
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
60a729bfa2aee7529a0c9a276057a47a80381994Pavel Březina#include "sss_client/sss_cli.h"
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina#include "sss_client/sudo/sss_sudo.h"
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina#include "sss_client/sudo/sss_sudo_private.h"
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březinastatic int sss_sudo_parse_rule(const char *message,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t message_len,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t *_cursor,
968e2bc3bb28458b25c3b19868ea50f0325d8b0aPavel Březina struct sss_sudo_rule *_rule);
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březinastatic int sss_sudo_parse_attr(const char *message,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t message_len,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t *_cursor,
968e2bc3bb28458b25c3b19868ea50f0325d8b0aPavel Březina struct sss_sudo_attr *_attr);
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březinastatic int sss_sudo_parse_uint32(const char *message,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t message_len,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t *_cursor,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina uint32_t *_number);
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březinastatic int sss_sudo_parse_string(const char *message,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t message_len,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t *_cursor,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina char **_str);
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březinaint sss_sudo_parse_response(const char *message,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t message_len,
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina char **_domainname,
968e2bc3bb28458b25c3b19868ea50f0325d8b0aPavel Březina struct sss_sudo_result **_result,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina uint32_t *_error)
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina{
968e2bc3bb28458b25c3b19868ea50f0325d8b0aPavel Březina struct sss_sudo_result *result = NULL;
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina char *domainname = NULL;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t cursor = 0;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina int ret = EOK;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina int i = 0;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina /* error code */
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina ret = sss_sudo_parse_uint32(message, message_len, &cursor, _error);
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina if (ret != EOK || *_error != SSS_SUDO_ERROR_OK) {
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina return ret;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina }
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
7379170a0860790f2739e07fffe3d6ec85264566Pavel Březina /* domain name - deprecated
7379170a0860790f2739e07fffe3d6ec85264566Pavel Březina * it won't be used, but we will read it anyway to ease parsing
7379170a0860790f2739e07fffe3d6ec85264566Pavel Březina * TODO: when possible change the protocol */
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina ret = sss_sudo_parse_string(message, message_len, &cursor, &domainname);
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina if (ret != EOK) {
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina return ret;
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina }
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina
7379170a0860790f2739e07fffe3d6ec85264566Pavel Březina free(domainname);
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina if (_domainname != NULL) {
7379170a0860790f2739e07fffe3d6ec85264566Pavel Březina *_domainname = NULL;
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina }
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina /* result */
968e2bc3bb28458b25c3b19868ea50f0325d8b0aPavel Březina result = malloc(sizeof(struct sss_sudo_result));
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina if (result == NULL) {
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina return ENOMEM;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina }
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
a24f7f1275b3bd9cf4adbb0b4ed7ab86357e66faPavel Březina memset(result, 0, sizeof(struct sss_sudo_result));
a24f7f1275b3bd9cf4adbb0b4ed7ab86357e66faPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina /* rules_num */
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina ret = sss_sudo_parse_uint32(message, message_len,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina &cursor, &result->num_rules);
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina if (ret != EOK) {
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina goto fail;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina }
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina /* rules */
968e2bc3bb28458b25c3b19868ea50f0325d8b0aPavel Březina result->rules = calloc(result->num_rules, sizeof(struct sss_sudo_rule));
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina if (result->rules == NULL) {
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina ret = ENOMEM;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina goto fail;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina }
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina for (i = 0; i < result->num_rules; i++) {
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina ret = sss_sudo_parse_rule(message, message_len,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina &cursor, &result->rules[i]);
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina if (ret != EOK) {
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina goto fail;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina }
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina }
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina *_result = result;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina return EOK;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březinafail:
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina sss_sudo_free_result(result);
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina return ret;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina}
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březinaint sss_sudo_parse_rule(const char *message,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t message_len,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t *_cursor,
968e2bc3bb28458b25c3b19868ea50f0325d8b0aPavel Březina struct sss_sudo_rule *_rule)
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina{
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina int ret = EOK;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina int i = 0;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina /* attrs_num */
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina ret = sss_sudo_parse_uint32(message, message_len,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina _cursor, &_rule->num_attrs);
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina if (ret != EOK) {
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina return ret;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina }
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina /* attrs */
968e2bc3bb28458b25c3b19868ea50f0325d8b0aPavel Březina _rule->attrs = calloc(_rule->num_attrs, sizeof(struct sss_sudo_attr));
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina if (_rule->attrs == NULL) {
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina return ENOMEM;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina }
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina for (i = 0; i < _rule->num_attrs; i++) {
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina ret = sss_sudo_parse_attr(message, message_len,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina _cursor, &_rule->attrs[i]);
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina if (ret != EOK) {
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina return ret;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina }
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina }
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina return EOK;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina}
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březinaint sss_sudo_parse_attr(const char *message,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t message_len,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t *_cursor,
968e2bc3bb28458b25c3b19868ea50f0325d8b0aPavel Březina struct sss_sudo_attr *_attr)
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina{
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina char *str = NULL;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina int ret = EOK;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina int i = 0;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina /* name */
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina ret = sss_sudo_parse_string(message, message_len, _cursor, &str);
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina if (ret != EOK) {
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina return ret;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina }
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina _attr->name = str;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina /* values_num */
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina ret = sss_sudo_parse_uint32(message, message_len,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina _cursor, &_attr->num_values);
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina if (ret != EOK) {
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina return ret;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina }
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina /* values */
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina _attr->values = calloc(_attr->num_values, sizeof(const char*));
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina if (_attr->values == NULL) {
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina return ENOMEM;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina }
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina for (i = 0; i < _attr->num_values; i++) {
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina ret = sss_sudo_parse_string(message, message_len, _cursor, &str);
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina if (ret != EOK) {
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina return ret;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina }
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina _attr->values[i] = str;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina }
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina return EOK;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina}
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březinaint sss_sudo_parse_uint32(const char *message,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t message_len,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t *_cursor,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina uint32_t *_number)
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina{
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t start_pos = 0;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina if (_cursor == NULL) {
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina return EINVAL;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina }
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina start_pos = *_cursor;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina if (start_pos + sizeof(uint32_t) > message_len) {
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina return EINVAL;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina }
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
f643754db81eeade60485bbe3d80324d889cc4f3Pavel Březina /* expanded SAFEALIGN_COPY_UINT32 macro from util.h */
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina memcpy(_number, message + start_pos, sizeof(uint32_t));
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina *_cursor = start_pos + sizeof(uint32_t);
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina return EOK;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina}
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březinaint sss_sudo_parse_string(const char *message,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t message_len,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t *_cursor,
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina char **_str)
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina{
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina const char *current = NULL;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina char *str = NULL;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t start_pos = 0;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t len = 0;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina size_t maxlen = 0;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina if (_cursor == NULL) {
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina return EINVAL;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina }
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina start_pos = *_cursor;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina maxlen = message_len - start_pos;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina if (start_pos >= message_len ) {
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina return EINVAL;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina }
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina current = message + start_pos;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina len = strnlen(current, maxlen);
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina if (len == maxlen) {
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina /* the string exceeds message length */
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina return EINVAL;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina }
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina str = strndup(current, len);
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina if (str == NULL) {
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina return ENOMEM;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina }
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina /* go after \0 */
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina *_cursor = start_pos + len + 1;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina *_str = str;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina return EOK;
6f701a4dc295ddc997ba5190a3cd72d948d799dcPavel Březina}