/*    /lib/net/socket.c
 *    From the Dead Souls Object Library
 *    Handles individual socket I/O
 *    Created by Descartes of Borg 961218
 *    Version: @(#) socket.c 1.1@(#)
 *    Last modified: 96/12/19
 */
#include <lib.h>
inherit LIB_DAEMON;
private static int    Descriptor = -1;
private static object Owner      = 0;
/* *********************** socket.c attributes ********************* */
string GetAddress() {
    return socket_address(Descriptor);
}
int GetDescriptor() {
    return Descriptor;
}
/* ************************* socket.c events *********************** */
static int eventCloseSocket() {
    if(!Owner) return 0;
    Owner->eventClose(this_object());
}
int eventRead(mixed data) {
    if( previous_object() != Owner ) {
        return 0;
    }
    return 1;
}
int eventDestruct(){
    return daemon::eventDestruct();
}
int eventSocketClosed() {
    if(!Owner || previous_object() != Owner ) {
        return 0;
    }
    eventDestruct();
    return 1;
}
varargs static int eventWrite(mixed data, int close) {
    if(!close) close = 0;
    if(!data) data = ({});
    if(Owner && this_object()) return Owner->eventWrite(this_object(), data, close);
    else return 0;
}
/* ******************** socket.c driver applies ****************** */
static void create(int fd, object owner) {
    daemon::create();
    SetNoClean(1);
    Descriptor = fd;
    Owner = owner;
}