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