Changeset 1800 for Whitix/trunk/net

Show
Ignore:
Timestamp:
01/20/09 23:27:54 (3 years ago)
Author:
mwhitworth
Message:

Update socket code to reflect new file table code, fix connection problems for local sockets, add POLL_ERR case.

Location:
Whitix/trunk/net
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • Whitix/trunk/net/local.c

    r1784 r1800  
    108108        struct LocalSocketAddr* socketAddr=(struct LocalSocketAddr*)addr; 
    109109        struct LocalSocketAddr* serverSockAddr; 
    110         struct LocalSockInfo* serverInfo; 
    111         struct Socket* curr, *serverSock=NULL; 
     110        struct LocalSockInfo* serverInfo, *clientInfo; 
     111        struct Socket* curr, *curr2, *serverSock=NULL; 
    112112 
    113113        /* Can only connect to local sockets. */ 
     
    116116 
    117117        /* Find server socket. */ 
    118         ListForEachEntry(curr, &localListenSockets, next) 
     118        ListForEachEntrySafe(curr, curr2, &localListenSockets, next) 
    119119        { 
    120120                serverSockAddr=(struct LocalSocketAddr*)&curr->addr; 
     
    129129                return -ENOENT; 
    130130 
     131        clientInfo = (struct LocalSockInfo*)(socket->protoInfo); 
     132 
    131133        serverInfo=(struct LocalSockInfo*)(serverSock->protoInfo); 
    132134        socket->state=SOCKET_STATE_WAITING; 
     
    140142        WakeUp(&serverInfo->waitQueue); 
    141143 
    142         while (socket->state != SOCKET_STATE_CONNECTED) /* FIXME: or socket state is error. */ 
    143                 ThrSchedule(); 
     144        WAIT_ON(&clientInfo->waitQueue, socket->state == SOCKET_STATE_CONNECTED); 
    144145                 
    145146        return 0; 
     
    200201        struct Socket* client, *child; 
    201202        struct LocalSockInfo* info=(struct LocalSockInfo*)(socket->protoInfo); 
     203        struct LocalSockInfo* clientInfo; 
    202204        int ret; 
    203205 
     
    213215        if (ret < 0) 
    214216                return ret; 
    215  
     217         
    216218        if (addr) 
    217219        { 
     
    229231        LocalSetPeer(child, client); 
    230232        LocalSetPeer(client, child); 
     233 
     234        clientInfo = (struct LocalSockInfo*)(client->protoInfo); 
     235        WakeUp(&clientInfo->waitQueue); 
    231236 
    232237        return ret; 
     
    302307                PreemptEnable(); 
    303308        } 
     309         
     310        return pos-orig; 
     311} 
     312 
     313int LocalPoll(struct Socket* socket, struct PollItem* item, struct PollQueue* pollQueue) 
     314{ 
     315        struct LocalSockInfo* info=(struct LocalSockInfo*)(socket->protoInfo); 
     316         
     317        PollAddWait(pollQueue, &info->waitQueue); 
     318         
     319        if ((socket->type & SOCKET_TYPE_SERVER) && !ListEmpty(&info->waitingSocks)) 
     320                item->revents |= POLL_IN; 
    304321                 
    305         return pos-orig; 
    306 } 
    307  
    308 int LocalPoll(struct Socket* socket, struct PollItem* item, struct PollQueue* pollQueue) 
    309 { 
    310         struct LocalSockInfo* info=(struct LocalSockInfo*)(socket->protoInfo); 
    311          
    312         if (((socket->type & SOCKET_TYPE_SERVER && !ListEmpty(&info->waitingSocks)) ||  
    313                         (!(socket->type & SOCKET_TYPE_SERVER) && !ListEmpty(&socket->recvPackets)))) 
    314         { 
    315                 item->revents|=POLL_IN; 
    316         } 
     322        if ((!(socket->type & SOCKET_TYPE_SERVER) && !ListEmpty(&socket->recvPackets))) 
     323                item->revents |= POLL_IN; 
    317324 
    318325        item->revents |= POLL_OUT; 
    319326 
    320         PollAddWait(pollQueue, &info->waitQueue); 
     327        if (!(socket->type & SOCKET_TYPE_SERVER) && !info->peer) 
     328                item->revents |= POLL_ERR; 
    321329 
    322330        return 0; 
  • Whitix/trunk/net/socket.c

    r1784 r1800  
    101101        struct File* file; 
    102102 
    103         file=FileGet(fd); 
    104  
     103        file = FileGet(fd); 
     104         
    105105        if (!file) 
    106106                return NULL; 
     
    126126        struct File* file; 
    127127 
    128         file=FileGet(socket->fd); 
     128        file = FileGet(socket->fd); 
    129129 
    130130        if (UNLIKELY(!file)) 
    131131                return; 
    132  
    133         /* When the VFS allocates a file descriptor to a process, it looks 
    134          * for a NULL vNode pointer in the file structure to indicate a 'free' 
    135          * file structure. */ 
    136         file->vNode=NULL; 
    137132} 
    138133 
     
    228223                return newFd; 
    229224 
    230         newSocket=SOCKET_GET(current->files[newFd].vNode); 
     225        newSocket=SOCKET_GET(current->files[newFd]->vNode); 
    231226        SocketSetupChild(server, newSocket); 
    232227        *child=newSocket; 
     
    306301int SocketCreateFile(struct File* file, struct Socket* socket) 
    307302{ 
    308         file->vNode=VNodeGetEmpty(); 
    309         file->fileOps=file->vNode->fileOps=&sockFileOps; 
    310         file->vNode->extraInfo=(void*)socket; 
    311         file->vNode->superBlock=&socketSuperBlock; 
     303        file->vNode = VNodeGetEmpty(); 
     304        file->fileOps = file->vNode->fileOps=&sockFileOps; 
     305        file->vNode->extraInfo = (void*)socket; 
     306        file->vNode->superBlock = &socketSuperBlock; 
    312307 
    313308        return 0; 
     
    329324                return -ENOMEM; 
    330325 
    331         sockFd=VfsGetFreeFd(current); 
     326        sockFd = VfsGetFreeFd(current); 
    332327 
    333328        if (sockFd < 0) 
    334329                return sockFd; 
    335  
    336         SocketCreateFile(&current->files[sockFd], socket); 
     330                 
     331        current->files[sockFd] = FileAllocate(); 
     332 
     333        SocketCreateFile(current->files[sockFd], socket); 
    337334 
    338335        return sockFd; 
     
    367364        struct Socket* socket; 
    368365 
    369         socket=SocketGet(fd); 
     366        socket = SocketGet(fd); 
    370367 
    371368        if (!socket)