]> rtime.felk.cvut.cz Git - frescor/fwp.git/blobdiff - fwp/lib/fwp/fwp_endpoint.c
Handle errors correctly in fwp_send_async()
[frescor/fwp.git] / fwp / lib / fwp / fwp_endpoint.c
index 93756afc15a62bc914b8c967d6e11248071d7f23..6117d6ceae0f7812cbb4e701ec9aea705a99e7f2 100644 (file)
@@ -179,7 +179,7 @@ int fwp_endpoint_attr_init(fwp_endpoint_attr_t *attr)
  * \param[in] attr Endpoint attributes
  * \param[out] epp  Pointer to the descriptor of newly created endpoint
  *
- * \return Zero on success, -1 on error and sets errno appropriately. 
+ * \return Non-negative number on success, -1 on error and sets errno appropriately. 
  *
  */
 int fwp_send_endpoint_create(unsigned int node,
@@ -241,13 +241,15 @@ int fwp_send_endpoint_create(unsigned int node,
                        goto err;
        }
 
+#if 0
+       /* TODO: Allow using connect if it is specified in attr */
        if (connect(fwp_epoint->sockd,
                        (struct sockaddr*) &fwp_epoint->peer.addr, 
                        fwp_epoint->peer.addrlen)) {
                FWP_DEBUG("FWp connect error\n"); 
                goto err;
        }
-       
+#endif
        FWP_DEBUG("FWP Send endpoint created.\n"); 
 
 #ifdef FWP_WITHOUT_CONTNEGT
@@ -274,7 +276,7 @@ err:
  * \param[in] attr Endpoint attributes
  * \param[out] epointdp  Pointer to the descriptor of newly created endpoint
  *
- * \return Zero on success, -1 on error and errno is set.
+ * \return Non-negative number on success, -1 on error and errno is set.
  */
 int fwp_receive_endpoint_create(unsigned int port,
                                fwp_endpoint_attr_t *attr,
@@ -375,10 +377,10 @@ int fwp_receive_endpoint_create(unsigned int port,
        fwp_epoint->port = ntohs(addr->sin_port);
        FWP_DEBUG("Recv port= %d\n",ntohs(addr->sin_port));     
        *epp = fwp_epoint;
-       return 0;
+       return fwp_epoint->sockd;
 err:
        fwp_endpoint_destroy(fwp_epoint);
-       return errno;
+       return -1;
 }
 
 /**
@@ -487,9 +489,9 @@ int fwp_recv_conn(struct fwp_endpoint *ep, void *buffer,
                        
                FWP_DEBUG("Prepare to receive tcp data\n");
                peer->addrlen = sizeof(struct sockaddr_in);
-               len = _fwp_recvfrom(ep->c_sockd[i], buffer, 
-                                       buffer_size,0, peer);
 
+               len = recvfrom(ep->c_sockd[i], buffer, buffer_size, 0,
+                              (struct sockaddr*)&peer->addr, &peer->addrlen);
                if (len < 0) /* Error */
                        return len;
                
@@ -535,9 +537,8 @@ ssize_t fwp_recv(struct fwp_endpoint *ep,
        }*/
        
        if (ep->attr.reliability == FWP_EPOINT_BESTEFFORT) {    
-               len = _fwp_recvfrom(ep->sockd, buffer, 
-                                       buffer_size, 0, peer);
-               
+               len = recvfrom(ep->sockd, buffer, buffer_size, 0,
+                              (struct sockaddr*)&peer->addr, &peer->addrlen);
                *from = addr->sin_addr.s_addr;
                return len;
        }
@@ -588,6 +589,8 @@ ssize_t fwp_endpoint_do_send(struct fwp_endpoint *ep,
        iov.iov_base = (void*)data;
        iov.iov_len = size;
 
+       msg.msg_name = &ep->peer.addr;
+       msg.msg_namelen = ep->peer.addrlen;
        msg.msg_iov = &iov;
        msg.msg_iovlen = 1;
 
@@ -632,9 +635,10 @@ int fwp_send_async(struct fwp_endpoint *ep, const void *msg, size_t size)
        if (!ep->vres)
                return FRSH_ERR_NOT_BOUND;
 
-       if (fwp_vres_consume_budget(ep->vres, size, false) == 0)
+       ret = fwp_vres_consume_budget(ep->vres, size, false);
+       if (ret == 0)
                ret = fwp_endpoint_do_send(ep, msg, size);
-       else
+       else if (ret == 1)
                ret = fwp_vres_enqueue(ep->vres, ep, msg, size);
        return ret;
 }