]> andersk Git - libfaim.git/blobdiff - src/ft.c
- Wed Oct 3 11:07:22 PDT 2001
[libfaim.git] / src / ft.c
index 0ab1140b54c2b12995740cb0ab3480eac492c433..e85ac242e3e6e9df5dfd56f8927eeeb76c992e69 100644 (file)
--- a/src/ft.c
+++ b/src/ft.c
    o look for memory leaks.. there's going to be shitloads, i'm sure. 
 */
 
+struct aim_directim_intdata {
+       fu8_t cookie[8];
+       char sn[MAXSNLEN+1];
+       char ip[22];
+};
+
 static int listenestablish(fu16_t portnum);
 static struct aim_fileheader_t *aim_oft_getfh(unsigned char *hdr);
  
 /**
- * aim_handlerendconnect - call this to accept OFT connections and set up the requisite structures
+ * aim_handlerendconnect - call this to accept OFT connections and set up the required structures
  * @sess: the session
  * @cur: the conn the incoming connection is on
  *
@@ -308,10 +314,11 @@ faim_export aim_conn_t *aim_directim_initiate(aim_session_t *sess, aim_conn_t *c
        memcpy(cookie->cookie, ck, 8);
        cookie->type = AIM_COOKIETYPE_OFTIM;
 
+       /* this one is for the cookie */
        priv = (struct aim_directim_intdata *)calloc(1, sizeof(struct aim_directim_intdata));
 
        memcpy(priv->cookie, ck, 8);
-       memcpy(priv->sn, destsn, sizeof(priv->sn));
+       strncpy(priv->sn, destsn, sizeof(priv->sn));
        cookie->data = priv;
        aim_cachecookie(sess, cookie);
 
@@ -325,7 +332,7 @@ faim_export aim_conn_t *aim_directim_initiate(aim_session_t *sess, aim_conn_t *c
        priv = (struct aim_directim_intdata *)calloc(1, sizeof(struct aim_directim_intdata));
 
        memcpy(priv->cookie, ck, 8);
-       memcpy(priv->sn, destsn, sizeof(priv->sn));
+       strncpy(priv->sn, destsn, sizeof(priv->sn));
 
        newconn->fd = listenfd;
        newconn->subtype = AIM_CONN_SUBTYPE_OFT_DIRECTIM;
@@ -415,7 +422,8 @@ faim_export aim_conn_t *aim_directim_connect(aim_session_t *sess, const char *sn
 
        memcpy(intdata->cookie, cookie, 8);
        strncpy(intdata->sn, sn, sizeof(intdata->sn));
-       strncpy(intdata->ip, addr, sizeof(intdata->ip));
+       if (addr)
+               strncpy(intdata->ip, addr, sizeof(intdata->ip));
 
        /* XXX verify that non-blocking connects actually work */
        if (!(newconn = aim_newconn(sess, AIM_CONN_TYPE_RENDEZVOUS, addr))) {
@@ -423,7 +431,7 @@ faim_export aim_conn_t *aim_directim_connect(aim_session_t *sess, const char *sn
                return NULL;
        }
 
-       if (!newconn || (newconn->fd == -1)) {
+       if (!newconn) {
                free(intdata);
                return newconn;
        }
@@ -817,7 +825,7 @@ static int listenestablish(fu16_t portnum)
                return -1;
        }
 
-       if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on) != 0)) {
+       if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) != 0) {
                perror("setsockopt(listenfd)");
                close(listenfd);
                return -1;
@@ -916,56 +924,91 @@ static int getcommand_getfile(aim_session_t *sess, aim_conn_t *conn)
 #endif
 }
 
-static void disconnected_sendfile(aim_session_t *sess, aim_conn_t *conn)
+static void connclose_sendfile(aim_session_t *sess, aim_conn_t *conn)
 {
-       aim_frame_t fr;
-       aim_rxcallback_t userfunc;
        aim_msgcookie_t *cook;
        struct aim_filetransfer_priv *priv = (struct aim_filetransfer_priv *)conn->priv;
 
        cook = aim_uncachecookie(sess, priv->cookie, AIM_COOKIETYPE_OFTSEND);
        aim_cookie_free(sess, cook);
 
-       fr.conn = conn;
+       return;
+}
 
