--- /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 <f32file.h>
+#include <fcntl.h>
+#include <errno.h>
+#include "dbus-bus.h"
+#include <dbus/config.h>
+#include <unistd.h>
+#include <sys/sem.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include "dbus-internals.h"
+#include <string.h>
+#include <dbus-userdb.h>
+#include <dbus-string.h>
+#include <sys/stat.h>
+
+#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\\<SID> 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