/* libs/diskconfig/write_lst.c
 *
 * Copyright 2008, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#define LOG_TAG "write_lst"

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

#include <android/log.h>
#include <diskconfig/diskconfig.h>

struct write_list *
alloc_wl(uint32_t data_len)
{
    struct write_list *item;

    if (!(item = malloc(sizeof(struct write_list) + data_len))) {
        ALOGE("Unable to allocate memory.");
        return NULL;
    }

    item->len = data_len;
    return item;
}

void
free_wl(struct write_list *item)
{
    if (item)
        free(item);
}

struct write_list *
wlist_add(struct write_list **lst, struct write_list *item)
{
    item->next = (*lst);
    *lst = item;
    return item;
}

void
wlist_free(struct write_list *lst)
{
    struct write_list *temp_wr;
    while (lst) {
        temp_wr = lst->next;
        free_wl(lst);
        lst = temp_wr;
    }
}

int
wlist_commit(int fd, struct write_list *lst, int test)
{
    for(; lst; lst = lst->next) {
        if (lseek64(fd, lst->offset, SEEK_SET) != (loff_t)lst->offset) {
            ALOGE("Cannot seek to the specified position (%lld).", (long long)lst->offset);
            goto fail;
        }

        if (!test) {
            if (write(fd, lst->data, lst->len) != (int)lst->len) {
                ALOGE("Failed writing %u bytes at position %lld.", lst->len,
                     (long long)lst->offset);
                goto fail;
            }
        } else
            ALOGI("Would write %d bytes @ offset %lld.", lst->len, (long long)lst->offset);
    }

    return 0;

fail:
    return -1;
}
