diff -r 000000000000 -r e4d67989cc36 ofdbus/dbus/dbus/filecheck.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ofdbus/dbus/dbus/filecheck.cpp Tue Feb 02 02:01:42 2010 +0200 @@ -0,0 +1,357 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + + + + +#include +#include +#include +#include "dbus-bus.h" +#include +#include +#include +#include +#include +#include +#include "dbus-internals.h" +#include +#include +#include +#include + +#define SEM_FILE_PATH "c:\\data\\dbus" +extern "C" +{ +int check_lock() +{ + int fd; + TBuf8<30>buf; + buf.Copy((const TUint8 *)DBUS_LOCK_FILE); + TBuf16<30>buf16; + buf16.Copy(buf); + if ((fd = open(DBUS_LOCK_FILE, O_EXCL | O_CREAT )) == -1) + { + + if(errno==EEXIST) + { + RFs rf; + User::LeaveIfError(rf.Connect()); + RFile fds; + User::LeaveIfError(fds.Open(rf,buf16,EFileShareAny)); + if(fds.Lock(0,10) == KErrNone) //file exists and not locked + { + _dbus_verbose ("c:\\data\\dbus\\dbus_lock file exist and is lock-free - dbusdaemon not running\n"); + fds.UnLock(0,10); + fds.Close(); + return 1; + } + else //file exists and is locked + { + _dbus_verbose ("c:\\data\\dbus\\dbus_lock file exist and is locked - dbusdaemon running\n"); + fds.Close(); + return 0; + } + } + } + + else //file is created + { + _dbus_verbose ("c:\\data\\dbus\\dbus_lock file doesnt exist and is lockfree - dbusdaemon not running\n"); + close(fd); + return 1; + } + +} + +int _dbus_semaphore_init() +{ + + union semun sem_val; + int sem_set_id,perm; + int proj_id = 100; + key_t fkey; + struct stat sb; + if(stat (SEM_FILE_PATH, &sb)<0) + { + _dbus_verbose ("c:\\data\\dbus directory doesnt exist\n"); + if(mkdir(SEM_FILE_PATH , 0666) < 0 ) + { + _dbus_verbose ("failed to create c:\\data\\dbus directory\n"); + return -1; + } + } + + if ((fkey = ftok(SEM_FILE_PATH, proj_id)) == -1) { + _dbus_verbose ("ftok() failed with error : %d\n",errno); + return FALSE; + } + + + perm = SEM_R | SEM_A | SEM_A>>6 | SEM_R>>6; + + + if(((sem_set_id = semget(fkey, 1, perm)))== -1) { + if((sem_set_id = semget(fkey, 1, IPC_CREAT | perm))==-1) + { + _dbus_verbose ("Failed to create the semaphore with error : %d\n",errno); + return FALSE; + } + } + else + return sem_set_id; + + _dbus_verbose ("semaphore created successfully with key : %d\n",fkey); + + sem_val.array = NULL; + sem_val.buf = NULL; + sem_val.val = 1; + + if(semctl(sem_set_id, 0, SETVAL, sem_val) == -1) { + _dbus_verbose ("Failed to initialize the semaphore with error : %d\n",errno); + + if(semctl(sem_set_id, 1, IPC_RMID) == -1) { + _dbus_verbose ("Failed to delete the semaphore with error : %d\n",errno); + } + return FALSE; + } + + _dbus_verbose ("semaphore value successfully initialized to 1\n"); + + return sem_set_id; +} + +int _dbus_semaphore_dec() +{ + + struct sembuf sem_op; + /* + * Wait on the semaphore till the value is non-negative. + */ + int sem_set_id; + + sem_set_id = _dbus_semaphore_init(); + + if(sem_set_id == FALSE) + return FALSE; + + sem_op.sem_num = 0; + sem_op.sem_op = -1; + sem_op.sem_flg = 0; + if( semop(sem_set_id, &sem_op, 1) <0) + { + _dbus_verbose ("Failed to decrement the semaphore with error : %d\n",errno); + return FALSE; + } + + _dbus_verbose ("semaphore value decremented by 1\n"); + return TRUE; +} + + +int _dbus_semaphore_inc() +{ + + struct sembuf sem_op; + int sem_set_id; + + sem_set_id = _dbus_semaphore_init(); + sem_op.sem_num = 0; + sem_op.sem_op = 1; + sem_op.sem_flg = 0; + if(semop(sem_set_id, &sem_op, 1)<0) + { + _dbus_verbose ("Failed to increment the semaphore with error : %d\n",errno); + return FALSE; + } + + _dbus_verbose ("semaphore value incremented by 1\n"); + return TRUE; +} +int dbus_create_private_directory(const char* dir) +{ + RFs fs; + + if(mkdir(dir,0666) < 0) + return FALSE; + + return TRUE;; +} +int _dbus_file_open_and_write(unsigned const char* sid_directory) +{ + TBuf8<100>Filename8 = _L8("C:\\private\\"); + struct stat sb; + Filename8.Append(sid_directory,strlen((const char*)sid_directory)); + if(stat ((const char*)Filename8.PtrZ(), &sb)<0) + { + _dbus_verbose ("c:\\private\\ directory doesnt exist\n"); + if(!dbus_create_private_directory((const char*)Filename8.PtrZ())) + return FALSE; + } + Filename8.Append(_L8("\\foobar_")); + Filename8.Append(sid_directory,strlen((const char*)sid_directory)); + + TBuf16<100>Filename16; + Filename16.Copy(Filename8); + + RFs fs; + if(fs.Connect()!= KErrNone) + { + return FALSE; + } + + RFile file; + if(file.Replace(fs,Filename16,EFileWrite) != KErrNone) + { + fs.Close(); + return FALSE; + } + if(file.SetAtt(KEntryAttHidden,0) != KErrNone) + { + file.Close(); + fs.Close(); + return FALSE; + } + if((file.Flush())!=KErrNone) + { + file.Close(); + fs.Close(); + return FALSE; + } + + file.Close(); + fs.Close(); + + return TRUE; +} + +int _dbus_file_open_for_write(const unsigned char* data) +{ + + const unsigned char* sid_directory; + const DBusString *homedir; + dbus_bool_t retval; + DBusString dirname; + + retval = FALSE; + + if(!_dbus_homedir_from_current_process(&homedir)) //getting the private or homedir directory of the process + { + goto out_0; + } + + //*(char*)(homedir->dummy1) = 'C'; + if(!_dbus_string_init(&dirname)) + return FALSE; + + _dbus_string_copy(homedir,0,&dirname,0); + *(char*)(dirname.dummy1) = 'C'; + + //sid_directory = (const unsigned char*)_dbus_string_get_const_data(homedir); + sid_directory = (const unsigned char*)_dbus_string_get_const_data(&dirname); + + TBuf8<100>Filename8; + Filename8.Append(sid_directory,strlen((const char*)sid_directory)); + Filename8.Append(_L8("\\foobar_")); + Filename8.Append(sid_directory + 11,strlen((const char*)sid_directory + 11)); + + TBuf16<50>Filename16; + Filename16.Copy(Filename8); + + RFs fs; + User::LeaveIfError(fs.Connect()); + + RFile file; + + User::LeaveIfError(file.Open(fs,Filename16,EFileRead)); + file.Close(); + + User::LeaveIfError(file.Open(fs,Filename16,EFileWrite)); + + TBuf8<100>pid_data(data); + User::LeaveIfError(file.Write(pid_data)); + + retval = TRUE; + +out_0 : + _dbus_string_free(&dirname); + file.Close(); + fs.Close(); + return retval; +} + +int _dbus_open_file_for_read(const unsigned char* pid,const unsigned char* hash,const unsigned char* sid_directory) +{ + + dbus_bool_t retval; + retval = FALSE; + + TBuf8<100>Filename8 = _L8("c:\\private\\"); + Filename8.Append(sid_directory,strlen((const char*)sid_directory)); + //Filename8.Append(_L8("\\foobar")); + Filename8.Append(_L8("\\foobar_")); + Filename8.Append(sid_directory,strlen((const char*)sid_directory)); + + TBuf16<100>Filename16; + Filename16.Copy(Filename8); + + RFs fs; + if(fs.Connect()!=KErrNone) + { + return FALSE; + } + + RFile file; + if(file.Open(fs,Filename16,EFileRead) != KErrNone) + { + fs.Close(); + return FALSE; + } + + TBuf8<200>read_data; + if(file.Read(read_data) != KErrNone) + { + fs.Close(); + return FALSE; + } + + char read_buffer[200] = ""; + strcpy(read_buffer,(char*)read_data.PtrZ()); + + char provided_data[200] = ""; + strcpy(provided_data,(char*)pid); + strcat(provided_data," "); + strcat(provided_data,(char*)hash); + + if(strcmp(provided_data,read_buffer)) + { + goto out_0; + } + + + + retval = TRUE; + +out_0 : + file.Close(); + fs.Delete(Filename16); + fs.Close(); + + return retval; +} +} //end extern"C" \ No newline at end of file