/* * HP-UX 8/9.01 strcat reads a word past source when doing unaligned copies! * Work around it here. The bug report has been filed with HP. */ char *strcat(char *d, const char *s) { dps_strcpy(d + dps_strlen(d), s); return d; }
char * DpsURLNormalizePath(char * str){ char * s=str; char * q; char * d; /* Hide query string */ if((q=strchr(s,'?'))){ *q++='\0'; if(!*q)q=NULL; } /* Remove all "/../" entries */ while((d=strstr(str,"/../"))){ char * p; if(d>str){ /* Skip non-slashes */ for(p=d-1;(*p!='/')&&(p>str);p--); /* Skip slashes */ while((p>(str+1))&&(*(p-1)=='/'))p--; }else{ /* We are at the top level and have ../ */ /* Remove it too to avoid loops */ p=str; } dps_memmove(p,d+3,dps_strlen(d)-2); } /* Remove remove trailig "/.." */ d=str+dps_strlen(str); if((d-str>2)&&(!strcmp(d-3,"/.."))){ d-=4; while((d>str)&&(*d!='/'))d--; if(*d=='/')d[1]='\0'; else dps_strcpy(str,"/"); } /* Remove all "/./" entries */ while((d=strstr(str,"/./"))){ dps_memmove(d,d+2,dps_strlen(d)-1); } /* Remove the trailing "/." */ if((d=str+dps_strlen(str))>(str+2)) if(!strcmp(d-2,"/.")) *(d-1)='\0'; /* Remove all "//" entries */ while((d=strstr(str,"//"))){ dps_memmove(d,d+1,dps_strlen(d)); } /* Replace "%7E" with "~" */ /* Actually it is to be done */ /* for all valid characters */ /* which do not require escaping */ /* However I'm lazy, do it for 7E */ /* as the most often "abused" */ while((d=strstr(str,"%7E"))){ *d='~'; dps_memmove(d+1,d+3,dps_strlen(d+3)+1); } /* Restore query string */ if(q){ char * e=str+dps_strlen(str); *e='?'; dps_memmove(e+1,q,dps_strlen(q)+1); } return str; }
void RelLink(DPS_AGENT *Indexer, DPS_URL *curURL, DPS_URL *newURL, char **str, int ReverseAliasFlag) { const char *schema = newURL->schema ? newURL->schema : curURL->schema; const char *hostname = newURL->hostname ? newURL->hostname : curURL->hostname; const char *auth = newURL->auth ? newURL->auth : curURL->auth; const char *path = (newURL->path && newURL->path[0]) ? newURL->path : curURL->path; const char *fname = ((newURL->filename && newURL->filename[0]) || (newURL->path && newURL->path[0])) ? newURL->filename : curURL->filename; const char *query_string = newURL->query_string; char *pathfile = (char*)DpsMalloc(dps_strlen(DPS_NULL2EMPTY(path)) + dps_strlen(DPS_NULL2EMPTY(fname)) + dps_strlen(DPS_NULL2EMPTY(query_string)) + 5); int cascade; DPS_MATCH *Alias; char *alias = NULL; size_t aliassize, nparts = 10; DPS_MATCH_PART Parts[10]; if (newURL->hostinfo == NULL) newURL->charset_id = curURL->charset_id; if (pathfile == NULL) return; /* sprintf(pathfile, "/%s%s%s", DPS_NULL2EMPTY(path), DPS_NULL2EMPTY(fname), DPS_NULL2EMPTY(query_string));*/ pathfile[0] = '/'; dps_strcpy(pathfile + 1, DPS_NULL2EMPTY(path)); dps_strcat(pathfile, DPS_NULL2EMPTY(fname)); dps_strcat(pathfile, DPS_NULL2EMPTY(query_string)); DpsURLNormalizePath(pathfile); if (!strcasecmp(DPS_NULL2EMPTY(schema), "mailto") || !strcasecmp(DPS_NULL2EMPTY(schema), "javascript") || !strcasecmp(DPS_NULL2EMPTY(schema), "feed") ) { *str = (char*)DpsMalloc(dps_strlen(DPS_NULL2EMPTY(schema)) + dps_strlen(DPS_NULL2EMPTY(newURL->specific)) + 4); if (*str == NULL) return; /* sprintf(*str, "%s:%s", DPS_NULL2EMPTY(schema), DPS_NULL2EMPTY(newURL->specific));*/ dps_strcpy(*str, DPS_NULL2EMPTY(schema)); dps_strcat(*str, ":"); dps_strcat(*str, DPS_NULL2EMPTY(newURL->specific)); } else if(/*!strcasecmp(DPS_NULL2EMPTY(schema), "file") ||*/ !strcasecmp(DPS_NULL2EMPTY(schema), "htdb")) { *str = (char*)DpsMalloc(dps_strlen(DPS_NULL2EMPTY(schema)) + dps_strlen(pathfile) + 4); if (*str == NULL) return; /* sprintf(*str, "%s:%s", DPS_NULL2EMPTY(schema), pathfile);*/ dps_strcpy(*str, DPS_NULL2EMPTY(schema)); dps_strcat(*str, ":"); dps_strcat(*str, pathfile); }else{ *str = (char*)DpsMalloc(dps_strlen(DPS_NULL2EMPTY(schema)) + dps_strlen(pathfile) + dps_strlen(DPS_NULL2EMPTY(hostname)) + dps_strlen(DPS_NULL2EMPTY(auth)) + 8); if (*str == NULL) return; /* sprintf(*str, "%s://%s%s", DPS_NULL2EMPTY(schema), DPS_NULL2EMPTY(hostinfo), pathfile);*/ dps_strcpy(*str, DPS_NULL2EMPTY(schema)); dps_strcat(*str, "://"); if (auth) { dps_strcat(*str, auth); dps_strcat(*str,"@"); } dps_strcat(*str, DPS_NULL2EMPTY(hostname)); dps_strcat(*str, pathfile); } if(!strncmp(*str, "ftp://", 6) && (strstr(*str, ";type="))) *(strstr(*str, ";type")) = '\0'; DPS_FREE(pathfile); if (ReverseAliasFlag) { const char *alias_prog = DpsVarListFindStr(&Indexer->Vars, "ReverseAliasProg", NULL); if (alias_prog) { int result; aliassize = 256 + 2 * dps_strlen(*str); alias = (char*)DpsRealloc(alias, aliassize); if (alias == NULL) { DpsLog(Indexer, DPS_LOG_ERROR, "No memory (%d bytes). %s line %d", aliassize, __FILE__, __LINE__); goto ret; } alias[0] = '\0'; result = DpsAliasProg(Indexer, alias_prog, *str, alias, aliassize - 1); DpsLog(Indexer, DPS_LOG_EXTRA, "ReverseAliasProg result: '%s'", alias); if(result != DPS_OK) goto ret; DPS_FREE(*str); *str = (char*)DpsStrdup(alias); } for(cascade = 0; ((Alias=DpsMatchListFind(&Indexer->Conf->ReverseAliases,*str,nparts,Parts))) && (cascade < 1024); cascade++) { aliassize = dps_strlen(Alias->arg) + dps_strlen(Alias->pattern) + dps_strlen(*str) + 128; alias = (char*)DpsRealloc(alias, aliassize); if (alias == NULL) { DpsLog(Indexer, DPS_LOG_ERROR, "No memory (%d bytes). %s line %d", aliassize, __FILE__, __LINE__); goto ret; } DpsMatchApply(alias,aliassize,*str,Alias->arg,Alias,nparts,Parts); if(alias[0]){ DpsLog(Indexer,DPS_LOG_DEBUG,"ReverseAlias%d: pattern:%s, arg:%s -> '%s'", cascade, Alias->pattern, Alias->arg, alias); DPS_FREE(*str); *str = (char*)DpsStrdup(alias); } else break; if (Alias->last) break; } } ret: DPS_FREE(alias); }
int __DPSCALL DpsSearchdCatAction(DPS_AGENT *A, DPS_CATEGORY *C, int cmd, void *db) { DPS_DB *searchd = db; DPS_SEARCHD_PACKET_HEADER hdr; char *buf; ssize_t nsent, nrecv; int done = 0; int rc=DPS_OK; char *msg = NULL; char *dinfo = NULL; TRACE_IN(A, "DpsSearchdCatAction"); hdr.cmd = DPS_SEARCHD_CMD_CATINFO; hdr.len = sizeof(int) + dps_strlen(C->addr) + 1; if ((buf = (char*)DpsMalloc(hdr.len + 1)) == NULL) { DpsLog(A, DPS_LOG_ERROR, "Out of memory"); TRACE_OUT(A); return DPS_ERROR; } *((int*)buf) = cmd; dps_strcpy(buf + sizeof(int), C->addr); nsent = DpsSearchdSendPacket(searchd->searchd, &hdr, buf); DPS_FREE(buf); while(!done) { char * tok, * lt; nrecv = DpsRecvall(searchd->searchd, &hdr, sizeof(hdr), 360); if(nrecv != sizeof(hdr)){ DpsLog(A, DPS_LOG_ERROR, "Received incomplete header from searchd (%d bytes)", (int)nrecv); TRACE_OUT(A); return(DPS_ERROR); }else{ #ifdef DEBUG_SDP DpsLog(A, DPS_LOG_ERROR, "Received header cmd=%d len=%d\n", hdr.cmd, hdr.len); #endif } switch(hdr.cmd){ case DPS_SEARCHD_CMD_ERROR: msg = (char*)DpsMalloc(hdr.len + 1); if (msg == NULL) { done=1; break; } nrecv = DpsRecvall(searchd->searchd, msg, hdr.len, 360); msg[(nrecv >= 0) ? nrecv : 0 ] = '\0'; sprintf(A->Conf->errstr, "Searchd error: '%s'", msg); rc=DPS_ERROR; DPS_FREE(msg); done=1; break; case DPS_SEARCHD_CMD_MESSAGE: msg=(char*)DpsMalloc(hdr.len+1); if (msg == NULL) { done=1; break; } nrecv = DpsRecvall(searchd->searchd, msg, hdr.len, 360); msg[(nrecv >= 0) ? nrecv : 0] = '\0'; #ifdef DEBUG_SDP DpsLog(A, DPS_LOG_ERROR, "Message from searchd: '%s'\n",msg); #endif DPS_FREE(msg); break; case DPS_SEARCHD_CMD_CATINFO: dinfo=(char*)DpsMalloc(hdr.len+1); if (dinfo == NULL) { done=1; break; } nrecv = DpsRecvall(searchd->searchd, dinfo, hdr.len, 360); dinfo[(nrecv >= 0) ? nrecv : 0] = '\0'; #ifdef DEBUG_SDP DpsLog(A, DPS_LOG_ERROR, "Received CATINFO size=%d buf=%s\n",hdr.len,dinfo); #endif C->ncategories = 0; tok = dps_strtok_r(dinfo, "\r\n", <, NULL); while(tok){ DpsCatFromTextBuf(C, tok); tok = dps_strtok_r(NULL, "\r\n", <, NULL); } DPS_FREE(dinfo); done=1; break; default: sprintf(A->Conf->errstr, "Unknown searchd response: cmd=%d len=%d", hdr.cmd, hdr.len); rc=DPS_ERROR; done = 1; break; } } TRACE_OUT(A); return rc; }