ofdbus/dbus/dbus/filecheck.cpp
changeset 0 e4d67989cc36
child 11 8d1ef0d13f16
child 18 47c74d1534e1
--- /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