15fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi/* 25fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * Copyright 2012 The Android Open Source Project 35fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * 45fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * Licensed under the Apache License, Version 2.0 (the "License"); 55fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * you may not use this file except in compliance with the License. 65fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * You may obtain a copy of the License at 75fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * 85fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * http://www.apache.org/licenses/LICENSE-2.0 95fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * 105fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * Unless required by applicable law or agreed to in writing, software 115fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * distributed under the License is distributed on an "AS IS" BASIS, 125fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * See the License for the specific language governing permissions and 145fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * limitations under the License. 155fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 165fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 175fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi#include <stdio.h> 185fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi#include <stdlib.h> 195fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi#include <string.h> 205fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi#include <fcntl.h> 215fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi#include <unistd.h> 225fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi#include <errno.h> 235fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi#include <sys/stat.h> 245fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi#include <sys/types.h> 255fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 265fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi#include "wfc_util_log.h" 275fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 285fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi/* 295fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choistatic void wfc_util_printf(char *pSPointer, int length) 305fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi{ 315fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi char *pPrintBuff = NULL; 325fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 335fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( NULL == pSPointer || 0 >= length ) { 345fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_printf : unvalid parameters"); 355fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return; 365fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 375fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 385fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_printf : lenght is (%d)", length); 395fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pPrintBuff = malloc(length+1); 405fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 415fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( NULL != pPrintBuff ) { 425fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi memset( pPrintBuff, 0, (length+1) ); 435fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi memcpy(pPrintBuff, pSPointer, length); 445fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 455fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_printf : %s", pPrintBuff); 465fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 475fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi free(pPrintBuff); 485fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 495fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_printf : can not malloc(%d)", (length+1)); 505fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 515fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return; 525fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi} 535fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi*/ 545fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 555fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choistatic void wfc_util_finsert_new_string(int fd, char **ppReadedBuff, char *pNewStringValue, char *pEndOfCfg) 565fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi{ 575fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi off_t sz_file; 585fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi int sz_backupBuff = 0; 595fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi char *pReadBuff = NULL, *pBackupBuff = NULL; 605fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi char *pSPointer = NULL, *pETagPointer = NULL; 615fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 625fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( 0 == fd || NULL == pNewStringValue || 0 == strlen(pNewStringValue) ) { 635fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_finsert_new_string : unvalid parameters"); 645fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return; 655fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 665fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 675fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( NULL == ppReadedBuff) { 685fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi // TODO: 695fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return; 705fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 715fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pReadBuff = *ppReadedBuff; 725fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 735fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 745fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 755fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * find END TAG string 765fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 775fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pETagPointer = strstr(pReadBuff, pEndOfCfg); 785fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pSPointer = pETagPointer - 1; 795fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 805fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 815fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * calcurate file size and size of the tail of file 825fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 835fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi sz_file = lseek( fd, 0, SEEK_END ); 845fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi sz_backupBuff = (int)sz_file - (pETagPointer - pReadBuff); 855fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 865fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 875fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * prefare the buffer to store the tail of file 885fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 895fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pBackupBuff = malloc(sz_backupBuff); 905fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 915fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( NULL != pBackupBuff ) { 925fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 935fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * copy the tail of file. 945fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 955fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi memset( pBackupBuff, 0, sz_backupBuff ); 965fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi memcpy( pBackupBuff, pETagPointer, sz_backupBuff ); 975fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 985fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 995fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * write new string. 1005fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 1015fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi lseek( fd, (int)(pSPointer-pReadBuff), SEEK_SET ); 1025fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi write( fd, pNewStringValue, strlen(pNewStringValue)); 1035fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 1045fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 1055fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * update pETagPointer. 1065fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 1075fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pETagPointer = pSPointer + strlen(pNewStringValue); 1085fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 1095fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 1105fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * write the tail of file. 1115fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 1125fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi lseek( fd, (int)(pETagPointer-pReadBuff), SEEK_SET ); 1135fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi write( fd, pBackupBuff, sz_backupBuff ); 1145fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 1155fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi ftruncate(fd, sz_file + strlen(pNewStringValue) - 1); /* we use "-1" becasue of "pSPointer = pETagPointer - 1"*/ 1165fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 1175fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi free(pBackupBuff); 1185fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 1195fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 1205fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * make new *ppReadedBuff 1215fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 1225fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( NULL != ppReadedBuff) { 1235fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi // TODO: 1245fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 1255fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 1265fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_finsert_new_string : can not malloc(%d)", sz_backupBuff); 1275fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 1285fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 1295fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return; 1305fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi} 1315fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 1325fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choistatic void wfc_util_fupdate_string(int fd, char **ppReadedBuff, 1335fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi char *pETagPointer, char *pSValuePointer, char *pNewValueString) 1345fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi{ 1355fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi off_t sz_file; 1365fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi int sz_newReadBuff = 0; 1375fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi char *pReadBuff = NULL, *pNewReadBuff = NULL, *pCurReadBuff = NULL; 1385fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 1395fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( 0 == fd ) { 1405fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_fupdate_string : unvalid parameters"); 1415fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return; 1425fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 1435fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 1445fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( NULL == ppReadedBuff) { 1455fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi // TODO: 1465fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return; 1475fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 1485fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pReadBuff = *ppReadedBuff; 1495fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 1505fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 1515fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 1525fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * calcurate file size and new file size 1535fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 1545fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi sz_file = lseek( fd, 0, SEEK_END ); 1555fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi sz_newReadBuff = (int)sz_file - (int)(pETagPointer - pSValuePointer) + strlen(pNewValueString); 1565fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 1575fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 1585fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * prefare the buffer to read file 1595fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 1605fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pNewReadBuff = malloc(sz_newReadBuff); 1615fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 1625fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( NULL != pNewReadBuff ) { 1635fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 1645fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * copy buffer 1655fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 1665fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi memset( pNewReadBuff, 0, sz_file ); 1675fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pCurReadBuff = pNewReadBuff; 1685fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi memcpy( pNewReadBuff, pReadBuff, (int)(pSValuePointer-pReadBuff) ); 1695fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pCurReadBuff += (int)(pSValuePointer-pReadBuff); 1705fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 1715fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 1725fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * copy new value string 1735fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 1745fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi memcpy( pCurReadBuff, pNewValueString, strlen(pNewValueString)); 1755fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pCurReadBuff += strlen(pNewValueString); 1765fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 1775fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 1785fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * copy the remained buffer 1795fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 1805fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi memcpy( pCurReadBuff, pETagPointer, ((int)(sz_file) - (int)(pETagPointer - pReadBuff) + 1)); 1815fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 1825fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 1835fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * write file and update the file size 1845fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 1855fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi lseek( fd, 0, SEEK_SET ); 1865fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi write( fd, pNewReadBuff, sz_newReadBuff); 1875fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi ftruncate(fd, sz_newReadBuff); 1885fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 1895fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi free(pNewReadBuff); 1905fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 1915fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_fupdate_string : can not malloc(%d)", (int)sz_newReadBuff); 1925fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 1935fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 1945fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return; 1955fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi} 1965fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 1975fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi/* 1985fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * wfc_util_fset_buffer 1995fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * 2005fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * return : void 2015fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 2025fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choivoid wfc_util_fset_buffer(char *pFileName, int positionStart, unsigned char *pNewValue, int newValueLength) 2035fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi{ 2045fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi int fd; 2055fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi off_t sz_file; 2065fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi char *pReadBuff = NULL; 2075fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 2085fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi fd = open( pFileName, O_RDWR ); 2095fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 2105fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( fd >= 0 ) { 2115fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 2125fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * calcurate file size 2135fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 2145fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi sz_file = lseek( fd, 0, SEEK_END ); 2155fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 2165fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 2175fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * prefare the buffer to read file 2185fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 2195fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pReadBuff = malloc(sz_file + 1); // null terminated 2205fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 2215fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( NULL != pReadBuff ) { 2225fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 2235fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * read file 2245fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 2255fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi memset( pReadBuff, 0, sz_file + 1); 2265fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi lseek( fd, 0, SEEK_SET ); 2275fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi read( fd, pReadBuff, sz_file ); 2285fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 2295fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if(sz_file >= (positionStart+newValueLength)) { 2305fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi lseek( fd, positionStart, SEEK_SET ); 2315fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi write( fd, pNewValue, newValueLength ); 2325fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 2335fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 2345fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * insert with new length value buffer 2355fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 2365fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_fset_buffer : file size(%d) is less than to write position(%d)", (int)sz_file, (positionStart+newValueLength)); 2375fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi // TODO: 2385fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 2395fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 2405fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi free(pReadBuff); 2415fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 2425fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_fset_buffer : can not malloc(%d)", (int)sz_file); 2435fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 2445fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 2455fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if ( -1 == fsync( fd ) ) { 2465fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_fset_buffer : fail to fsync()"); 2475fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 2485fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 2495fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi close( fd ); 2505fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 2515fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_fset_buffer : can not open file"); 2525fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 2535fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 2545fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return; 2555fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi} 2565fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 2575fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi/* 2585fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * wfc_util_fget_buffer 2595fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * 2605fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * return : it will return the length of the stored buffer value if procedure is success 2615fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * or will return 0 if not. 2625fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 2635fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choiint wfc_util_fget_buffer(char *pFileName, int positionStart, int lengthToRead, unsigned char *pValueBuff, int buffLength) 2645fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi{ 2655fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi int result = 0; 2665fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi int fd; 2675fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi off_t sz_file; 2685fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi char *pReadBuff = NULL; 2695fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi char *pSValuePointer = NULL, *pETagPointer = NULL; 2705fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 2715fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi fd = open( pFileName, O_RDONLY ); 2725fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 2735fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( fd >= 0 ) { 2745fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 2755fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * calcurate file size 2765fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 2775fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi sz_file = lseek( fd, 0, SEEK_END ); 2785fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 2795fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if(sz_file >= (positionStart+lengthToRead)) { 2805fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 2815fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * prefare the buffer to read file 2825fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 2835fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pReadBuff = malloc(sz_file + 1); // null terminated 2845fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 2855fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( NULL != pReadBuff ) { 2865fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 2875fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * read file 2885fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 2895fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi memset( pReadBuff, 0, sz_file + 1 ); 2905fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi lseek( fd, 0, SEEK_SET ); 2915fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi read( fd, pReadBuff, sz_file ); 2925fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 2935fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 2945fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * calculate the start buffer pointer 2955fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 2965fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pSValuePointer = pReadBuff + positionStart; 2975fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 2985fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 2995fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * calculate the end buffer pointer 3005fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 3015fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pETagPointer = pSValuePointer + lengthToRead; 3025fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 3035fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 3045fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * read the string value 3055fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 3065fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( buffLength >= (int)(pETagPointer-pSValuePointer) ) { 3075fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi memset( pValueBuff, 0, buffLength ); 3085fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi memcpy( pValueBuff, pSValuePointer, (int)(pETagPointer-pSValuePointer) ); 3095fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi result = (int)(pETagPointer-pSValuePointer); 3105fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 3115fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_fget_buffer : not enough string value buffer(%d)", (int)(pETagPointer-pSValuePointer)); 3125fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 3135fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 3145fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi free(pReadBuff); 3155fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 3165fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_fget_buffer : can not malloc(%d)", (int)sz_file); 3175fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 3185fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 3195fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_fget_buffer : file size(%d) is less than to read position(%d)", (int)sz_file, (positionStart+lengthToRead)); 3205fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 3215fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi close( fd ); 3225fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 3235fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_fget_buffer : can not open file"); 3245fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 3255fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 3265fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return result; 3275fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi} 3285fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 3295fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi/* 3305fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * wfc_util_fset_string 3315fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * 3325fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * The following format string will be added or updated to the file pFileName. 3335fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * [pSTagString][pNewValueString][pETagString] 3345fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * 3355fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * pFileName : file name and path 3365fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * pEndOfCfg : tag string to notify the end of configuration file 3375fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * pSTagString : tag string to notify purpose of the value 3385fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * pETagString : tag string to notify the end of the value 3395fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * pNewValueString : string to set for pSTagString 3405fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * 3415fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * return : void 3425fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 3435fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choivoid wfc_util_fset_string(char *pFileName, char *pEndOfCfg, char *pSTagString, char *pETagString, char *pNewValueString) 3445fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi{ 3455fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi int fd; 3465fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi off_t sz_file; 3475fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi int sz_NewValueBuff = 0; 3485fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi char *pReadBuff = NULL, *pNewValueBuff = NULL; 3495fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi char *pSPointer = NULL, *pETagPointer = NULL, *pSValuePointer = NULL; 3505fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 3515fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi fd = open( pFileName, O_RDWR ); 3525fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 3535fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( fd >= 0 ) { 3545fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 3555fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * calcurate file size 3565fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 3575fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi sz_file = lseek( fd, 0, SEEK_END ); 3585fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 3595fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 3605fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * prefare the buffer to read file 3615fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 3625fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if (sz_file > 0) 3635fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pReadBuff = malloc(sz_file + 1); // null terminated 3645fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 3655fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( NULL != pReadBuff ) { 3665fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 3675fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * read file 3685fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 3695fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi memset( pReadBuff, 0x00, sz_file + 1); 3705fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if(lseek(fd, 0, SEEK_SET) != 0) { 3715fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("lseek failure"); 3725fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 3735fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi read( fd, pReadBuff, sz_file ); 3745fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 3755fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* WBT fix, make sure it is terminated with \0 */ 3765fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pReadBuff[sz_file] = '\0'; 3775fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 3785fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 3795fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * find TAG string 3805fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 3815fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pSPointer = strstr(pReadBuff, pSTagString); 3825fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 3835fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if(NULL != pSPointer) { 3845fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 3855fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * find END OF LINE string 3865fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 3875fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pETagPointer = strstr(pSPointer, pETagString); 3885fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 3895fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if(NULL != pETagPointer) { 3905fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 3915fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * write the new string value 3925fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 3935fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pSValuePointer = pSPointer+strlen(pSTagString); 3945fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if(strlen(pNewValueString) == (unsigned int)(pETagPointer-pSValuePointer)) { 3955fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi lseek( fd, (int)(pSValuePointer-pReadBuff), SEEK_SET ); 3965fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi write( fd, pNewValueString, strlen(pNewValueString)); 3975fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 3985fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 3995fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * insert with new length value string 4005fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 4015fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_fupdate_string(fd, &pReadBuff, pETagPointer, pSValuePointer, pNewValueString); 4025fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 4035fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 4045fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_fset_string : can not find End TAG"); 4055fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 4065fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 4075fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 4085fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * "\n""[Start TAG][String Value][End TAG]""\n" 4095fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 4105fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi sz_NewValueBuff = strlen(pSTagString) + 4115fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi strlen(pNewValueString) + 4125fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi strlen(pETagString) + 4135fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 2 + 1; 4145fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pNewValueBuff = malloc( sz_NewValueBuff); 4155fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 4165fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( NULL != pNewValueBuff ) { 4175fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 4185fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * prefare the new string to insert 4195fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 4205fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi memset( pNewValueBuff, 0, sz_NewValueBuff ); 4215fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi sprintf( pNewValueBuff, "%c%s%s%s%c", '\n', pSTagString, pNewValueString, pETagString,'\n' ); 4225fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 4235fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 4245fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * insert new string to the file 4255fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 4265fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_finsert_new_string(fd, &pReadBuff, pNewValueBuff, pEndOfCfg); 4275fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 4285fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi free( pNewValueBuff ); 4295fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 4305fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_fset_string : can not malloc(%d)", (int)sz_file); 4315fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 4325fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 4335fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 4345fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi free(pReadBuff); 4355fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 4365fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_fset_string : can not malloc(%d)", (int)sz_file); 4375fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 4385fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 4395fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if ( -1 == fsync( fd ) ) { 4405fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_fset_string : fail to fsync()"); 4415fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 4425fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 4435fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi close( fd ); 4445fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 4455fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_fset_string : can not open file"); 4465fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 4475fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 4485fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return; 4495fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi} 4505fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 4515fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi/* 4525fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * wfc_util_fget_string 4535fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * 4545fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * Read value from the following format string in the file pFileName. 4555fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * [pSTagString][string value to read][pETagString] 4565fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * 4575fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * pFileName : file name and path 4585fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * pEndOfCfg : tag string to notify the end of configuration file 4595fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * pSTagString : tag string to notify purpose of the value 4605fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * pETagString : tag string to notify the end of the value 4615fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * pValueStringBuff : string buffer to get string value 4625fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * stringBuffLength : the length of pValueStringBuff 4635fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * 4645fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * return : it will return the length of the stored string value if procedure is success 4655fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * or will return 0 if not. 4665fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 467cea9108baa12b80f8269e7ef5204743052229f27synergydevint wfc_util_fget_string(char *pFileName, char *pEndOfCfg __attribute__((unused)), char *pSTagString, 468cea9108baa12b80f8269e7ef5204743052229f27synergydev char *pETagString, char *pValueStringBuff, int stringBuffLength) 4695fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi{ 4705fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi int result = 0; 4715fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi int fd; 4725fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi off_t sz_file; 4735fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi char *pReadBuff = NULL; 4745fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi char *pSPointer = NULL, *pETagPointer = NULL, *pSValuePointer = NULL; 4755fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 4765fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi fd = open( pFileName, O_RDONLY ); 4775fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 4785fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( fd >= 0 ) { 4795fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 4805fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * calcurate file size 4815fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 4825fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi sz_file = lseek( fd, 0, SEEK_END ); 4835fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 4845fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 4855fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * prefare the buffer to read file 4865fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 4875fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if (sz_file > 0) // skip when value is 0 4885fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pReadBuff = malloc(sz_file + 1); 4895fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 4905fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( NULL != pReadBuff ) { 4915fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 4925fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * read file 4935fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 4945fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi memset( pReadBuff, 0, sz_file + 1); 4955fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if(lseek(fd, 0, SEEK_SET) != 0) { 4965fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("lseek failure"); 4975fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 4985fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi read( fd, pReadBuff, sz_file ); 4995fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 5005fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* WBT fix, make sure it is terminated with \0 */ 5015fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pReadBuff[sz_file] = '\0'; 5025fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 5035fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 5045fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * find TAG string 5055fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 5065fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pSPointer = strstr( pReadBuff, pSTagString ); 5075fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 5085fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( NULL != pSPointer ) { 5095fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 5105fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * find END OF LINE string 5115fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 5125fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pETagPointer = strstr(pSPointer, pETagString); 5135fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 5145fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( NULL != pETagPointer ) { 5155fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* 5165fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * read the string value 5175fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 5185fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi pSValuePointer = pSPointer+strlen(pSTagString); 5195fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( stringBuffLength >= (int)(pETagPointer-pSValuePointer) ) { 5205fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi memset( pValueStringBuff, 0, stringBuffLength ); 5215fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi memcpy( pValueStringBuff, pSValuePointer, (int)(pETagPointer-pSValuePointer) ); 5225fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi result = (int)(pETagPointer-pSValuePointer); 5235fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 5245fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_fget_string : not enough string value buffer(%d)", (int)(pETagPointer-pSValuePointer)); 5255fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 5265fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 5275fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_fget_string : can not find End TAG"); 5285fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 5295fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 5305fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_fget_string : can not find Start TAG"); 5315fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 5325fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi free(pReadBuff); 5335fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 5345fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_fget_string : can not malloc(%d)", (int)sz_file); 5355fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 5365fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi close( fd ); 5375fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 5385fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_fget_string : can not open file"); 5395fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 5405fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 5415fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return result; 5425fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi} 5435fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 5445fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi/* 5455fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * wfc_util_ffile_check 5465fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * 5475fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * check whether pDestFName file exist or not 5485fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * 5495fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * pFileName : file name and path 5505fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * access_mode : R_OK | W_OK | X_OK | F_OK 5515fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * 5525fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * return : it will return 0 if the file exist 5535fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * or will return -1 if not. 5545fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 5555fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choiint wfc_util_ffile_check(char *pDestFName, int access_mode) 5565fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi{ 5575fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi struct stat st; 5585fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 5595fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if (access(pDestFName, access_mode) == 0) { 5605fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( stat( pDestFName, &st ) < 0 ) { 5615fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("Cannot stat the file \"%s\": %s", pDestFName, strerror(errno)); 5625fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return -1; 5635fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 5645fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi //check if config file has some data or is it empty due to previous errors 5655fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( st.st_size ) { 5665fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return 0; 5675fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 5685fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 5695fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("Cannot access \"%s\": %s", pDestFName, strerror(errno)); 5705fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 5715fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 5725fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return -1; 5735fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi} 5745fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 5755fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi/* 5765fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * wfc_util_ffile_check_copy 5775fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * 5785fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * check whether pDestFName file exist if not it will copy from pSourceFName file 5795fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * 5805fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * return : it will return 0 if procedure is success 5815fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi * or will return -1 if not. 5825fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi */ 5835fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choiint wfc_util_ffile_check_copy(char *pDestFName, char *pSourceFName, mode_t mode, uid_t uID, gid_t gID) 5845fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi{ 5855fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi#define WFC_BUFFER_SIZE 2048 5865fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi char buf[WFC_BUFFER_SIZE] = {0}; // Null terminated 5875fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi int srcfd, destfd; 5885fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi int nread; 5895fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi struct stat st; 5905fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 5915fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if (access(pDestFName, R_OK|W_OK) == 0) { 5925fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( stat( pDestFName, &st ) < 0 ) { 5935fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("Cannot stat the file \"%s\": %s", pDestFName, strerror(errno)); 5945fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return -1; 5955fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 5965fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi //check if config file has some data or is it empty due to previous errors 5975fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if( st.st_size ) { 5985fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return 0; 5995fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 6005fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi //else continue to write the config from default template. 6015fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else if (errno != ENOENT) { 6025fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("Cannot access \"%s\": %s", pDestFName, strerror(errno)); 6035fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return -1; 6045fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 6055fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 6065fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi srcfd = open(pSourceFName, O_RDONLY); 6075fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if (srcfd < 0) { 6085fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("Cannot open \"%s\": %s", pSourceFName, strerror(errno)); 6095fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return -1; 6105fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 6115fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 6125fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi destfd = open(pDestFName, O_CREAT|O_WRONLY, mode); 6135fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if (destfd < 0) { 6145fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi close(srcfd); 6155fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("Cannot create \"%s\": %s", pDestFName, strerror(errno)); 6165fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return -1; 6175fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 6185fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 6195fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi while ((nread = read(srcfd, buf, WFC_BUFFER_SIZE-1)) != 0) { 6205fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if (nread < 0) { 6215fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("Error reading \"%s\": %s", pSourceFName, strerror(errno)); 6225fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi close(srcfd); 6235fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi close(destfd); 6245fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi unlink(pDestFName); 6255fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return -1; 6265fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 6275fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi // WBT fix, according to manual, the number of bytes read can't be bigger than read_size. I don't know why WBT complains for this. 6285fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if (nread < WFC_BUFFER_SIZE) 6295fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi buf[nread] = '\0'; 6305fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi else { 6315fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi buf[WFC_BUFFER_SIZE-1] = '\0'; 6325fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi nread = WFC_BUFFER_SIZE-1; 6335fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 6345fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi write(destfd, buf, nread); 6355fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 6365fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 6375fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi close(destfd); 6385fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi close(srcfd); 6395fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 6405fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi /* remove this code because of permission problem when it is accessed from "atd" having system permission. */ 6415fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi { 6425fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi #ifndef CONFIG_LGE_WLAN_WIFI_PATCH 6435fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi uid_t uid = getuid(); 6445fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi gid_t gid = getgid(); 6455fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("Error changing group ownership (%d) of %s to %d: %s", gid, pDestFName, gID, strerror(errno)); 6465fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if (0 == uid) { 6475fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi #endif /* CONFIG_LGE_WLAN_WIFI_PATCH */ 6485fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi if (chown(pDestFName, uID, gID) < 0) { 6495fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("Error changing group ownership of %s to %d: %s", pDestFName, gID, strerror(errno)); 6505fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi unlink(pDestFName); 6515fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return -1; 6525fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 6535fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi #ifndef CONFIG_LGE_WLAN_WIFI_PATCH 6545fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } else { 6555fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi wfc_util_log_error("wfc_util_ffile_check_copy : we can not excute chown[uid = %d, gid = %d]", uid, getgid()); 6565fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 6575fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi #endif /* CONFIG_LGE_WLAN_WIFI_PATCH */ 6585fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi } 6595fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 6605fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi return 0; 6615fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi} 6625fd819dcca2ce41b0c7fa56d010dca6cbc3cc0d0Sungmin Choi 663