genericopenlibs/openenvcore/backend/src/syscall/handleipc.cpp
changeset 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/openenvcore/backend/src/syscall/handleipc.cpp	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,306 @@
+/*
+* Copyright (c) 2005-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 "sysif.h"
+#include "ipcclient.h"
+#include "sysreent.h"
+#include "sysusrinclude.h"
+
+
+extern "C" {
+
+// -----------------------------------------------------------------------------
+// Funcation name: mkfifo
+// Description: Provides a FIFO special file (a named pipe).
+// Returns: 0     : On success
+//          -1    : On error
+// In case of error, errno value set to 
+//          EACCES: One  of  the  directories in pathname did not allow search 
+//                  (exe-cute) permission.
+//          EEXIST: pathname already exists.
+//          ENAMETOOLONG: Either the total length of pathname is greater 
+//                        than PATH_MAX, or an individual  file  name  component  
+//                        has a length greater than NAME_MAX.  In the GNU system, 
+//                        there is no imposed limit on over-all  file name length,
+//                        but some file systems may place limits on the length of a component.
+//          ENOENT: A directory component in pathname does not exist or  is  a  dan-gling
+//                  symbolic link.
+//          ENOSPC: The directory or filesystem has no room for the new file.
+//          ENOTDIR: A  component  used as a directory in pathname is not, in fact, a
+//                   directory.
+//          EROFS:  pathname refers to a read-only filesystem.
+// To be removed
+//          EFAULT: Pathname is not valid.
+//          EMFILE: Too many file descriptors are in use by the process.
+//          ENFILE: System limit on the total number of open files has been 
+//                  reached.
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C int _mkfifo_r(int *aErrno, const wchar_t *_widename, mode_t mode)
+    {
+	return Backend()->mkfifo(_widename, mode, *aErrno);
+    }
+
+
+// -----------------------------------------------------------------------------
+// Funcation name: pipe
+// Description: It provides mechanism to flow data in one direction.
+// Returns: 0     : On success
+//          -1    : On error
+// In case of error, errno value set to 
+//          EFAULT: filedes is not valid.
+//          EMFILE: Too many file descriptors are in use by the process.
+//          ENFILE: System limit on the total number of open files has been 
+//                  reached.
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C int _pipe_r(int *aErrno, int fildes[2])
+    {
+    return Backend()->pipe(fildes, *aErrno);
+    }
+
+// -----------------------------------------------------------------------------
+// Funcation name: semget
+// Description: Get semaphore identifier using the IPC key generated by ftok.
+// Returns: None zero number (semaphore identifier): On success
+//          -1              : On error.
+// In case of error, errno value set to 
+//          EACCES - Semaphore exists but access denied.
+//          EEXIST - A semaphore identifier exists for the argument key but 
+//                   ((semflg&IPC_CREAT)&&(semflg&IPC_EXCL)) is non-zero.
+//          EINVAL - The value of nsems is either less than or equal to 0 or 
+//                   greater than the system-imposed limit, or a semaphore 
+//                   identifier exists for the argument key, but the number of 
+//                   semaphores in the set associated with it is less than nsems 
+//                   and nsems is not equal to 0.
+//          ENOENT - A semaphore identifier does not exist for the argument key 
+//                   and (semflg&IPC_CREAT) is equal to 0.
+//          ENOSPC - A semaphore identifier is to be created but the system-imposed 
+//                   limit on the maximum number of allowed semaphores system-wide 
+//                   would be exceeded.
+// -----------------------------------------------------------------------------
+//
+
+
+EXPORT_C int _semget_r(int *aErrno, key_t akey, int nsems, int asemflgs)
+    {
+	return Backend()->iIpcS.semget(akey, nsems, asemflgs, *aErrno); 
+    }
+
+// -----------------------------------------------------------------------------
+// Funcation name: semop
+// Description: Perform atomically a user-defined array of semaphore operations 
+//              on the set of semaphores associated with the semaphore identifier 
+//              specified by the argument semid.
+// Returns: 0  : On success
+//          -1 : On error.
+// In case of error, errno value set to 
+//          E2BIG - The value of nsops is greater than the system-imposed maximum.
+//          EACCES - Operation permission is denied to the calling process, see IPC.
+//          EAGAIN - The operation would result in suspension of the calling process 
+//                   but (sem_flg&IPC_NOWAIT) is non-zero.
+//          EFBIG - The value of sem_num is less than 0 or greater than or equal to 
+//                   the number of semaphores in the set associated with semid.
+//          EIDRM - The semaphore identifier semid is removed from the system.
+//          EINTR - The semop() function was interrupted by a signal.
+//          EINVAL - The value of semid is not a valid semaphore identifier, or the 
+//                   number of individual semaphores for which the calling process 
+//                   requests a SEM_UNDO would exceed the system-imposed limit.
+//          ENOSPC - The limit on the number of individual processes requesting a 
+//                   SEM_UNDO would be exceeded.
+//          ERANGE - An operation would cause a semval to overflow the system-imposed 
+//                   limit, or an operation would cause a semadj value to overflow the 
+//                   system-imposed limit
+// -----------------------------------------------------------------------------
+//
+EXPORT_C int _semop_r(int *aErrno, int semid, struct sembuf *sops, unsigned nsops)
+    {
+	return Backend()->iIpcS.semop(semid, sops, nsops, *aErrno);	
+    }
+
+// -----------------------------------------------------------------------------
+// Funcation name: semctl
+// Description: Provides a variety of semaphore control operations as specified by cmd.
+// Returns: 
+//          If successful, the value returned by semctl() depends on cmd as follows:
+//                 GETVAL - Value of semval. 
+//                 GETPID - Value of sempid. 
+//                 GETNCNT - Value of semncnt. 
+//                 GETZCNT - Value of semzcnt. 
+//                 All others, it returns 0. 
+//          -1 : On error.
+// In case of error, errno value set to 
+//          EACCES - Operation permission is denied to the calling process.
+//          EINVAL - The value of semid is not a valid semaphore identifier, 
+//                   or the value of semnum is less than 0 or greater than or 
+//                   equal to sem_nsems, or the value of cmd is not a valid command.
+//          EPERM - The argument cmd is equal to IPC_RMID or IPC_SET and the 
+//                   effective user ID of the calling process is not equal to 
+//                   that of a process with appropriate privileges and it is not 
+//                   equal to the value of sem_perm.cuid or sem_perm.uid in the 
+//                   data structure associated with semid.
+//          ERANGE - The argument cmd is equal to SETVAL or SETALL and the value 
+//                   to which semval is to be set is greater than the system-imposed maximum
+// -----------------------------------------------------------------------------
+//
+EXPORT_C int _semctl_r(int *aErrno, int semid, int semnum, int cmd, ...)
+    {
+    
+	va_list ap;
+	union semun semun;
+	union semun *semun_ptr;
+
+	
+	if (cmd == IPC_SET || cmd == IPC_STAT || cmd == GETALL
+	    || cmd == SETVAL || cmd == SETALL) 
+	    {
+		va_start(ap, cmd);
+		semun = va_arg(ap, union semun);
+		semun_ptr = &semun;
+		va_end(ap);
+	    } 
+	else 
+	    {
+		semun_ptr = NULL;
+	    }
+
+	return Backend()->iIpcS.semctl(semid, semnum, cmd, semun_ptr, *aErrno);
+    }
+
+// -----------------------------------------------------------------------------
+// Funcation name: shmget
+// Description: Get shared memory identifier using the IPC key generated by ftok.
+// Returns: None zero number (shared memory identifier): On success
+//          -1              : On error.
+// In case of error, errno value set to 
+//          EACCES - Operation permission is denied to the calling process, see IPC.
+//          EINVAL - The value of semid is not a valid semaphore identifier, or the 
+//                   value of semnum is less than 0 or greater than or equal to 
+//                   sem_nsems, or the value of cmd is not a valid command.
+//          EPERM -  The argument cmd is equal to IPC_RMID or IPC_SET and the effective 
+//                   user ID of the calling process is not equal to that of a process 
+//                   with appropriate privileges and it is not equal to the value of 
+//                   sem_perm.cuid or sem_perm.uid in the data structure associated 
+//                   with semid.
+//          ERANGE - The argument cmd is equal to SETVAL or SETALL and the value to 
+//                   which semval is to be set is greater than the system-imposed 
+//                   maximum.
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C int _shmget_r(int *aErrno, key_t key, int size, int shmflg)
+    {
+    return Backend()->iIpcS.shmget(key, size, shmflg, *aErrno);
+    }
+
+// -----------------------------------------------------------------------------
+// Funcation name: shmat
+// Description: Attaches the shared memory segment associated with the shared 
+//              memory identifier specified by shmid to the address space of 
+//              the calling process.
+// Returns: Segment's start address: On success
+//          -1   : On error.
+// In case of error, errno value set to 
+//          EACCES - Operation permission is denied to the calling process.
+//          EINVAL - The value of shmid is not a valid shared memory identifier; 
+//                   the shmaddr is not a null pointer and the value of 
+//                   (shmaddr-((ptrdiff_t)shmaddr%SHMLBA)) is an illegal 
+//                   address for attaching shared memory; or the shmaddr is not 
+//                   a null pointer, (shmflg&SHM_RND) is 0 and the value of 
+//                   shmaddr is an illegal address for attaching shared memory. 
+//          EMFILE - The number of shared memory segments attached to the calling 
+//                   process would exceed the system-imposed limit.
+//          ENOMEM - The available data space is not large enough to accommodate 
+//                   the shared memory segment.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void* _shmat_r(int *aErrno, int shmid, const void *shmaddr, int shmflg)
+    {
+    return Backend()->iIpcS.shmat(shmid, shmaddr, shmflg, *aErrno);
+    }
+
+// -----------------------------------------------------------------------------
+// Funcation name: shmdt
+// Description: Detaches the shared memory segment located at the address 
+//              specified by shmaddr from the address space of the calling process.
+// Returns: 0    : On success.
+//          -1   : On error.
+// In case of error, errno value set to 
+//          EINVAL - The value of shmaddr is not the data segment start 
+//                   address of a shared memory segment.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C int _shmdt_r(int *aErrno, const void *shmaddr)
+    {
+    return Backend()->iIpcS.shmdt(shmaddr, *aErrno);
+    }
+
+// -----------------------------------------------------------------------------
+// Funcation name: shmctl
+// Description: Provides a variety of shared memory control operations as 
+//              specified by cmd.
+// Returns: 0  : On success
+//          -1 : On error.
+// In case of error, errno value set to 
+//          EACCES - The argument cmd is equal to IPC_STAT and the calling 
+//                   process does not have read permission.
+//          EINVAL- The value of shmid is not a valid shared memory 
+//                   identifier, or the value of cmd is not a valid command. 
+//          EPERM - The argument cmd is equal to IPC_RMID or IPC_SET and the 
+//                  effective user ID of the calling process is not equal to 
+//                  that of a process with appropriate privileges and it is 
+//                  not equal to the value of shm_perm.cuid or shm_perm.uid 
+//                  in the data structure associated with shmid. 
+//          EOVERFLO - The cmd argument is IPC_STAT and the gid or uid value 
+//                     is too large to be stored in the structure pointed to 
+//                     by the buf argument
+// -----------------------------------------------------------------------------
+//
+EXPORT_C int _shmctl_r(int *aErrno, int shmid, int cmd, struct shmid_ds *buf)
+    {
+    return Backend()->iIpcS.shmctl(shmid, cmd, buf, *aErrno);
+    }
+
+
+//the message queue functions
+EXPORT_C int _msgget_r(key_t aKey, int aMsgFlag, int *aErrno)
+	{
+	return Backend()->iIpcS.msgget(aKey, aMsgFlag, *aErrno);
+	}
+
+EXPORT_C int _msgsnd_r(int msqid, const void *msgp, size_t msgsz, int msgflg, int *aErrno)
+    {
+    return Backend()->iIpcS.msgsnd(msqid, msgp, msgsz, msgflg, *aErrno);
+    }
+    
+EXPORT_C int _msgrcv_r(int msqid, void* msgp, size_t msgsz, long msgtyp, int msgflg, int *aErrno)
+    {
+    return Backend()->iIpcS.msgrcv(msqid, msgp, msgsz, msgtyp, msgflg, *aErrno);
+    }
+    
+EXPORT_C int _msgctl_r(int msqid, int cmd, struct msqid_ds *buf, int *aErrno)
+    {
+    return Backend()->iIpcS.msgctl(msqid, cmd, buf, *aErrno);
+    }
+
+} //end extern "C"