genericopenlibs/cstdlib/INC/POSIXIF.H
changeset 31 ce057bb09d0b
parent 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/cstdlib/INC/POSIXIF.H	Fri Jun 04 16:20:51 2010 +0100
@@ -0,0 +1,361 @@
+// Copyright (c) 1997-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 <estlib.h>
+#include "FDESC.H"
+#include "PIPEDESC.H"
+#include <stdlib.h>
+
+/**
+@internalComponent
+*/
+const TInt KCPosixMajorVersionNumber=2;
+const TInt KCPosixMinorVersionNumber=0;
+/**
+@internalComponent
+*/
+enum TPosixServerPanic 
+	{
+	EPosix_BadWaitCompletion=1,
+	EPosix_NoPendingIO=2,
+	};
+/**
+@internalComponent
+*/
+enum PosixMessage {
+	// asynchronous operations which need SetActive/RunL
+	PMread, PMwrite, PMfsync, 
+	PMsendto, PMrecvfrom, PMconnect, PMshutdown, PMaccept,
+//NOTIFY PROBLEM
+//	PMioctl, 
+	PMioctl, PMioctlN,
+	// asynchronous operations which just delay completion
+	PMwaitpid,
+	// synchronous operations
+	PMdup, PMdup2,
+	PMopen, PMclose, PMlseek, PMfstat,
+	PMgetcwd,
+	PMchdir, PMmkdir, PMrmdir, 
+	PMchmod, PMunlink, PMstat, PMrename,
+	PMResolvePath,
+	PMsocket, PMbind, PMlisten, PMsockname, PMgetsockopt, PMsetsockopt,
+	PMioctlcomplete, PMcancel,
+	PMTerminateProcess,
+	PMgetenv, PMsetenv, PMunsetenv,
+	PMpopen3, 
+	// inter-process operations
+	PMAreYouMyMother, PMHelloMum, PMPipeWrite, PMPipeRead, PMPipeIoctl, PMPipeClose, PMPipeCancel
+	};
+/**
+@internalComponent
+*/
+struct PosixParams
+	{
+	int ret;
+	int fid;
+	int pint[3];
+	const char* cptr[2];
+	char* ptr[2];
+	const wchar_t* cwptr[2];
+	wchar_t* wptr[2];
+	wchar_t** eptr[1];
+	unsigned long len[1];
+	unsigned long* lenp[1];
+	TUSockAddr addr;
+	};
+
+/**
+Package which holds client's process Id.
+@internalComponent
+*/
+typedef TPckgBuf<TInt> TPosixIPCPid;
+
+/**
+Package used by server to pass data to client.
+@internalComponent
+*/
+struct PosixIPCReply
+	{
+	TUint iVarCount;
+	TUint iEnvironmentSize;
+	TUint iWorkingDirectorySize;
+	TUint iPipeMask;
+	};
+/**
+@internalComponent
+*/
+typedef TPckgBuf<PosixIPCReply> TPosixIPCReply;
+
+
+//
+class RPosixSession : public RSessionBase
+/**
+@internalComponent
+*/
+	{
+public:
+	TInt Connect();
+	TInt Connect(TDesC& aServerName);
+	
+	// for specific posix functions
+	int Request(TInt aFunction, int& anErrno, PosixParams& params) const;
+	void Request(TInt aFunction, int& anErrno, PosixParams& params, TRequestStatus& aStatus) const;
+	// for generic messages
+	TInt Request(TInt aFunction, const TIpcArgs& aArg) const;
+	void Request(TInt aFunction, const TIpcArgs& aArg, TRequestStatus &aStatus) const;
+	
+	static TVersion Version();
+	};
+
+
+//
+class CPosixRequest;
+class CPosixServer;
+class CPosixIPCSession;
+NONSHARABLE_CLASS(CPosixProcess) : public CActive
+/**
+@internalComponent
+*/
+	{
+public:
+	CPosixProcess(CPosixServer& aServer);
+	~CPosixProcess();
+	void POpen3L(PosixParams* aParams);
+	static CPosixProcess* Find(CPosixProcess* head, TInt pid);
+	static void Release(CPosixProcess** aHead, CPosixProcess* aProc);
+	void Sizes(TPosixIPCReply& aReply) const;
+	void CopyToChildL(const RMessage2& aMessage);
+	inline TInt IsAlive() const {return IsActive();}
+	inline void Queue(CPosixRequest* aWaiter); 
+protected:
+	void RunL();
+	void DoCancel();
+
+private:
+	inline CEnvironment& Env() const;
+	inline CFileTable& Fids() const;
+	inline RFs& Fs() const;
+	inline RCommServ& Cs() const;
+
+public:
+	CPosixProcess* iNextProcess;
+	TInt iPid;
+	TInt iExitReason;
+private:
+	CPosixServer& iServer;
+
+	RProcess iChild;
+	CPosixRequest* iWaiters;
+
+	TUint iVarCount;
+	HBufC16* iEnvironment;
+	HBufC* iWorkingDirectory;
+	CPipeDesc* iPipes[3];
+	};
+//
+class CPosixRequest;
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CPosixServer) : public CServer2
+	{
+public:
+	static TInt ThreadFunction(TAny* aPtr);
+	static void InitL(TInt aPriority);
+	RFs& Fs()           { return iFs; }
+	RCommServ& Cs()     { return iCs; }
+	CFileTable& Fids()  { return iFids; }
+	RSocketServ& Ss()   { return iSs; }
+	CEnvironment& Env() { return iEnv; }
+
+	int POpen3(PosixParams* aParams, int& anErrno);
+	CPosixProcess* Child(TInt pid)	{ return CPosixProcess::Find(iChildren, pid); }
+	void Release(CPosixProcess* aChild) { CPosixProcess::Release(&iChildren, aChild); }
+	inline void WaitForAnyChild(CPosixRequest* aWaiter);
+	CPosixRequest* Waiters();
+	static void ServerPanic(TPosixServerPanic aPanic);
+
+protected:
+	CPosixServer(TInt aPriority);
+	CSession2* NewSessionL(const TVersion& aVersion, const RMessage2& aMessage) const;
+	void FindParentL();
+	void DefaultConsoleL();
+private:
+	RFs iFs;
+	CFileTable iFids;
+	RSocketServ iSs;
+	RCommServ	iCs;
+
+	CEnvironment iEnv;
+	RPosixSession iParent;
+	CPosixProcess* iChildren;
+	CPosixRequest* iWaitAnyQueue;
+	};
+
+//
+class CPosixSession;
+NONSHARABLE_CLASS(CPosixRequest) : public CActive
+/**
+@internalComponent
+*/
+	{
+public:
+	CPosixRequest(CPosixServer& aServer);
+	~CPosixRequest();
+	void Service(const RMessage2& aMessage);
+	void EnList(CPosixRequest*& aHead);	// simple single linked list
+	void WaitCompleted(TInt aPid, TInt aReason);
+protected:
+	void RunL();
+	void DoCancel();
+private:
+	RFs& Fs() const           { return iServer.Fs(); }
+	RCommServ& Cs() const           { return iServer.Cs(); }
+	CFileTable& Fids() const  { return iServer.Fids(); }
+	RSocketServ& Ss() const   { return iServer.Ss(); }
+	CEnvironment& Env() const { return iServer.Env(); }
+private:
+	void QueueAsynch(const RMessage2& aMessage);
+	void StartAsynch();
+	void EndAsynch(TInt aResult);
+
+	CPosixServer& iServer;
+
+	RMessage2 iMessage;
+
+	CFileDescBase* iFile;
+	CSocketDesc* iNewF;
+	int iNewFid;
+	TPtr8 iPtr;
+
+	CPosixRequest* iNext;	// for Enlist
+	TSglQueLink iLink;
+	enum CFileDescBase::IOQueues iQueue;
+
+	friend class TPosixRequestQueue;
+	friend class CFileDescBase;		// friend functions AddLast & Remove perhaps? 
+	};
+//
+inline CEnvironment& CPosixProcess::Env() const { return iServer.Env(); }
+inline CFileTable& CPosixProcess::Fids() const  { return iServer.Fids(); }
+inline RFs& CPosixProcess::Fs() const           { return iServer.Fs(); }
+inline RCommServ& CPosixProcess::Cs() const           { return iServer.Cs(); }
+inline void CPosixProcess::Queue(CPosixRequest* aWaiter)          { aWaiter->EnList(iWaiters); }
+inline void CPosixServer::WaitForAnyChild(CPosixRequest* aWaiter) { aWaiter->EnList(iWaitAnyQueue); }
+
+//
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CPosixSession) : public CSession2
+	{
+public:
+	CPosixSession(CPosixServer& aServer);
+	virtual void ServiceL(const RMessage2& aMessage);
+protected:
+	CPosixRequest iActive;
+	};
+
+NONSHARABLE_CLASS(CPosixIPCSession) : public CPosixSession
+/**
+@internalComponent
+*/
+	{
+public:
+	inline CPosixIPCSession(CPosixServer& aServer) 
+		: CPosixSession(aServer) {}
+	virtual void ServiceL(const RMessage2& aMessage);	 // override the local ServiceL
+	void SetPipes(CPipeDesc* aPipes[3]);
+	~CPosixIPCSession();
+
+private:
+	TInt AreYouMyMotherL(const RMessage2& aMessage);
+	TInt HelloMumL(const RMessage2& aMessage);
+	void PipeRead(const RMessage2& aMessage);
+	void PipeWrite(const RMessage2& aMessage);
+	void PipeIoctl(const RMessage2& aMessage);
+	void PipeClose(const RMessage2& aMessage);
+	void PipeCancel(const RMessage2& aMessage);
+
+	CPipeDesc* iPipes[3];
+	};
+//
+NONSHARABLE_CLASS(CProcessSystemInterface) : public MSystemInterface, public CBase
+/**
+@internalComponent
+*/
+	{
+public:
+	CProcessSystemInterface();
+	~CProcessSystemInterface();
+
+	TInt Connect();
+	virtual MSystemInterface& Clone();
+	virtual void Release();
+	virtual void TerminateProcess(int status);
+
+	virtual int dup (int fid, int& anErrno);
+	virtual int dup2 (int fid, int fid2, int& anErrno);
+	virtual int open (const wchar_t* name, int mode, int perms, int& anErrno);
+	virtual int read (int fid, char* buf, unsigned long len, int& anErrno);
+	virtual int write (int fid, const char* buf, unsigned long len, int& anErrno);
+	virtual int fsync (int fid, int& anErrno);
+	virtual int close (int fid, int& anErrno);
+	virtual int lseek (int fid, int offset, int whence, int& anErrno);
+	virtual int fstat (int fid, struct stat *st, int& anErrno);
+	virtual int ioctl (int fid, int cmd, void* param, int& anErrno);
+	virtual int ioctl (int fid, int cmd, void* param, TRequestStatus& aStatus, int& anErrno);
+	virtual int ioctl_complete (int fid, int cmd, void* param, TRequestStatus& aStatus, int& anErrno);
+	virtual int ioctl_cancel (int fid, int& anErrno);
+
+	virtual wchar_t * getcwd (wchar_t * buf, unsigned long len, int& anErrno);
+
+	virtual int chdir (const wchar_t* path, int& anErrno);
+	virtual int mkdir (const wchar_t* path, int perms, int& anErrno);
+	virtual int rmdir (const wchar_t* path, int& anErrno);
+	virtual int chmod (const wchar_t* path, int perms, int& anErrno);
+	virtual int unlink (const wchar_t* path, int& anErrno);
+	virtual int stat (const wchar_t* name, struct stat *st, int& anErrno);
+	virtual int rename (const wchar_t* oldname, const wchar_t* newname, int& anErrno);
+
+	virtual TInt ResolvePath (TParse& aResult, const wchar_t* path, TDes* aFilename);
+
+	virtual int socket (int family, int style, int protocol, int& anErrno);
+	virtual int recvfrom (int fd, char* buf, unsigned long cnt, int flags, struct sockaddr* from, unsigned long* fromsize, int& anErrno);
+	virtual int sendto (int fd, const char* buf, unsigned long cnt, int flags, struct sockaddr* to, unsigned long tosize, int& anErrno);
+	virtual int shutdown (int fd, int how, int& anErrno);
+	virtual int listen (int fd, int n, int& anErrno);
+	virtual int accept (int fd, int& anErrno);
+	virtual int bind (int fd, struct sockaddr* addr, unsigned long size, int& anErrno);
+	virtual int connect (int fd, struct sockaddr* addr, unsigned long size, int& anErrno);
+	virtual int sockname (int fd, struct sockaddr* addr, unsigned long* size, int anEnd, int& anErrno);
+	virtual int getsockopt (int fd, int level, int opt, void* buf, unsigned long* len, int& anErrno);
+	virtual int setsockopt (int fd, int level, int opt, void* buf, unsigned long len, int& anErrno);
+
+	virtual wchar_t* getenv (const wchar_t* name); 
+	virtual void unsetenv (const wchar_t* name);
+	virtual int setenv (const wchar_t* name, const wchar_t* value, int rewrite, int& anErrno);
+
+	virtual int popen3 (const wchar_t *file, const wchar_t *cmd, const wchar_t *mode, wchar_t** envp, int fids[3], int& anErrno);
+	virtual int waitpid (int pid, int* status, int options, int& anErrno);
+
+private:
+	int Request(TInt aFunction, int& anErrno);
+	void Request(TInt aFunction, int& anErrno, TRequestStatus& aStatus);
+	RPosixSession iSession;
+	PosixParams iParams;
+	};