write_lst.c revision 01dda204cd28fe181691b4a44a51be7e5666d0c8
1a6391f1006b961ca89d1c79a826375380684a4deSan Mehat/* libs/diskconfig/write_lst.c
2a6391f1006b961ca89d1c79a826375380684a4deSan Mehat *
3a6391f1006b961ca89d1c79a826375380684a4deSan Mehat * Copyright 2008, The Android Open Source Project
4a6391f1006b961ca89d1c79a826375380684a4deSan Mehat *
5a6391f1006b961ca89d1c79a826375380684a4deSan Mehat * Licensed under the Apache License, Version 2.0 (the "License");
6a6391f1006b961ca89d1c79a826375380684a4deSan Mehat * you may not use this file except in compliance with the License.
7a6391f1006b961ca89d1c79a826375380684a4deSan Mehat * You may obtain a copy of the License at
8a6391f1006b961ca89d1c79a826375380684a4deSan Mehat *
9a6391f1006b961ca89d1c79a826375380684a4deSan Mehat *     http://www.apache.org/licenses/LICENSE-2.0
10a6391f1006b961ca89d1c79a826375380684a4deSan Mehat *
11a6391f1006b961ca89d1c79a826375380684a4deSan Mehat * Unless required by applicable law or agreed to in writing, software
12a6391f1006b961ca89d1c79a826375380684a4deSan Mehat * distributed under the License is distributed on an "AS IS" BASIS,
13a6391f1006b961ca89d1c79a826375380684a4deSan Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14a6391f1006b961ca89d1c79a826375380684a4deSan Mehat * See the License for the specific language governing permissions and
15a6391f1006b961ca89d1c79a826375380684a4deSan Mehat * limitations under the License.
16a6391f1006b961ca89d1c79a826375380684a4deSan Mehat */
17a6391f1006b961ca89d1c79a826375380684a4deSan Mehat
18a6391f1006b961ca89d1c79a826375380684a4deSan Mehat#define LOG_TAG "write_lst"
19a6391f1006b961ca89d1c79a826375380684a4deSan Mehat#include <sys/types.h>
20a6391f1006b961ca89d1c79a826375380684a4deSan Mehat#include <stdint.h>
21a6391f1006b961ca89d1c79a826375380684a4deSan Mehat#include <stdio.h>
22a6391f1006b961ca89d1c79a826375380684a4deSan Mehat#include <stdlib.h>
23a6391f1006b961ca89d1c79a826375380684a4deSan Mehat#include <unistd.h>
24a6391f1006b961ca89d1c79a826375380684a4deSan Mehat
25a6391f1006b961ca89d1c79a826375380684a4deSan Mehat#include <cutils/log.h>
26a6391f1006b961ca89d1c79a826375380684a4deSan Mehat
27a6391f1006b961ca89d1c79a826375380684a4deSan Mehat#include <diskconfig/diskconfig.h>
28a6391f1006b961ca89d1c79a826375380684a4deSan Mehat
29a6391f1006b961ca89d1c79a826375380684a4deSan Mehatstruct write_list *
30a6391f1006b961ca89d1c79a826375380684a4deSan Mehatalloc_wl(uint32_t data_len)
31a6391f1006b961ca89d1c79a826375380684a4deSan Mehat{
32a6391f1006b961ca89d1c79a826375380684a4deSan Mehat    struct write_list *item;
33a6391f1006b961ca89d1c79a826375380684a4deSan Mehat
34a6391f1006b961ca89d1c79a826375380684a4deSan Mehat    if (!(item = malloc(sizeof(struct write_list) + data_len))) {
3501dda204cd28fe181691b4a44a51be7e5666d0c8Steve Block        ALOGE("Unable to allocate memory.");
36a6391f1006b961ca89d1c79a826375380684a4deSan Mehat        return NULL;
37a6391f1006b961ca89d1c79a826375380684a4deSan Mehat    }
38a6391f1006b961ca89d1c79a826375380684a4deSan Mehat
39a6391f1006b961ca89d1c79a826375380684a4deSan Mehat    item->len = data_len;
40a6391f1006b961ca89d1c79a826375380684a4deSan Mehat    return item;
41a6391f1006b961ca89d1c79a826375380684a4deSan Mehat}
42a6391f1006b961ca89d1c79a826375380684a4deSan Mehat
43a6391f1006b961ca89d1c79a826375380684a4deSan Mehatvoid
44a6391f1006b961ca89d1c79a826375380684a4deSan Mehatfree_wl(struct write_list *item)
45a6391f1006b961ca89d1c79a826375380684a4deSan Mehat{
46a6391f1006b961ca89d1c79a826375380684a4deSan Mehat    if (item)
47a6391f1006b961ca89d1c79a826375380684a4deSan Mehat        free(item);
48a6391f1006b961ca89d1c79a826375380684a4deSan Mehat}
49a6391f1006b961ca89d1c79a826375380684a4deSan Mehat
50a6391f1006b961ca89d1c79a826375380684a4deSan Mehatstruct write_list *
51a6391f1006b961ca89d1c79a826375380684a4deSan Mehatwlist_add(struct write_list **lst, struct write_list *item)
52a6391f1006b961ca89d1c79a826375380684a4deSan Mehat{
53a6391f1006b961ca89d1c79a826375380684a4deSan Mehat    item->next = (*lst);
54a6391f1006b961ca89d1c79a826375380684a4deSan Mehat    *lst = item;
55a6391f1006b961ca89d1c79a826375380684a4deSan Mehat    return item;
56a6391f1006b961ca89d1c79a826375380684a4deSan Mehat}
57a6391f1006b961ca89d1c79a826375380684a4deSan Mehat
58a6391f1006b961ca89d1c79a826375380684a4deSan Mehatvoid
59a6391f1006b961ca89d1c79a826375380684a4deSan Mehatwlist_free(struct write_list *lst)
60a6391f1006b961ca89d1c79a826375380684a4deSan Mehat{
61a6391f1006b961ca89d1c79a826375380684a4deSan Mehat    struct write_list *temp_wr;
62a6391f1006b961ca89d1c79a826375380684a4deSan Mehat    while (lst) {
63a6391f1006b961ca89d1c79a826375380684a4deSan Mehat        temp_wr = lst->next;
64a6391f1006b961ca89d1c79a826375380684a4deSan Mehat        free_wl(lst);
65a6391f1006b961ca89d1c79a826375380684a4deSan Mehat        lst = temp_wr;
66a6391f1006b961ca89d1c79a826375380684a4deSan Mehat    }
67a6391f1006b961ca89d1c79a826375380684a4deSan Mehat}
68a6391f1006b961ca89d1c79a826375380684a4deSan Mehat
69a6391f1006b961ca89d1c79a826375380684a4deSan Mehatint
70a6391f1006b961ca89d1c79a826375380684a4deSan Mehatwlist_commit(int fd, struct write_list *lst, int test)
71a6391f1006b961ca89d1c79a826375380684a4deSan Mehat{
72a6391f1006b961ca89d1c79a826375380684a4deSan Mehat    for(; lst; lst = lst->next) {
73a6391f1006b961ca89d1c79a826375380684a4deSan Mehat        if (lseek64(fd, lst->offset, SEEK_SET) != (loff_t)lst->offset) {
7401dda204cd28fe181691b4a44a51be7e5666d0c8Steve Block            ALOGE("Cannot seek to the specified position (%lld).", lst->offset);
75a6391f1006b961ca89d1c79a826375380684a4deSan Mehat            goto fail;
76a6391f1006b961ca89d1c79a826375380684a4deSan Mehat        }
77a6391f1006b961ca89d1c79a826375380684a4deSan Mehat
78a6391f1006b961ca89d1c79a826375380684a4deSan Mehat        if (!test) {
79a6391f1006b961ca89d1c79a826375380684a4deSan Mehat            if (write(fd, lst->data, lst->len) != (int)lst->len) {
8001dda204cd28fe181691b4a44a51be7e5666d0c8Steve Block                ALOGE("Failed writing %u bytes at position %lld.", lst->len,
81a6391f1006b961ca89d1c79a826375380684a4deSan Mehat                     lst->offset);
82a6391f1006b961ca89d1c79a826375380684a4deSan Mehat                goto fail;
83a6391f1006b961ca89d1c79a826375380684a4deSan Mehat            }
84a6391f1006b961ca89d1c79a826375380684a4deSan Mehat        } else
85fe71a61e5b0cb666675900d206251a7c18ed944bSteve Block            ALOGI("Would write %d bytes @ offset %lld.", lst->len, lst->offset);
86a6391f1006b961ca89d1c79a826375380684a4deSan Mehat    }
87a6391f1006b961ca89d1c79a826375380684a4deSan Mehat
88a6391f1006b961ca89d1c79a826375380684a4deSan Mehat    return 0;
89a6391f1006b961ca89d1c79a826375380684a4deSan Mehat
90a6391f1006b961ca89d1c79a826375380684a4deSan Mehatfail:
91a6391f1006b961ca89d1c79a826375380684a4deSan Mehat    return -1;
92a6391f1006b961ca89d1c79a826375380684a4deSan Mehat}
93