// Copyright (c) 1999-2000 David Muse
// See the COPYING file for more information.

#ifndef SHAREDMEMORY_H
#define SHAREDMEMORY_H

#include <pwd.h>
#include <grp.h>
#include <sys/types.h>

// Shared memory segments allow multiple processes to access a common
// address space.
//
// Shared memory can be used for interprocess communication and is generally
// faster than using fifo's or unix sockets.
//
// To synchronize access to shared memory, use the semaphoreset class.
//
// A shared memory segment is owned by a user and group and has access 
// permissions just like a file.

class sharedmemory {
        public:
                        sharedmemory(key_t key, int size, mode_t permissions);
                                // Creates and attaches to a shared memory 
                                //      segment of "size" bytes, identified by
                                //      "key".
                                // "key" should be generated using the ftok
                                //      function.
                                // In the event that a segment identified by
                                //      "key" already exists, the process
                                //      just attaches to it.
                                // "permissions" sets the access permissions
                                //      for the segment.
                virtual ~sharedmemory();

                void    *getPointer();
                        // Returns a pointer to the shared memory
                        // segment.  Data may be read from or written
                        // to the segment using this pointer.

                int     setUserName(char *username);
                        // makes this shared memory segment owned by
                        // the user "username"
                int     setGroupName(char *groupname);
                        // makes this shared memory segment owned by
                        // the group "groupname"
                int     setUserId(ushort uid);
                        // makes this shared memory segment owned by
                        // the user identified by uid
                int     setGroupId(ushort gid);
                        // makes this shared memory segment owned by
                        // the group identified by gid
                int     setPermissions(mode_t permissions);
                        // sets the access permissions for this
                        // shared memory segment to "permissions"

                char    *getUserName();
                        // returns the name of the user that owns this
                        // shared memory segment
                char    *getGroupName();
                        // returns the name of the group that owns this
                        // shared memory segment
                ushort  getUserId();
                        // returns the user id of the user that owns this
                        // shared memory segment
                ushort  getGroupId();
                        // returns the group id of the group that owns this
                        // shared memory segment
                mode_t  getPermissions();
                        // returns the access permissions for this
                        // shared memory segment

        private:
                #include <private/sharedmemory.h>

};

#endif