-       if ( (userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_SENDFILEDISCONNECT)) ) 
-               userfunc(sess, &fr, priv->sn);
+static void connkill_sendfile(aim_session_t *sess, aim_conn_t *conn)
+{
+       
+       free(conn->internal);
 
        return;
 }
 
-static void disconnected_getfile(aim_session_t *sess, aim_conn_t *conn)
+static void connclose_getfile(aim_session_t *sess, aim_conn_t *conn)
 {
-       aim_frame_t fr;
-       aim_rxcallback_t userfunc;
        aim_msgcookie_t *cook;
        struct aim_filetransfer_priv *priv = (struct aim_filetransfer_priv *)conn->priv;
 
        cook = aim_uncachecookie(sess, priv->cookie, AIM_COOKIETYPE_OFTGET);
        aim_cookie_free(sess, cook);
 
-       fr.conn = conn;
+       return;
+}
 
-       if ( (userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEDISCONNECT)) )
-               userfunc(sess, &fr, priv->sn);
+static void connkill_getfile(aim_session_t *sess, aim_conn_t *conn)
+{
+       
+       free(conn->internal);
 
        return;
 }
 
-static void disconnected_directim(aim_session_t *sess, aim_conn_t *conn)
+static void connclose_directim(aim_session_t *sess, aim_conn_t *conn)
 {
-       aim_frame_t fr;
        struct aim_directim_intdata *intdata = (struct aim_directim_intdata *)conn->internal;
-       aim_rxcallback_t userfunc;
        aim_msgcookie_t *cook;
 
        cook = aim_uncachecookie(sess, intdata->cookie, AIM_COOKIETYPE_OFTIM);
        aim_cookie_free(sess, cook);
 
-       fr.conn = conn;
+       return;
+}
+
+static void connkill_directim(aim_session_t *sess, aim_conn_t *conn)
+{
+       
+       free(conn->internal);
+
+       return;
+}
+
+faim_internal void aim_conn_close_rend(aim_session_t *sess, aim_conn_t *conn)
+{
 
-       if ( (userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMDISCONNECT)) )
-               userfunc(sess, &fr, intdata->sn);
+       if (conn->type != AIM_CONN_TYPE_RENDEZVOUS)
+               return;
+
+       if (conn->subtype == AIM_CONN_SUBTYPE_OFT_SENDFILE)
+               connclose_sendfile(sess, conn);
+       else if (conn->subtype == AIM_CONN_SUBTYPE_OFT_GETFILE)
+               connclose_getfile(sess, conn);
+       else if (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM)
+               connclose_directim(sess, conn);
+
+       return;
+}
+
+faim_internal void aim_conn_kill_rend(aim_session_t *sess, aim_conn_t *conn)
+{
+
+       if (conn->type != AIM_CONN_TYPE_RENDEZVOUS)
+               return;
+
+       if (conn->subtype == AIM_CONN_SUBTYPE_OFT_SENDFILE)
+               connkill_sendfile(sess, conn);
+       else if (conn->subtype == AIM_CONN_SUBTYPE_OFT_GETFILE)
+               connkill_getfile(sess, conn);
+       else if (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM)
+               connkill_directim(sess, conn);
 
        return;
 }
@@ -1335,13 +1378,6 @@ faim_internal int aim_get_command_rendezvous(aim_session_t *sess, aim_conn_t *co
 
                faimdprintf(sess, 2, "faim: rend: read error (fd: %i)\n", conn->fd);
 
-               if (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM)
-                       disconnected_directim(sess, conn);
-               else if (conn->subtype == AIM_CONN_SUBTYPE_OFT_GETFILE)
-                       disconnected_getfile(sess, conn);
-               else if (conn->subtype == AIM_CONN_SUBTYPE_OFT_SENDFILE)
-                       disconnected_sendfile(sess, conn);
-
                aim_conn_close(conn);
 
                return -1;
This page took 0.109886 seconds and 4 git commands to generate.