コード例 #1
0
ファイル: vfs.c プロジェクト: bysin/cloudfs
int vfs_dir_read_pass(struct vfs_inode_ptr *ptr,
                      struct vfs_inode_ptr *save_ptr,
                      void *data, uint32_t len,
                      bool *eof) {
  uint32_t rlen;
  int ret;

  if (ptr->offt + len > OBJECT_MAX_SIZE) {
    ptr->object.chunk++;
    ptr->offt = 0;
  }
  memcpy(save_ptr, ptr, sizeof(*ptr));

  if (!data)
    return 0;

  if ((ret = object_read(ptr->object, ptr->offt, data,
                         len, &rlen)) != SUCCESS) {
    if (ret != NOT_FOUND)
      warning("Read error on inode %016" PRIx64, ptr->object.index);
    return -EFAULT;
  }
  if (rlen < len) {
    *eof = true;
    return 0;
  }

  ptr->offt += rlen;
  return 0;
}
コード例 #2
0
void object_reset(OBJECT*target)
{
    OBJECT obj;
    char *line;
    OBJECTFILE file;
    int rc, l, k;
    if (target->name == NULL || target->_class == NULL) return;
    *(target->value) = '\0';
    for (k = 0; k < nfiles; k++)
    {
        file = object_fopen(filenames[k], "r");
        if (file.file != NULL)
        {
            while ((line = object_read(file)) != NULL)
            {
                rc = object_lineparse(line, &obj);
                if (rc < 2)
                {
                    if (!strcmp(target->_class, obj._class) && !strcmp(target->name, obj.name))
                    {
                        l = strlen(target->value) + strlen(obj.value) + 1;
                        target->value = (char*) realloc(target->value, l);
                        strcat(target->value, obj.value);
                    }
                }
                free(obj.name);
                free(obj._class);
                free(obj.value);
            }
            object_fclose(file);
        }
    }
}
コード例 #3
0
ファイル: management.c プロジェクト: 1248/liblwm2m
coap_status_t handle_dm_request(lwm2m_context_t * contextP,
                                lwm2m_uri_t * uriP,
                                uint8_t * fromAddr,
                                size_t fromAddrLen,
                                coap_packet_t * message,
                                coap_packet_t * response)
{
    coap_status_t result;

    switch (message->code)
    {
    case COAP_GET:
        {
            char * buffer = NULL;
            int length = 0;

            result = object_read(contextP, uriP, &buffer, &length);
            if (result == COAP_205_CONTENT)
            {
                if (IS_OPTION(message, COAP_OPTION_OBSERVE))
                {
                    result = handle_observe_request(contextP, uriP, fromAddr, fromAddrLen, message, response);
                }
                if (result == COAP_205_CONTENT)
                {
                    coap_set_payload(response, buffer, length);
                    // lwm2m_handle_packet will free buffer
                }
            }
        }
        break;
    case COAP_POST:
        {
            result = object_create_execute(contextP, uriP, (char *)message->payload, message->payload_len);
        }
        break;
    case COAP_PUT:
        {
            result = object_write(contextP, uriP, (char *)message->payload, message->payload_len);
        }
        break;
    case COAP_DELETE:
        {
            result = object_delete(contextP, uriP);
        }
        break;
    default:
        result = BAD_REQUEST_4_00;
        break;
    }

    return result;
}
コード例 #4
0
void object_compilefilesubset(const char *filename, int first, int last)
{
    OBJECT obj;
    char *line;
    OBJECTFILE file;
    int rc, i, l, n;
    file = object_fopen(filename, "r");
    n=0; 
    if (file.file != NULL)
    {
        while ((line = object_read(file)) != NULL )
        {
            rc = object_lineparse(line, &obj);
            if (rc < 2 && n>=first)
            {
                for (i = 0; i < nobject; i++)
                {
                    if (!strcmp(object[i]._class, obj._class) && !strcmp(object[i].name, obj.name)) break;
                }
                if (i == nobject)
                {
                    nobject++;
                    if (mobject < nobject) mobject += 100;
                    object = (OBJECT*) realloc(object, mobject*sizeof(OBJECT));
                    object[i].name = strdup(obj.name);
                    object[i]._class = strdup(obj._class);
                    object[i].value = strdup(obj.value);
                    object[i].valueptr = NULL;;
                }
                else
                {
                    l = strlen(object[i].value) + strlen(obj.value) + 1;
                    object[i].value = (char*) realloc(object[i].value, l);
                    strcat(object[i].value, obj.value);
                }
            }
            free(obj.name);
            free(obj._class);
            free(obj.value);
            if ( ++n > last ) break; 
        }
        object_fclose(file);
    }
    for (i = 0; i < nobject; i++) object_compilevalue(object + i);
}
コード例 #5
0
OBJECT *object_find1(char *name, char *type)
{
    OBJECTFILE file;
    int rc, nfound, l, k;
    OBJECT *object = NULL;
    char *line, *value;
    if (object == NULL) object = (OBJECT*) malloc(sizeof(OBJECT));
    value = (char*) malloc(1);
    *value = 0x0;
    nfound = 0;
    for (k = 0; k < nfiles; k++)
    {
        file = object_fopen(filenames[k], "r");
        while ((line = object_read(file)) != NULL)
        {
            rc = object_lineparse(line, object);
            if (rc < 2 && (strcmp(object->_class, type) == 0) && (strcmp(object->name, name) == 0))
            {
                nfound++;
                l = strlen(value) + 1;
                if (object->value != NULL)
                {
                    l += strlen(object->value);
                    value = (char*) realloc(value, l);
                    strcat(value, object->value);
                }
            }
            free(object->name);
            free(object->_class);
            free(object->value);
        }
        object_fclose(file);
    }
    if (nfound > 0)
    {
        object->name = strdup(name);
        object->_class = strdup(type);
        object->value = strdup(value);
        return object;
    }
    error_action("Unable to locate object ", name, "in data files", ERROR_IN("object_find1", ABORT));
    if(object) free(object);
    return NULL;
}
コード例 #6
0
ファイル: observe.c プロジェクト: jollen/node-wot
void ICACHE_FLASH_ATTR
lwm2m_resource_value_changed(lwm2m_context_t * contextP,
                                  lwm2m_uri_t * uriP)
{
    int result;
    obs_list_t * listP;
    lwm2m_watcher_t * watcherP;

    listP = prv_getObservedList(contextP, uriP);
    while (listP != NULL)
    {
        obs_list_t * targetP;
        uint8_t * buffer = NULL;
        size_t length = 0;
        lwm2m_media_type_t format;

        format = LWM2M_CONTENT_TEXT;
        result = object_read(contextP, &listP->item->uri, &format, &buffer, &length);
        if (result == COAP_205_CONTENT)
        {
            coap_packet_t message[1];

            coap_init_message(message, COAP_TYPE_NON, COAP_205_CONTENT, 0);
            coap_set_header_content_type(message, format);
            coap_set_payload(message, buffer, length);

            for (watcherP = listP->item->watcherList ; watcherP != NULL ; watcherP = watcherP->next)
            {
                watcherP->lastMid = contextP->nextMID++;
                message->mid = watcherP->lastMid;
                coap_set_header_token(message, watcherP->token, watcherP->tokenLen);
                coap_set_header_observe(message, watcherP->counter++);
                (void)message_send(contextP, message, watcherP->server->sessionH);
            }
        }

        targetP = listP;
        listP = listP->next;
        lwm2m_free(targetP);
    }

}
コード例 #7
0
ファイル: vfs.c プロジェクト: bysin/cloudfs
int vfs_io_perform(struct vfs_inode *node, enum vfs_io_type type, char *buf,
                   uint64_t size, off_t offset) {
  struct volume_object object;
  uint64_t chunk;
  uint32_t nlen, offt;
  int ret;

  object.index = node->data.ino;
  while (size) {
    chunk = offset >> OBJECT_MAX_SIZE_LOG2;
    offt  = offset & ((1 << OBJECT_MAX_SIZE_LOG2) - 1);
    nlen  = min(OBJECT_MAX_SIZE - offt, size);

    object.chunk = chunk;
    switch (type) {
      case VFS_IO_READ:
        if ((ret = object_read(object, offt, buf, nlen, NULL)) != SUCCESS) {
          if (ret == NOT_FOUND) {
            memset(buf, 0, nlen);
          } else {
            warning("Object read error on %016" PRIx64 ":%u: %d",
                    node->data.ino, offt, ret);
            return -EFAULT;
          }
        }
        break;

      case VFS_IO_WRITE:
        if ((ret = object_write(object, offt, buf, nlen)) != SUCCESS) {
          warning("Object write error on %016" PRIx64 ":%u: %d",
                  node->data.ino, offt, ret);
          return -EFAULT;
        }
        break;
    }

    size   -= nlen;
    offset += nlen;
    buf    += nlen;
  }
  return 0;
}
コード例 #8
0
ファイル: observe.c プロジェクト: 1248/liblwm2m
void lwm2m_resource_value_changed(lwm2m_context_t * contextP,
                                  lwm2m_uri_t * uriP)
{
    int result;
    obs_list_t * listP;
    lwm2m_watcher_t * watcherP;

    listP = prv_getObservedList(contextP, uriP);
    while (listP != NULL)
    {
        obs_list_t * targetP;
        char * buffer = NULL;
        int length = 0;

        result = object_read(contextP, &listP->item->uri, &buffer, &length);
        if (result == COAP_205_CONTENT)
        {
            coap_packet_t message[1];

            coap_init_message(message, COAP_TYPE_ACK, COAP_204_CHANGED, 0);
            coap_set_payload(message, buffer, length);

            for (watcherP = listP->item->watcherList ; watcherP != NULL ; watcherP = watcherP->next)
            {
                watcherP->lastMid = contextP->nextMID++;
                message->mid = watcherP->lastMid;
                coap_set_header_token(message, watcherP->token, watcherP->tokenLen);
                coap_set_header_observe(message, watcherP->counter++);
                (void)message_send(contextP, message, watcherP->server->addr, watcherP->server->addrLen);
            }
        }

        targetP = listP;
        listP = listP->next;
        lwm2m_free(targetP);
    }

}
コード例 #9
0
ファイル: observe.c プロジェクト: JayanthSreenivasa/wakaama
void observe_step(lwm2m_context_t * contextP,
                  time_t currentTime,
                  time_t * timeoutP)
{
    lwm2m_observed_t * targetP;

    for (targetP = contextP->observedList ; targetP != NULL ; targetP = targetP->next)
    {
        lwm2m_watcher_t * watcherP;
        uint8_t * buffer = NULL;
        size_t length = 0;
        lwm2m_data_t * dataP = NULL;
        int size = 0;
        double floatValue = 0;
        int64_t integerValue = 0;
        bool storeValue = false;
        lwm2m_media_type_t format = LWM2M_CONTENT_TEXT;
        coap_packet_t message[1];
        time_t interval;

        if (LWM2M_URI_IS_SET_RESOURCE(&targetP->uri))
        {
            if (COAP_205_CONTENT != object_readData(contextP, &targetP->uri, &size, &dataP)) continue;
            switch (dataP->type)
            {
            case LWM2M_TYPE_INTEGER:
                if (1 != lwm2m_data_decode_int(dataP, &integerValue)) continue;
                storeValue = true;
                break;
            case LWM2M_TYPE_FLOAT:
                if (1 != lwm2m_data_decode_float(dataP, &floatValue)) continue;
                storeValue = true;
                break;
            default:
                break;
            }
        }
        for (watcherP = targetP->watcherList ; watcherP != NULL ; watcherP = watcherP->next)
        {
            if (watcherP->active == true)
            {
                bool notify = false;

                if (watcherP->update == true)
                {
                    // value changed, should we notify the server ?

                    if (watcherP->parameters == NULL || watcherP->parameters->toSet == 0)
                    {
                        // no conditions
                        notify = true;
                        LOG("observation_step(/%d/%d/%d) notify[1] = TRUE\n", targetP->uri.objectId, targetP->uri.instanceId, targetP->uri.resourceId);
                    }

                    if (notify == false
                     && watcherP->parameters != NULL
                     && (watcherP->parameters->toSet & ATTR_FLAG_NUMERIC) != 0)
                    {
                        if ((watcherP->parameters->toSet & LWM2M_ATTR_FLAG_LESS_THAN) != 0)
                        {
                            // Did we cross the lower treshold ?
                            switch (dataP->type)
                            {
                            case LWM2M_TYPE_INTEGER:
                                if ((integerValue <= watcherP->parameters->lessThan
                                  && watcherP->lastValue.asInteger > watcherP->parameters->lessThan)
                                 || (integerValue >= watcherP->parameters->lessThan
                                  && watcherP->lastValue.asInteger < watcherP->parameters->lessThan))
                                {
                                    notify = true;
                                }
                                break;
                            case LWM2M_TYPE_FLOAT:
                                if ((floatValue <= watcherP->parameters->lessThan
                                  && watcherP->lastValue.asFloat > watcherP->parameters->lessThan)
                                 || (floatValue >= watcherP->parameters->lessThan
                                  && watcherP->lastValue.asFloat < watcherP->parameters->lessThan))
                                {
                                    notify = true;
                                }
                                break;
                            default:
                                break;
                            }
                            LOG("observation_step(/%d/%d/%d) notify[2] = %s\n", targetP->uri.objectId, targetP->uri.instanceId, targetP->uri.resourceId, notify ? "TRUE" : "FALSE");
                        }
                        if ((watcherP->parameters->toSet & LWM2M_ATTR_FLAG_GREATER_THAN) != 0)
                        {
                            // Did we cross the upper treshold ?
                            switch (dataP->type)
                            {
                            case LWM2M_TYPE_INTEGER:
                                if ((integerValue <= watcherP->parameters->greaterThan
                                  && watcherP->lastValue.asInteger > watcherP->parameters->greaterThan)
                                 || (integerValue >= watcherP->parameters->greaterThan
                                  && watcherP->lastValue.asInteger < watcherP->parameters->greaterThan))
                                {
                                    notify = true;
                                }
                                break;
                            case LWM2M_TYPE_FLOAT:
                                if ((floatValue <= watcherP->parameters->greaterThan
                                  && watcherP->lastValue.asFloat > watcherP->parameters->greaterThan)
                                 || (floatValue >= watcherP->parameters->greaterThan
                                  && watcherP->lastValue.asFloat < watcherP->parameters->greaterThan))
                                {
                                    notify = true;
                                }
                                break;
                            default:
                                break;
                            }
                            LOG("observation_step(/%d/%d/%d) notify[3] = %s\n", targetP->uri.objectId, targetP->uri.instanceId, targetP->uri.resourceId, notify ? "TRUE" : "FALSE");
                        }
                        if ((watcherP->parameters->toSet & LWM2M_ATTR_FLAG_STEP) != 0)
                        {
                            switch (dataP->type)
                            {
                            case LWM2M_TYPE_INTEGER:
                            {
                                int64_t diff;

                                diff = integerValue - watcherP->lastValue.asInteger;
                                if ((diff < 0 && (0 - diff) >= watcherP->parameters->step)
                                 || (diff >= 0 && diff >= watcherP->parameters->step))
                                {
                                    notify = true;
                                }
                            }
                                break;
                            case LWM2M_TYPE_FLOAT:
                            {
                                double diff;

                                diff = floatValue - watcherP->lastValue.asFloat;
                                if ((diff < 0 && (0 - diff) >= watcherP->parameters->step)
                                 || (diff >= 0 && diff >= watcherP->parameters->step))
                                {
                                    notify = true;
                                }
                            }
                                break;
                            default:
                                break;
                            }
                            LOG("observation_step(/%d/%d/%d) notify[4] = %s\n", targetP->uri.objectId, targetP->uri.instanceId, targetP->uri.resourceId, notify? "TRUE" : "FALSE");
                        }
                    }

                    if (watcherP->parameters != NULL
                     && (watcherP->parameters->toSet & LWM2M_ATTR_FLAG_MIN_PERIOD) != 0)
                    {
                        if (watcherP->lastTime + watcherP->parameters->minPeriod > currentTime)
                        {
                            // Minimum Period did not elapse yet
                            interval = watcherP->lastTime + watcherP->parameters->minPeriod - currentTime;
                            if (*timeoutP > interval) *timeoutP = interval;
                            notify = false;
                        }
                        else
                        {
                            notify = true;
                        }
                        LOG("observation_step(/%d/%d/%d) notify[5] = %s\n", targetP->uri.objectId, targetP->uri.instanceId, targetP->uri.resourceId, notify ? "TRUE" : "FALSE");
                    }
                }

                // Is the Maximum Period reached ?
                if (notify == false
                 && watcherP->parameters != NULL
                 && (watcherP->parameters->toSet & LWM2M_ATTR_FLAG_MAX_PERIOD) != 0)
                {
                    if (watcherP->lastTime + watcherP->parameters->maxPeriod <= currentTime)
                    {
                        notify = true;
                    }
                    LOG("observation_step(/%d/%d/%d) notify[6] = %s\n", targetP->uri.objectId, targetP->uri.instanceId, targetP->uri.resourceId, notify ? "TRUE" : "FALSE");
                }

                if (notify == true)
                {
                    if (buffer == NULL)
                    {
                        if (dataP != NULL)
                        {
                            length = lwm2m_data_serialize(&targetP->uri, size, dataP, &format, &buffer);
                            if (length == 0) break;
                        }
                        else
                        {
                            if (COAP_205_CONTENT != object_read(contextP, &targetP->uri, &format, &buffer, &length))
                            {
                                buffer = NULL;
                                break;
                            }
                        }
                        coap_init_message(message, COAP_TYPE_NON, COAP_205_CONTENT, 0);
                        coap_set_header_content_type(message, format);
                        coap_set_payload(message, buffer, length);
                        LOG("Observe Update[/%d/%d/%d]: %.*s\n", targetP->uri.objectId, targetP->uri.instanceId, targetP->uri.resourceId, length, buffer);
                    }
                    watcherP->lastTime = currentTime;
                    watcherP->lastMid = contextP->nextMID++;
                    message->mid = watcherP->lastMid;
                    coap_set_header_token(message, watcherP->token, watcherP->tokenLen);
                    coap_set_header_observe(message, watcherP->counter++);
                    (void)message_send(contextP, message, watcherP->server->sessionH);
                    watcherP->update = false;
                }

                // Store this value
                if (notify == true && storeValue == true)
                {
                    switch (dataP->type)
                    {
                    case LWM2M_TYPE_INTEGER:
                        watcherP->lastValue.asInteger = integerValue;
                        break;
                    case LWM2M_TYPE_FLOAT:
                        watcherP->lastValue.asFloat = floatValue;
                        break;
                    default:
                        break;
                    }
                }

                if (watcherP->parameters != NULL && (watcherP->parameters->toSet & LWM2M_ATTR_FLAG_MAX_PERIOD) != 0)
                {
                    // update timers
                    interval = watcherP->lastTime + watcherP->parameters->maxPeriod - currentTime;
                    if (*timeoutP > interval) *timeoutP = interval;
                }
            }
        }
        if (dataP != NULL) lwm2m_data_free(size, dataP);
        if (buffer != NULL) lwm2m_free(buffer);
    }
}
コード例 #10
0
ファイル: management.c プロジェクト: bsinno/wakaama
uint8_t dm_handleRequest(lwm2m_context_t * contextP,
                         lwm2m_uri_t * uriP,
                         lwm2m_server_t * serverP,
                         coap_packet_t * message,
                         coap_packet_t * response)
{
    uint8_t result;
    lwm2m_media_type_t format;

    LOG_ARG("Code: %02X, server status: %s", message->code, STR_STATUS(serverP->status));
    LOG_URI(uriP);

    if (IS_OPTION(message, COAP_OPTION_CONTENT_TYPE))
    {
        format = utils_convertMediaType(message->content_type);
    }
    else
    {
        format = LWM2M_CONTENT_TLV;
    }

    if (uriP->objectId == LWM2M_SECURITY_OBJECT_ID)
    {
        return COAP_404_NOT_FOUND;
    }

    if (serverP->status != STATE_REGISTERED
        && serverP->status != STATE_REG_UPDATE_NEEDED
        && serverP->status != STATE_REG_FULL_UPDATE_NEEDED
        && serverP->status != STATE_REG_UPDATE_PENDING)
    {
        return COAP_IGNORE;
    }

    // TODO: check ACL

    switch (message->code)
    {
    case COAP_GET:
        {
            uint8_t * buffer = NULL;
            size_t length = 0;
            int res;

            if (IS_OPTION(message, COAP_OPTION_OBSERVE))
            {
                lwm2m_data_t * dataP = NULL;
                int size = 0;

                result = object_readData(contextP, uriP, &size, &dataP);
                if (COAP_205_CONTENT == result)
                {
                    result = observe_handleRequest(contextP, uriP, serverP, size, dataP, message, response);
                    if (COAP_205_CONTENT == result)
                    {
                        if (IS_OPTION(message, COAP_OPTION_ACCEPT))
                        {
                            format = utils_convertMediaType(message->accept[0]);
                        }
                        else
                        {
                            format = LWM2M_CONTENT_TLV;
                        }

                        res = lwm2m_data_serialize(uriP, size, dataP, &format, &buffer);
                        if (res < 0)
                        {
                            result = COAP_500_INTERNAL_SERVER_ERROR;
                        }
                        else
                        {
                            length = (size_t)res;
                            LOG_ARG("Observe Request[/%d/%d/%d]: %.*s\n", uriP->objectId, uriP->instanceId, uriP->resourceId, length, buffer);
                        }
                    }
                    lwm2m_data_free(size, dataP);
                }
            }
            else if (IS_OPTION(message, COAP_OPTION_ACCEPT)
                  && message->accept_num == 1
                  && message->accept[0] == APPLICATION_LINK_FORMAT)
            {
                format = LWM2M_CONTENT_LINK;
                result = object_discover(contextP, uriP, serverP, &buffer, &length);
            }
            else
            {
                if (IS_OPTION(message, COAP_OPTION_ACCEPT))
                {
                    format = utils_convertMediaType(message->accept[0]);
                }

                result = object_read(contextP, uriP, &format, &buffer, &length);
            }
            if (COAP_205_CONTENT == result)
            {
                coap_set_header_content_type(response, format);
                coap_set_payload(response, buffer, length);
                // lwm2m_handle_packet will free buffer
            }
            else
            {
                lwm2m_free(buffer);
            }
        }
        break;

    case COAP_POST:
        {
            if (!LWM2M_URI_IS_SET_INSTANCE(uriP))
            {
                result = object_create(contextP, uriP, format, message->payload, message->payload_len);
                if (result == COAP_201_CREATED)
                {
                    //longest uri is /65535/65535 = 12 + 1 (null) chars
                    char location_path[13] = "";
                    //instanceId expected
                    if ((uriP->flag & LWM2M_URI_FLAG_INSTANCE_ID) == 0)
                    {
                        result = COAP_500_INTERNAL_SERVER_ERROR;
                        break;
                    }

                    if (sprintf(location_path, "/%d/%d", uriP->objectId, uriP->instanceId) < 0)
                    {
                        result = COAP_500_INTERNAL_SERVER_ERROR;
                        break;
                    }
                    coap_set_header_location_path(response, location_path);

                    lwm2m_update_registration(contextP, 0, true);
                }
            }
            else if (!LWM2M_URI_IS_SET_RESOURCE(uriP))
            {
                result = object_write(contextP, uriP, format, message->payload, message->payload_len);
            }
            else
            {
                result = object_execute(contextP, uriP, message->payload, message->payload_len);
            }
        }
        break;

    case COAP_PUT:
        {
            if (IS_OPTION(message, COAP_OPTION_URI_QUERY))
            {
                lwm2m_attributes_t attr;

                if (0 != prv_readAttributes(message->uri_query, &attr))
                {
                    result = COAP_400_BAD_REQUEST;
                }
                else
                {
                    result = observe_setParameters(contextP, uriP, serverP, &attr);
                }
            }
            else if (LWM2M_URI_IS_SET_INSTANCE(uriP))
            {
                result = object_write(contextP, uriP, format, message->payload, message->payload_len);
            }
            else
            {
                result = COAP_400_BAD_REQUEST;
            }
        }
        break;

    case COAP_DELETE:
        {
            if (!LWM2M_URI_IS_SET_INSTANCE(uriP) || LWM2M_URI_IS_SET_RESOURCE(uriP))
            {
                result = COAP_400_BAD_REQUEST;
            }
            else
            {
                result = object_delete(contextP, uriP);
                if (result == COAP_202_DELETED)
                {
                    lwm2m_update_registration(contextP, 0, true);
                }
            }
        }
        break;

    default:
        result = COAP_400_BAD_REQUEST;
        break;
    }

    return result;
}
コード例 #11
0
void object_compileSectionedFile(char *filename, int section)
{
    OBJECT obj, obj_delim;
    char *line;
    OBJECTFILE file;
    int rc, i, l, sec;
    obj.name = obj_delim.name = NULL;
    file = object_fopen(filename, "r");
    sec = -1;
    if (file.file != NULL)
    {
        while ((line = object_read(file)) != NULL)
        {
            rc = object_lineparse(line, &obj);
            if (rc < 2)
            {
                if (sec == -1)
                {
                    obj_delim.name = strdup(obj.name);
                    obj_delim._class = strdup(obj._class);
                }
                if (!strcmp(obj_delim._class, obj._class) && !strcmp(obj_delim.name, obj.name)) sec++;
                if (sec > section) break;
                if (sec == section)
                {
                    for (i = 0; i < nobject; i++)
                    {
                        if (!strcmp(object[i]._class, obj._class) && !strcmp(object[i].name, obj.name)) break;
                    }
                    if (i == nobject)
                    {
                        nobject++;
                        if (mobject < nobject) mobject += 100;
                        object = (OBJECT*) realloc(object, mobject*sizeof(OBJECT));
                        object[i].name = strdup(obj.name);
                        object[i]._class = strdup(obj._class);
                        object[i].value = strdup(obj.value);
                        object[i].valueptr = NULL;;
                    }
                    else
                    {
                        l = strlen(object[i].value) + strlen(obj.value) + 1;
                        object[i].value = (char*)realloc(object[i].value, l);
                        strcat(object[i].value, obj.value);
                    }
                }
            }
            if (obj.name != NULL)
            {
                free(obj.name);
                free(obj._class);
                free(obj.value);
            }
        }
        if (obj_delim.name != NULL)
        {
            free(obj_delim.name);
            free(obj_delim._class);
        }
        object_fclose(file);
    }
    for (i = 0; i < nobject; i++) object_compilevalue(object + i);
}
コード例 #12
0
ファイル: management.c プロジェクト: Jason-Gew/wakaama
coap_status_t handle_dm_request(lwm2m_context_t * contextP,
                                lwm2m_uri_t * uriP,
                                void * fromSessionH,
                                coap_packet_t * message,
                                coap_packet_t * response)
{
    coap_status_t result;
    lwm2m_server_t * serverP = NULL;
    lwm2m_media_type_t format;

#ifdef LWM2M_BOOTSTRAP
    lwm2m_server_t * bsServerP = NULL;
#endif

    format = prv_convertMediaType(message->content_type);

    serverP = prv_findServer(contextP, fromSessionH);
    if (NULL == serverP)
    {
#ifdef LWM2M_BOOTSTRAP
        bsServerP = utils_findBootstrapServer(contextP, fromSessionH);
        if (NULL == bsServerP)
        {
            // No server found
            return COAP_IGNORE;
        }
#else
        return COAP_IGNORE;
#endif
    }

#ifdef LWM2M_BOOTSTRAP
    if (contextP->bsState != BOOTSTRAP_PENDING)
    {
        if (NULL != bsServerP)
        {
            // server initiated bootstrap?
            // currently not implemented.
            return NOT_IMPLEMENTED_5_01;
        }
        if ( serverP->status != STATE_REGISTERED &&
                serverP->status != STATE_REG_UPDATE_PENDING)
        {
            return COAP_IGNORE;
        }
    }
    else
    {
        if (NULL != serverP)
        {
            // Request form management server during bootstrap.
            return UNAUTHORIZED_4_01;
        }
    }
#endif

    switch (message->code)
    {
    case COAP_GET:
        {
            uint8_t * buffer = NULL;
            size_t length = 0;

            result = object_read(contextP, uriP, &format, &buffer, &length);
            if (COAP_205_CONTENT == result)
            {
                if (IS_OPTION(message, COAP_OPTION_OBSERVE))
                {
                    result = handle_observe_request(contextP, uriP, serverP, message, response);
                }
                if (COAP_205_CONTENT == result)
                {
                    coap_set_header_content_type(response, format);
                    coap_set_payload(response, buffer, length);
                    // lwm2m_handle_packet will free buffer
                }
                else
                {
                    lwm2m_free(buffer);
                }
            }
        }
        break;

    case COAP_POST:
        {
#ifdef LWM2M_BOOTSTRAP
            /* no POST during bootstrap */
            if (contextP->bsState == BOOTSTRAP_PENDING) return METHOD_NOT_ALLOWED_4_05;
#endif
            if (!LWM2M_URI_IS_SET_INSTANCE(uriP))
            {
                lwm2m_media_type_t format;

                format = prv_convertMediaType(message->content_type);

                result = object_create(contextP, uriP, format, message->payload, message->payload_len);
                if (result == COAP_201_CREATED)
                {
                    //longest uri is /65535/65535 = 12 + 1 (null) chars
                    char location_path[13] = "";
                    //instanceId expected
                    if ((uriP->flag & LWM2M_URI_FLAG_INSTANCE_ID) == 0)
                    {
                        result = COAP_500_INTERNAL_SERVER_ERROR;
                        break;
                    }

                    if (sprintf(location_path, "/%d/%d", uriP->objectId, uriP->instanceId) < 0)
                    {
                        result = COAP_500_INTERNAL_SERVER_ERROR;
                        break;
                    }
                    coap_set_header_location_path(response, location_path);
                }
            }
            else if (!LWM2M_URI_IS_SET_RESOURCE(uriP))
            {
                if (object_isInstanceNew(contextP, uriP->objectId, uriP->instanceId))
                {
                    result = object_create(contextP, uriP, format, message->payload, message->payload_len);
                }
                else
                {
                    result = object_write(contextP, uriP, format, message->payload, message->payload_len);
                }
            }
            else
            {
                result = object_execute(contextP, uriP, message->payload, message->payload_len);
            }
        }
        break;

    case COAP_PUT:
        {
            if (LWM2M_URI_IS_SET_INSTANCE(uriP))
            {
#ifdef LWM2M_BOOTSTRAP
                if (contextP->bsState == BOOTSTRAP_PENDING && object_isInstanceNew(contextP, uriP->objectId, uriP->instanceId))
                {
                    result = object_create(contextP, uriP, format, message->payload, message->payload_len);
                    if (COAP_201_CREATED == result)
                    {
                        result = COAP_204_CHANGED;
                    }
                }
                else
#endif
                {
                    result = object_write(contextP, uriP, format, message->payload, message->payload_len);
                }
            }
            else
            {
                result = BAD_REQUEST_4_00;
            }
        }
        break;

    case COAP_DELETE:
        {
            if (LWM2M_URI_IS_SET_INSTANCE(uriP) && !LWM2M_URI_IS_SET_RESOURCE(uriP))
            {
                result = object_delete(contextP, uriP);
            }
            else
            {
                result = BAD_REQUEST_4_00;
            }
        }
        break;

    default:
        result = BAD_REQUEST_4_00;
        break;
    }

    return result;
}