int socket_read_line( DPS_CONN *connp ){ size_t num_read_total, buf_size; buf_size = DPS_NET_BUF_SIZE; num_read_total = 0; if (connp->buf) DPS_FREE(connp->buf); connp->buf_len_total = 0; connp->buf_len = 0; while(1){ if (connp->buf_len_total <= num_read_total+DPS_NET_BUF_SIZE) { connp->buf_len_total += DPS_NET_BUF_SIZE; connp->buf = DpsXrealloc(connp->buf, (size_t)(connp->buf_len_total +1)); if (connp->buf == NULL) return -1; } /* if(!recv(connp->conn_fd,&(connp->buf[num_read_total]),1,0)) return -1;*/ if(read(connp->conn_fd, &(connp->buf[num_read_total]), 1) <= 0) return -1; if (connp->buf[num_read_total] == NL_CHAR) break; else if (connp->buf[num_read_total] == 0) break; num_read_total++; } connp->buf_len = dps_strlen(connp->buf); return num_read_total; }
int Dps_ftp_connect(DPS_AGENT *Agent, DPS_CONN *connp, char *hostname, int port, char *user, char *passwd, int timeout) { size_t len; if (!connp) return -1; if (connp->connected == DPS_NET_CONNECTED) Dps_ftp_close(connp); connp->connected = DPS_NET_NOTCONNECTED; if (!port) { connp->port = 21; connp->connp->port = 20; } else { connp->port = port; connp->connp->port = port - 1; } connp->timeout = timeout; if (!hostname) return -1; len = dps_strlen(hostname); connp->hostname = DpsXrealloc(connp->hostname, len+1); if (connp->hostname == NULL) return -1; dps_snprintf(connp->hostname, len+1, "%s", hostname); if (Dps_ftp_open_control_port(Agent, connp)) return -1; if (Dps_ftp_login(connp, user, passwd)) return -1; Dps_ftp_set_binary(connp); connp->connected = DPS_NET_CONNECTED; return 0; }
int DpsSpellAdd(DPS_SPELLLIST *List, const dpsunicode_t *word, const char *flag, const char *lang) { if(List->nspell>=List->mspell){ List->mspell += 1024; /* was: 1024 * 20 */ List->Spell=(DPS_SPELL *)DpsXrealloc(List->Spell,List->mspell*sizeof(DPS_SPELL)); if (List->Spell == NULL) return DPS_ERROR; } List->Spell[List->nspell].word = DpsUniRDup(word); dps_strncpy(List->Spell[List->nspell].flag,flag,10); dps_strncpy(List->Spell[List->nspell].lang,lang,5); List->Spell[List->nspell].lang[5] = List->Spell[List->nspell].flag[10] = '\0'; List->nspell++; return DPS_OK; }
int socket_read( DPS_CONN *connp, size_t maxsize){ int num_read; size_t num_read_total; time_t t; num_read_total = 0; if (connp->buf) DPS_FREE(connp->buf); connp->buf_len_total = 0; connp->buf_len = 0; connp->err = 0; t = time(NULL); do { if (socket_select(connp, connp->timeout, 'r') == -1){ return -1; } if (connp->buf_len_total <= num_read_total+DPS_NET_BUF_SIZE){ connp->buf_len_total += DPS_NET_BUF_SIZE; connp->buf = DpsXrealloc(connp->buf, (size_t)(connp->buf_len_total+1)); if (connp->buf == NULL) return -1; } /* num_read = recv(connp->conn_fd, connp->buf + num_read_total, (DPS_NET_BUF_SIZE <= maxsize - num_read_total) ? DPS_NET_BUF_SIZE : (maxsize - num_read_total), 0);*/ num_read = read(connp->conn_fd, connp->buf + num_read_total, (DPS_NET_BUF_SIZE <= maxsize - num_read_total) ? DPS_NET_BUF_SIZE : (maxsize - num_read_total) ); num_read_total += num_read; if (num_read < 0){ connp->err = DPS_NET_ERROR; return -1; }else if (num_read == 0) { if ((size_t)(time(NULL) - t) > connp->timeout) break; } else t = time(NULL); if (num_read_total >=maxsize ){ connp->err = DPS_NET_FILE_TL; break; } }while (num_read!=0); connp->buf_len = num_read_total; return num_read_total; }
static int ftp_parse_list(DPS_CONN *connp, char *path){ char *line, *buf_in, *ch, *buf_out, *tok, *fname; int len_h, len_f,len_p, i; char *dir, savec; size_t len,buf_len,cur_len; if (!connp->buf || !connp->buf_len) return 0; buf_in = connp->buf; /* 22 = dps_strlen(<a href=\"ftp://%s%s%s/\"></a>)*/ len_h = dps_strlen(connp->hostname) + ((connp->user) ? dps_strlen(connp->user) : 0) + ((connp->pass) ? dps_strlen(connp->pass) : 0) + 2 + 22; len_p = dps_strlen(path); cur_len = 0; buf_len = connp->buf_len; buf_out = DpsXmalloc(buf_len + 1); if (buf_out == NULL) return -1; buf_out[0] = '\0'; line = dps_strtok_r(buf_in, "\r\n", &tok, &savec); do{ if (!(fname = strtok(line, " "))) continue; /* drwxrwxrwx x user group size month date time file_name */ for(i=0; i<7; i++) if (!(fname = strtok(NULL, " "))) break; if (!(fname = strtok(NULL, ""))) continue; len = 0 ; len_f = len_h + len_p + dps_strlen(fname); if ((cur_len+len_f) >= buf_len){ buf_len += DPS_NET_BUF_SIZE; buf_out = DpsXrealloc(buf_out, buf_len + 1); } switch (line[0]){ case 'd': if (!fname || !strcmp(fname, ".") || !strcmp(fname, "..")) break; len = len_f; dps_snprintf(DPS_STREND(buf_out) /*buf_out+cur_len*/, len+1, "<a href=\"ftp://%s%s%s%s%s/%s%s/\"></a>\n", (connp->user) ? connp->user : "", (connp->user) ? ":" : "", (connp->pass) ? connp->pass : "", (connp->user || connp->pass) ? "@" : "", connp->hostname, path, fname); break; case 'l': ch = strstr (fname, " -> "); if (!ch) break; len = ch - fname; dir = DpsMalloc(len+1); if (dir == NULL) return -1; dps_snprintf(dir, len+1, "%s", fname); len = len_h + len_p + dps_strlen(dir); dps_snprintf(DPS_STREND(buf_out)/*buf_out+cur_len*/, len+1, "<a href=\"ftp://%s%s%s%s%s/%s%s/\"></a>\n", (connp->user) ? connp->user : "", (connp->user) ? ":" : "", (connp->pass) ? connp->pass : "", (connp->user || connp->pass) ? "@" : "", connp->hostname, path, dir); DPS_FREE(dir); /*ch +=4;*/ /* Check if it is absolute link */ /* if ((ch[0] == '/') || (ch[0] == '\\') || ((isalpha(ch[0]) && (ch[1]==':')))){ len = len_h+dps_strlen(ch); dps_snprintf(buf_out+cur_len, len+1, "<a href=\"ftp://%s%s/\"></a>", connp->hostname, ch); }else{ len = len_h+len_p+dps_strlen(ch); dps_snprintf(buf_out+cur_len, len+1, "<a href=\"ftp://%s%s%s/\"></a>", connp->hostname, path, ch); } */ break; case '-': len = len_f; dps_snprintf(DPS_STREND(buf_out)/*buf_out+cur_len*/, len+1, "<a href=\"ftp://%s%s%s%s%s/%s%s\"></a>\n", (connp->user) ? connp->user : "", (connp->user) ? ":" : "", (connp->pass) ? connp->pass : "", (connp->user || connp->pass) ? "@" : "", connp->hostname, path, fname); break; } cur_len += len; }while( (line = dps_strtok_r(NULL, "\r\n", &tok, &savec))); if (cur_len+1 > connp->buf_len_total){ connp->buf_len_total = cur_len; connp->buf = DpsXrealloc(connp->buf, (size_t)connp->buf_len_total+1); if (connp->buf == NULL) return -1; } bzero(connp->buf, ((size_t)connp->buf_len_total+1)); dps_memmove(connp->buf, buf_out, cur_len); DPS_FREE(buf_out); return 0; }