int Dps_ftp_open_data_port( DPS_CONN *c, DPS_CONN *d){ char buf[64]; unsigned char *a, *p; int code; if (!d) return -1; if (socket_getname(c, &d->sin) == -1) return -1; if (d->port) { d->sin.sin_port = htons(d->port); } if (socket_open(d)) return -1; if (socket_listen(d)){ return -1; } if (socket_getname(d, &d->sin) == -1){ return -1; } a = (unsigned char *)&d->sin.sin_addr; p = (unsigned char *)&d->sin.sin_port; dps_snprintf(buf, 64, "PORT %d,%d,%d,%d,%d,%d", a[0], a[1], a[2], a[3], p[0], p[1]); code = Dps_ftp_send_cmd(c, buf); if ((code < 0) || strncasecmp(c->buf, "200 ", 4)){ return -1; } d->user = c->user; d->pass = c->pass; return 0; }
int socket_listen(UDM_CONN *connp){ connp->sin.sin_port = 0; if (bind(connp->conn_fd, (struct sockaddr *)&connp->sin, sizeof(struct sockaddr_in)) == -1){ connp->err = UDM_NET_ERROR; return -1; } if (socket_getname(connp, &connp->sin) == -1) return -1; if (listen(connp->conn_fd, 1) == -1){ connp->err = UDM_NET_ERROR; return -1; } return 0; }