int32_t S3_HLS_Client_Set_Tag()

in S3_HLS_S3_Put_Client.c [298:360]


int32_t S3_HLS_Client_Set_Tag(S3_HLS_CLIENT_CTX* ctx, char* object_tag) {
    if(NULL == ctx)
        return S3_HLS_INVALID_PARAMETER;
        
    int32_t ret = S3_HLS_OK;
    if(0 != pthread_mutex_lock(&ctx->credential_lock))
        return S3_HLS_LOCK_FAILED;

    if(NULL == object_tag) {
        if(NULL != ctx->tag_header) {
            free(ctx->tag_header);
            ctx->tag_header = NULL;
            ctx->tag_header_length = 0;
        }
        
        goto l_unlock;
    }

    uint32_t tag_length = snprintf(NULL, 0, S3_HLS_TAG_HEADER_FORMAT, object_tag);
    if(0 >= tag_length) {
        ret = S3_HLS_UNKNOWN_INTERNAL_ERROR;
        goto l_unlock;
    }
    
    tag_length++;
    
    char* temp_header = NULL;
    if(tag_length <= ctx->tag_header_length) { // new tag have same length or shorter, no need to change length only update content
        tag_length = sprintf(ctx->tag_header, S3_HLS_TAG_HEADER_FORMAT, object_tag);
        if(0 >= tag_length) {
            PUT_DEBUG("Setting Tag Header In CTX Failed\n");
            ret = S3_HLS_UNKNOWN_INTERNAL_ERROR;
        }

        goto l_unlock;
    }
    
    temp_header = (char*)malloc(tag_length);
    if(NULL == temp_header) {
        PUT_DEBUG("Allocate Space For Tag Header Failed\n");
        ret = S3_HLS_UNKNOWN_INTERNAL_ERROR;
        goto l_unlock;
    }

    tag_length = sprintf(temp_header, S3_HLS_TAG_HEADER_FORMAT, object_tag);
    if(0 >= tag_length) {
        PUT_DEBUG("Setting Tag Header Failed\n");
        ret = S3_HLS_UNKNOWN_INTERNAL_ERROR;
        free(temp_header);
        goto l_unlock;
    }

    if(NULL != ctx->tag_header) {
        free(ctx->tag_header);
    }
    
    ctx->tag_header = temp_header;
    ctx->tag_header_length = tag_length;

l_unlock:
    pthread_mutex_unlock(&ctx->credential_lock);
    return ret;
}