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