summaryrefslogtreecommitdiff
path: root/ext/hyperwave/hg_comm.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/hyperwave/hg_comm.c')
-rw-r--r--ext/hyperwave/hg_comm.c798
1 files changed, 476 insertions, 322 deletions
diff --git a/ext/hyperwave/hg_comm.c b/ext/hyperwave/hg_comm.c
index dcb300de60..812511d4ee 100644
--- a/ext/hyperwave/hg_comm.c
+++ b/ext/hyperwave/hg_comm.c
@@ -21,12 +21,9 @@
/* #define HW_DEBUG */
#include <stdlib.h>
-
-#if WIN32|WINNT
-#include "win95nt.h"
-#else
-#include "php_config.h"
-#endif
+#include "php.h"
+#include "php_globals.h"
+#include "SAPI.h"
#if HYPERWAVE
@@ -51,8 +48,7 @@
#include <alloc.h>
#include "hg_comm.h"
#include "dlist.h"
-#include "php.h"
-#include "head.h"
+#include "ext/standard/head.h"
static int set_nonblocking(int fd);
static int set_blocking(int fd);
@@ -68,14 +64,14 @@ static char *build_msg_str(char *buf, char *str);
static int swap(int val);
-int version = VERSION;
+int version = HW_VERSION;
/* F_DISTRIBUTED has the effect that all object ids are
virtual. This means whenever an object is requested a
new id is generated for this session. Wavemaster and
Harmony set this flag. How do I know? tcpdump tells
a lot if investigate the output.
- int version = VERSION | F_DISTRIBUTED; */
-/* int version = VERSION | F_DISTRIBUTED | F_COMPRESSED; */
+ int version = HW_VERSION | F_DISTRIBUTED; */
+/* int version = HW_VERSION | F_DISTRIBUTED | F_COMPRESSED; */
static int msgid = 1;
static int sock_flags = -1;
static int non_blocking = 0;
@@ -157,7 +153,7 @@ ANCHOR *fnAddAnchor(DLIST *pAnchorList,
cur_ptr->keyword = NULL;
cur_ptr->fragment = NULL;
- dlst_insertafter(pAnchorList, cur_ptr, DLST_HEAD(pAnchorList));
+ dlst_insertafter(pAnchorList, cur_ptr, PHP_DLST_HEAD(pAnchorList));
return(cur_ptr);
}
@@ -244,192 +240,199 @@ DLIST *fnCreateAnchorList(char **anchors, char **docofanchorrec, char **reldestr
docofanchorptr = docofanchorrec[i];
reldestptr = reldestrec[i];
- /* Determine Position. Doesn't matter if Src or Dest */
+ /* Determine Position. Doesn't matter if Src or Dest
+ The Position field should always be there. Though there
+ are case in which the position has no meaning, e.g. if
+ a document is annotated and the annotation text doesn't
+ contain a link of type annotation,
+ In such a case the Position has the value 'invisible' */
str = strstr(object, "Position");
str += 9;
- sscanf(str, "0x%X 0x%X", &start, &end);
-
- /* Determine ObjectID */
- objectID = 0;
- if(NULL != (str = strstr(object, "ObjectID"))) {
- str += 9;
- sscanf(str, "0x%X", &objectID);
- }
-
- cur_ptr = fnAddAnchor(pAnchorList, objectID, start, end);
-
- /* Determine Type of Anchor */
- str = strstr(object, "TAnchor");
- str += 8;
- if(*str == 'S') {
- char destdocname[200];
- char nameanchor[200];
- cur_ptr->tanchor = 1;
+ if(0 != strncmp(str, "invisible", 9)) {
+ sscanf(str, "0x%X 0x%X", &start, &end);
+
+ /* Determine ObjectID */
+ objectID = 0;
+ if(NULL != (str = strstr(object, "ObjectID"))) {
+ str += 9;
+ sscanf(str, "0x%X", &objectID);
+ }
+
+ cur_ptr = fnAddAnchor(pAnchorList, objectID, start, end);
+
+ /* Determine Type of Anchor */
+ str = strstr(object, "TAnchor");
+ str += 8;
+ if(*str == 'S') {
+ char destdocname[200];
+ char nameanchor[200];
+ cur_ptr->tanchor = 1;
+
+ cur_ptr->destdocname = NULL;
+ if(NULL != (str = strstr(object, "Dest"))) {
+ char *tempptr;
- cur_ptr->destdocname = NULL;
- if(NULL != (str = strstr(object, "Dest"))) {
- char *tempptr;
-
- /* No need to care about the value of Dest, because we take the info
- from docofanchorptr.
- Since the anchor has a destination there are two possibilities.
- 1. The destination is an anchor or
- 2. or the destination is a document already.
- In both cases docofanchorptr has the proper info because GETDOCBYANCHOR
- is such a nice message.
- */
- switch(anchormode) {
- case 0:
- tempptr = docofanchorptr;
- break;
- default:
- tempptr = reldestptr;
- }
- if(NULL != tempptr) {
- /* It's always nice to deal with names, so let's first check
- for a name. If there is none we take the ObjectID.
+ /* No need to care about the value of Dest, because we take the info
+ from docofanchorptr.
+ Since the anchor has a destination there are two possibilities.
+ 1. The destination is an anchor or
+ 2. or the destination is a document already.
+ In both cases docofanchorptr has the proper info because GETDOCBYANCHOR
+ is such a nice message.
*/
- if(NULL != (str = strstr(tempptr, "Name="))) {
- str += 5;
- } else if(NULL != (str = strstr(tempptr, "ObjectID="))) {
- str += 9;
- }
- if(sscanf(str, "%s\n", destdocname)) {
- cur_ptr->destdocname = estrdup(destdocname);
+ switch(anchormode) {
+ case 0:
+ tempptr = docofanchorptr;
+ break;
+ default:
+ tempptr = reldestptr;
}
- destid = 0;
- if(NULL != (str = strstr(tempptr, "ObjectID="))) {
- str += 9;
- sscanf(str, "0x%X", &destid);
+ if(NULL != tempptr) {
+ /* It's always nice to deal with names, so let's first check
+ for a name. If there is none we take the ObjectID.
+ */
+ if(NULL != (str = strstr(tempptr, "Name="))) {
+ str += 5;
+ } else if(NULL != (str = strstr(tempptr, "ObjectID="))) {
+ str += 9;
+ }
+ if(sscanf(str, "%s\n", destdocname)) {
+ cur_ptr->destdocname = estrdup(destdocname);
+ }
+ destid = 0;
+ if(NULL != (str = strstr(tempptr, "ObjectID="))) {
+ str += 9;
+ sscanf(str, "0x%X", &destid);
+ }
}
}
- }
-
- /* Get the Id of the anchor destination and the document id that belongs
- to that anchor. We need that soon in order to determine if the anchor
- points to a document or a dest anchor in a document.
- */
- anchordestid = 0;
- if(NULL != (str = strstr(object, "Dest="))) {
- str += 5;
- sscanf(str, "0x%X", &anchordestid);
- }
-
- /* if anchordestid != destid then the destination is an anchor in a document whose
- name (objectID) is already in destdocname. We will have to extend the link
- by '#...'
- */
- cur_ptr->nameanchor = NULL;
- if(anchordestid != destid) {
+
+ /* Get the Id of the anchor destination and the document id that belongs
+ to that anchor. We need that soon in order to determine if the anchor
+ points to a document or a dest anchor in a document.
+ */
+ anchordestid = 0;
if(NULL != (str = strstr(object, "Dest="))) {
str += 5;
- if(sscanf(str, "%s\n", nameanchor))
- cur_ptr->nameanchor = estrdup(nameanchor);
+ sscanf(str, "0x%X", &anchordestid);
}
- }
-
- if(!cur_ptr->destdocname) {
- cur_ptr->link = NULL;
- if(NULL != (str = strstr(object, "Hint=URL:"))) {
- str += 9;
- if(sscanf(str, "%s\n", link))
- cur_ptr->link = estrdup(link);
- } else if(NULL != (str = strstr(object, "Hint="))) {
- str += 5;
- if(sscanf(str, "%s\n", link))
- cur_ptr->link = estrdup(link);
- }
- }
-
- cur_ptr->fragment = NULL;
- if(NULL != (str = strstr(object, "Fragment="))) {
- str += 9;
- if(sscanf(str, "%s\n", link))
- cur_ptr->fragment = estrdup(link);
- }
-
- cur_ptr->htmlattr = NULL;
- if(NULL != (str = strstr(object, "HtmlAttr="))) {
- str += 9;
- str1 = str;
- while((*str1 != '\n') && (*str1 != '\0'))
- str1++;
- cur_ptr->htmlattr = emalloc(str1 - str + 1);
- strncpy(cur_ptr->htmlattr, str, str1 - str);
- cur_ptr->htmlattr[str1 - str] = '\0';
- }
-
- if(NULL != (str = strstr(object, "LinkType="))) {
- str += 9;
- if(strncmp(str, "background", 10) == 0)
- cur_ptr->linktype=HW_BACKGROUND_LINK;
- else
- if(strncmp(str, "intag", 5) == 0) {
- cur_ptr->linktype=HW_INTAG_LINK;
- cur_ptr->tagattr = NULL;
- if(NULL != (str = strstr(object, "TagAttr="))) {
- str += 8;
- str1 = str;
- while((*str1 != '\n') && (*str1 != '\0'))
- str1++;
- cur_ptr->tagattr = emalloc(str1 - str + 1);
- memcpy(cur_ptr->tagattr, str, str1 - str);
- cur_ptr->tagattr[str1 - str] = '\0';
- }
- } else
- if(strncmp(str, "applet", 6) == 0) {
- cur_ptr->linktype=HW_APPLET_LINK;
- cur_ptr->codebase = NULL;
- if(NULL != (str = strstr(object, "CodeBase="))) {
- str += 9;
- str1 = str;
- while((*str1 != '\n') && (*str1 != '\0'))
- str1++;
- cur_ptr->codebase = emalloc(str1 - str + 1);
- memcpy(cur_ptr->codebase, str, str1 - str);
- cur_ptr->codebase[str1 - str] = '\0';
- }
- cur_ptr->code = NULL;
- if(NULL != (str = strstr(object, "Code="))) {
+
+ /* if anchordestid != destid then the destination is an anchor in a document whose
+ name (objectID) is already in destdocname. We will have to extend the link
+ by '#...'
+ */
+ cur_ptr->nameanchor = NULL;
+ if(anchordestid != destid) {
+ if(NULL != (str = strstr(object, "Dest="))) {
str += 5;
- str1 = str;
- while((*str1 != '\n') && (*str1 != '\0'))
- str1++;
- cur_ptr->code = emalloc(str1 - str + 1);
- memcpy(cur_ptr->code, str, str1 - str);
- cur_ptr->code[str1 - str] = '\0';
+ if(sscanf(str, "%s\n", nameanchor))
+ cur_ptr->nameanchor = estrdup(nameanchor);
}
+ }
+
+ if(!cur_ptr->destdocname) {
+ cur_ptr->link = NULL;
+ if(NULL != (str = strstr(object, "Hint=URL:"))) {
+ str += 9;
+ if(sscanf(str, "%s\n", link))
+ cur_ptr->link = estrdup(link);
+ } else if(NULL != (str = strstr(object, "Hint="))) {
+ str += 5;
+ if(sscanf(str, "%s\n", link))
+ cur_ptr->link = estrdup(link);
+ }
+ }
+
+ cur_ptr->fragment = NULL;
+ if(NULL != (str = strstr(object, "Fragment="))) {
+ str += 9;
+ if(sscanf(str, "%s\n", link))
+ cur_ptr->fragment = estrdup(link);
+ }
+
+ cur_ptr->htmlattr = NULL;
+ if(NULL != (str = strstr(object, "HtmlAttr="))) {
+ str += 9;
+ str1 = str;
+ while((*str1 != '\n') && (*str1 != '\0'))
+ str1++;
+ cur_ptr->htmlattr = emalloc(str1 - str + 1);
+ strncpy(cur_ptr->htmlattr, str, str1 - str);
+ cur_ptr->htmlattr[str1 - str] = '\0';
+ }
+
+ if(NULL != (str = strstr(object, "LinkType="))) {
+ str += 9;
+ if(strncmp(str, "background", 10) == 0)
+ cur_ptr->linktype=HW_BACKGROUND_LINK;
+ else
+ if(strncmp(str, "intag", 5) == 0) {
+ cur_ptr->linktype=HW_INTAG_LINK;
+ cur_ptr->tagattr = NULL;
+ if(NULL != (str = strstr(object, "TagAttr="))) {
+ str += 8;
+ str1 = str;
+ while((*str1 != '\n') && (*str1 != '\0'))
+ str1++;
+ cur_ptr->tagattr = emalloc(str1 - str + 1);
+ memcpy(cur_ptr->tagattr, str, str1 - str);
+ cur_ptr->tagattr[str1 - str] = '\0';
+ }
+ } else
+ if(strncmp(str, "applet", 6) == 0) {
+ cur_ptr->linktype=HW_APPLET_LINK;
+ cur_ptr->codebase = NULL;
+ if(NULL != (str = strstr(object, "CodeBase="))) {
+ str += 9;
+ str1 = str;
+ while((*str1 != '\n') && (*str1 != '\0'))
+ str1++;
+ cur_ptr->codebase = emalloc(str1 - str + 1);
+ memcpy(cur_ptr->codebase, str, str1 - str);
+ cur_ptr->codebase[str1 - str] = '\0';
+ }
+ cur_ptr->code = NULL;
+ if(NULL != (str = strstr(object, "Code="))) {
+ str += 5;
+ str1 = str;
+ while((*str1 != '\n') && (*str1 != '\0'))
+ str1++;
+ cur_ptr->code = emalloc(str1 - str + 1);
+ memcpy(cur_ptr->code, str, str1 - str);
+ cur_ptr->code[str1 - str] = '\0';
+ }
+ } else
+ cur_ptr->linktype=HW_DEFAULT_LINK;
} else
cur_ptr->linktype=HW_DEFAULT_LINK;
- } else
- cur_ptr->linktype=HW_DEFAULT_LINK;
-
- } else { /* Destination Anchor */
- char nameanchor[200];
-
- cur_ptr->tanchor = 2;
- cur_ptr->link = NULL;
-
- /* Here is the only additional info for the name attribute */
- cur_ptr->nameanchor = NULL;
- if(NULL != (str = strstr(object, "ObjectID="))) {
- str += 9;
- if(sscanf(str, "%s\n", nameanchor))
- cur_ptr->nameanchor = estrdup(nameanchor);
- }
-
- cur_ptr->keyword = NULL;
- if(NULL != (str = strstr(object, "Keyword="))) {
- str += 8;
- if(sscanf(str, "%s\n", nameanchor))
- cur_ptr->keyword = estrdup(nameanchor);
+
+ } else { /* Destination Anchor */
+ char nameanchor[200];
+
+ cur_ptr->tanchor = 2;
+ cur_ptr->link = NULL;
+
+ /* Here is the only additional info for the name attribute */
+ cur_ptr->nameanchor = NULL;
+ if(NULL != (str = strstr(object, "ObjectID="))) {
+ str += 9;
+ if(sscanf(str, "%s\n", nameanchor))
+ cur_ptr->nameanchor = estrdup(nameanchor);
+ }
+
+ cur_ptr->keyword = NULL;
+ if(NULL != (str = strstr(object, "Keyword="))) {
+ str += 8;
+ if(sscanf(str, "%s\n", nameanchor))
+ cur_ptr->keyword = estrdup(nameanchor);
+ }
+
}
-
+
+ efree(anchors[i]);
+ if(docofanchorrec[i]) efree(docofanchorrec[i]);
+ if(reldestrec[i]) efree(reldestrec[i]);
}
-
- efree(anchors[i]);
- if(docofanchorrec[i]) efree(docofanchorrec[i]);
- if(reldestrec[i]) efree(reldestrec[i]);
}
}
return pAnchorList;
@@ -443,31 +446,39 @@ DLIST *fnCreateAnchorList(char **anchors, char **docofanchorrec, char **reldestr
* DList *pAnchorList: list of anchors *
* Return: Text with anchors *
***********************************************************************/
-char *fnInsAnchorsIntoText(char *text, DLIST *pAnchorList, char **bodytag) {
+#define BUFFERLEN 200
+char *fnInsAnchorsIntoText(char *text, DLIST *pAnchorList, char **bodytag, char *urlprefix) {
ANCHOR *cur_ptr;
- char bgstr[100], istr[200];
+ char bgstr[BUFFERLEN], istr[BUFFERLEN];
char *scriptname;
char *newtext;
int offset = 0;
int laststart=0;
+/* The following is very tricky and depends on how rewriting is setup on your webserver.
+ If you skip the scriptname in the url you will have to map each hyperwave name to http://<hwname>.
+ This may not always be a good idea. The best solution is probably to provide a prefix for such
+ a case which is an optional parameter to hw_gettext hw_pipedocument.
+*/
+ if(urlprefix) {
+ scriptname = urlprefix;
+ } else {
#if APACHE
- {
- int j;
- SLS_FETCH();
-
- array_header *arr = table_elts(((request_rec *) SG(server_context))->subprocess_env);
- table_entry *elts = (table_entry *)arr->elts;
+ {
+ int j;
+ array_header *arr = table_elts(((request_rec *) SG(server_context))->subprocess_env);
+ table_entry *elts = (table_entry *)arr->elts;
- for (j=0; j < arr->nelts; j++) {
- if(0 == strcmp(elts[j].key, "SCRIPT_NAME"))
- break;
- }
- scriptname = elts[j].val;
- }
+ for (j=0; j < arr->nelts; j++) {
+ if(0 == strcmp(elts[j].key, "SCRIPT_NAME"))
+ break;
+ }
+ scriptname = elts[j].val;
+ }
#else
- scriptname = getenv("SCRIPT_FILENAME");
+ scriptname = getenv("SCRIPT_FILENAME");
#endif
+ }
newtext = text;
bgstr[0] = '\0';
@@ -483,57 +494,57 @@ char *fnInsAnchorsIntoText(char *text, DLIST *pAnchorList, char **bodytag) {
/* The link is only set if the Link points to an external document */
switch(cur_ptr->linktype) {
case HW_BACKGROUND_LINK:
- sprintf(bgstr, " background='%s'", cur_ptr->link);
+ snprintf(bgstr, BUFFERLEN, " background='%s'", cur_ptr->link);
break;
case HW_INTAG_LINK:
- sprintf(istr, " %s='%s' start=%d", cur_ptr->tagattr, cur_ptr->link, cur_ptr->start);
+ snprintf(istr, BUFFERLEN, " %s='%s' start=%d", cur_ptr->tagattr, cur_ptr->link, cur_ptr->start);
offset -= 4; /* because there is no closing tag </A> */
/* laststart = cur_ptr->start; */
break;
case HW_APPLET_LINK:
if(cur_ptr->codebase)
- sprintf(istr, " CODEBASE='%s' CODE='%s'", cur_ptr->codebase, cur_ptr->code);
+ snprintf(istr, BUFFERLEN, " CODEBASE='%s' CODE='%s'", cur_ptr->codebase, cur_ptr->code);
else
- sprintf(istr, " CODEBASE='/' CODE='%s'", cur_ptr->code);
+ snprintf(istr, BUFFERLEN, " CODEBASE='/' CODE='%s'", cur_ptr->code);
break;
default:
newtext = fnInsStr(newtext, cur_ptr->end+offset, "</A>");
- sprintf(istr, "<A HREF='%s' %s offset=%d>", cur_ptr->link, cur_ptr->htmlattr == NULL ? "" : cur_ptr->htmlattr, offset);
+ snprintf(istr, BUFFERLEN, "<A HREF='%s' %s>", cur_ptr->link, cur_ptr->htmlattr == NULL ? "" : cur_ptr->htmlattr);
}
} else {
switch(cur_ptr->linktype) {
case HW_BACKGROUND_LINK:
if(NULL != cur_ptr->destdocname)
- sprintf(bgstr, " background='%s/%s'", scriptname == NULL ? "" : scriptname, cur_ptr->destdocname);
+ snprintf(bgstr, BUFFERLEN, " background='%s/%s'", scriptname == NULL ? "" : scriptname, cur_ptr->destdocname);
else
- sprintf(bgstr, "");
+ bgstr[0] = '\0';
break;
case HW_INTAG_LINK:
if(cur_ptr->fragment)
-/* sprintf(istr, " %s='%s/%s#%s'", cur_ptr->tagattr, scriptname == NULL ? "." : scriptname, cur_ptr->destdocname, cur_ptr->fragment);*/
- sprintf(istr, " %s='#%s'", cur_ptr->tagattr, cur_ptr->fragment);
+/* snprintf(istr, BUFFERLEN, " %s='%s/%s#%s'", cur_ptr->tagattr, scriptname == NULL ? "." : scriptname, cur_ptr->destdocname, cur_ptr->fragment);*/
+ snprintf(istr, BUFFERLEN, " %s='#%s'", cur_ptr->tagattr, cur_ptr->fragment);
else
- sprintf(istr, " %s='%s/%s'", cur_ptr->tagattr, scriptname == NULL ? "." : scriptname, cur_ptr->destdocname);
+ snprintf(istr, BUFFERLEN, " %s='%s/%s'", cur_ptr->tagattr, scriptname == NULL ? "." : scriptname, cur_ptr->destdocname);
offset -= 4; /* because there is no closing tag </A> */
/* laststart = cur_ptr->start; */
break;
case HW_APPLET_LINK:
if(cur_ptr->codebase)
-/* sprintf(istr, " CODEBASE='%s%s' CODE='%s'", scriptname == NULL ? "" : scriptname, cur_ptr->codebase, cur_ptr->code); */
- sprintf(istr, " CODEBASE='%s' CODE='%s'", cur_ptr->codebase, cur_ptr->code);
+/* snprintf(istr, BUFFERLEN, " CODEBASE='%s%s' CODE='%s'", scriptname == NULL ? "" : scriptname, cur_ptr->codebase, cur_ptr->code); */
+ snprintf(istr, BUFFERLEN, " CODEBASE='%s' CODE='%s'", cur_ptr->codebase, cur_ptr->code);
else
- sprintf(istr, " CODEBASE='/' CODE='%s'", cur_ptr->code);
+ snprintf(istr, BUFFERLEN, " CODEBASE='/' CODE='%s'", cur_ptr->code);
break;
default:
newtext = fnInsStr(newtext, cur_ptr->end+offset, "</A>");
if(cur_ptr->nameanchor)
- sprintf(istr, "<A HREF='%s/%s#%s' %s>", scriptname == NULL ? "schade" : scriptname, cur_ptr->destdocname, cur_ptr->nameanchor, cur_ptr->htmlattr == NULL ? "" : cur_ptr->htmlattr);
+ snprintf(istr, BUFFERLEN, "<A HREF='%s/%s#%s' %s>", scriptname == NULL ? "schade" : scriptname, cur_ptr->destdocname, cur_ptr->nameanchor, cur_ptr->htmlattr == NULL ? "" : cur_ptr->htmlattr);
else
if(cur_ptr->fragment)
- sprintf(istr, "<A HREF='%s/%s#%s' %s>", scriptname == NULL ? "" : scriptname, cur_ptr->destdocname, cur_ptr->fragment, cur_ptr->htmlattr == NULL ? "" : cur_ptr->htmlattr);
+ snprintf(istr, BUFFERLEN, "<A HREF='%s/%s#%s' %s>", scriptname == NULL ? "" : scriptname, cur_ptr->destdocname, cur_ptr->fragment, cur_ptr->htmlattr == NULL ? "" : cur_ptr->htmlattr);
else
- sprintf(istr, "<A HREF='%s/%s' %s offset=%d>", scriptname == NULL ? "" : scriptname, cur_ptr->destdocname, cur_ptr->htmlattr == NULL ? "" : cur_ptr->htmlattr, offset);
+ snprintf(istr, BUFFERLEN, "<A HREF='%s/%s' %s>", scriptname == NULL ? "" : scriptname, cur_ptr->destdocname, cur_ptr->htmlattr == NULL ? "" : cur_ptr->htmlattr);
}
}
newtext = fnInsStr(newtext, cur_ptr->start, istr);
@@ -550,9 +561,9 @@ char *fnInsAnchorsIntoText(char *text, DLIST *pAnchorList, char **bodytag) {
instead of the destdocname
*/
if(cur_ptr->keyword)
- sprintf(istr, "<A NAME='%s'>", cur_ptr->keyword);
+ snprintf(istr, BUFFERLEN, "<A NAME='%s'>", cur_ptr->keyword);
else if(cur_ptr->nameanchor)
- sprintf(istr, "<A NAME='%s'>", cur_ptr->nameanchor);
+ snprintf(istr, BUFFERLEN, "<A NAME='%s'>", cur_ptr->nameanchor);
newtext = fnInsStr(newtext, cur_ptr->start, istr);
/* In case there are several TAGS nested, we accumulate the offset
You wonder what the 4 means? It's the length of </A> */
@@ -561,10 +572,11 @@ char *fnInsAnchorsIntoText(char *text, DLIST *pAnchorList, char **bodytag) {
}
cur_ptr = (ANCHOR *) dlst_prev(cur_ptr);
}
- sprintf(istr, "<BODY %s>", bgstr);
+ snprintf(istr, BUFFERLEN, "<BODY %s>", bgstr);
*bodytag = estrdup(istr);
return(newtext);
}
+#undef BUFFERLEN
/***********************************************************************
* Function fnAttributeValue() *
@@ -661,7 +673,7 @@ static int fnCOpenDataCon(int sockfd, int *port)
/*
** Open a TCP socket (an Internet stream socket)
*/
- if((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
+ if((fd = socket(AF_INET, SOCK_STREAM, 0)) == SOCK_ERR)
{
return(-1);
}
@@ -929,7 +941,7 @@ int open_hg_connection(char *server_name, int port)
server_addr.sin_port = htons(HG_SERVER_PORT);
bcopy(hp->h_addr, (char *) &server_addr.sin_addr, hp->h_length);
- if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
+ if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == SOCK_ERR ) {
return(-2);
}
@@ -939,8 +951,8 @@ int open_hg_connection(char *server_name, int port)
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option));
#endif /* SUN */
- if (connect(sockfd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) {
- close(sockfd);
+ if (connect(sockfd, (struct sockaddr *) &server_addr, sizeof(server_addr)) != 0) {
+ HWSOCK_FCLOSE(sockfd);
return(-3);
}
@@ -949,6 +961,7 @@ int open_hg_connection(char *server_name, int port)
#endif
if ( set_nonblocking(sockfd) == -1 ) {
+ HWSOCK_FCLOSE(sockfd);
return(-4);
}
@@ -1008,7 +1021,7 @@ int initialize_hg_connection(int sockfd, int *do_swap, int *version, char **user
return(-9);
}
- if ((ready_msg->version_msgid & F_VERSION) < VERSION)
+ if ((ready_msg->version_msgid & F_VERSION) < HW_VERSION)
return(-8);
*version = ready_msg->version_msgid;
*server_string = strdup(ready_msg->buf+4);
@@ -1151,38 +1164,38 @@ hg_msg *recv_hg_msg(int sockfd)
hg_msg *msg;
if ( (msg = (hg_msg *)emalloc(sizeof(hg_msg))) == NULL ) {
-/* php_printf("recv_hg_msg"); */
+/* php3_printf("recv_hg_msg"); */
lowerror = LE_MALLOC;
return(NULL);
}
if ( hg_read_exact(sockfd, (char *)&(msg->length), 4) == -1 ) {
-/* php_printf("recv_hg_msg: hg_read (1) returned -1\n"); */
+/* php3_printf("recv_hg_msg: hg_read (1) returned -1\n"); */
efree(msg);
return(NULL);
}
if ( hg_read_exact(sockfd, (char *)&(msg->version_msgid), 4) == -1 ) {
-/* php_printf("recv_hg_msg: hg_read (2) returned -1\n"); */
+/* php3_printf("recv_hg_msg: hg_read (2) returned -1\n"); */
efree(msg);
return(NULL);
}
if ( hg_read_exact(sockfd, (char *)&(msg->msg_type), 4) == -1 ) {
-/* php_printf("recv_hg_msg: hg_read (3) returned -1\n"); */
+/* php3_printf("recv_hg_msg: hg_read (3) returned -1\n"); */
efree(msg);
return(NULL);
}
if ( msg->length > HEADER_LENGTH ) {
if ( (msg->buf = (char *) emalloc(msg->length-HEADER_LENGTH)) == NULL ) {
-/* php_printf("recv_hg_msg"); */
+/* php3_printf("recv_hg_msg"); */
lowerror = LE_MALLOC;
efree(msg);
return(NULL);
}
if ( hg_read_exact(sockfd, msg->buf, msg->length-HEADER_LENGTH) == -1 ) {
-/* php_printf("recv_hg_msg: hg_read (4) returned -1\n"); */
+/* php3_printf("recv_hg_msg: hg_read (4) returned -1\n"); */
efree(msg->buf);
efree(msg);
return(NULL);
@@ -1192,7 +1205,7 @@ hg_msg *recv_hg_msg(int sockfd)
msg->buf = NULL;
#ifdef HW_DEBUG
- php_printf("<B> Recv msg: </B>type = %d -- id = %d<BR>\n", msg->msg_type, msg->version_msgid);
+ php3_printf("<B> Recv msg: </B>type = %d -- id = %d<BR>\n", msg->msg_type, msg->version_msgid);
#endif
return(msg);
}
@@ -1203,11 +1216,11 @@ hg_msg *recv_ready(int sockfd)
hg_msg *ready_msg;
if ( (ready_msg = recv_hg_msg(sockfd)) == NULL ) {
-/* php_printf("recv_ready: recv_hg_msg returned NULL\n"); */
+/* php3_printf("recv_ready: recv_hg_msg returned NULL\n"); */
return(NULL);
}
if ( ready_msg->msg_type != READY_MESSAGE ) {
-/* php_printf("recv_ready: recv_hg_msg returned wrong message: %d, %d \n", ready_msg->length, ready_msg->msg_type); */
+/* php3_printf("recv_ready: recv_hg_msg returned wrong message: %d, %d \n", ready_msg->length, ready_msg->msg_type); */
efree(ready_msg);
return(NULL);
}
@@ -1339,7 +1352,6 @@ static int bh_send_changeobject(int sockfd, hw_objectID objectID, char *mod) {
build_msg_header(&msg, length, msgid++, CHANGEOBJECT_MESSAGE);
if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
lowerror = LE_MALLOC;
return(-1);
}
@@ -1376,6 +1388,29 @@ int send_changeobject(int sockfd, hw_objectID objectID, char *modification)
return(uh_send_changeobject(sockfd));
}
+int send_groupchangeobject(int sockfd, hw_objectID objectID, char *modification)
+{
+ hw_objectID *childIDs;
+ int count, i, error;
+
+ if(0 == (error = send_lock(sockfd, objectID))) {
+ send_changeobject(sockfd, objectID, modification);
+ send_unlock(sockfd, objectID);
+ }/* else
+ fprintf(stderr, "Could not lock 0x%X (error = %d)\n", objectID, error); */
+
+ if(0 == send_children(sockfd, objectID, &childIDs, &count)) {
+/* fprintf(stderr, "Changing Children of 0x%X\n", objectID); */
+ for(i=0; i<count; i++)
+ if(0 > send_groupchangeobject(sockfd, childIDs[i], modification))
+/* fprintf(stderr, "Cannot change 0x%X\n", objectID) */;
+ if(childIDs)
+ efree(childIDs);
+ }/* else
+ fprintf(stderr, "No Children of 0x%X\n", objectID); */
+ return(0);
+}
+
static int bh_send_getobject(int sockfd, hw_objectID objectID) {
hg_msg msg;
int length;
@@ -1386,7 +1421,6 @@ static int bh_send_getobject(int sockfd, hw_objectID objectID) {
build_msg_header(&msg, length, msgid++, GETOBJECT_MESSAGE);
if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
lowerror = LE_MALLOC;
return(-1);
}
@@ -1475,6 +1509,41 @@ int send_getandlock(int sockfd, hw_objectID objectID, char **attributes)
return error;
}
+int send_lock(int sockfd, hw_objectID objectID)
+{
+ hg_msg msg, *retmsg;
+ int length, error;
+ char *tmp;
+
+ length = HEADER_LENGTH + sizeof(hw_objectID);
+
+ build_msg_header(&msg, length, msgid++, GETANDLOCK_MESSAGE);
+
+ if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
+ lowerror = LE_MALLOC;
+ return(-1);
+ }
+
+ tmp = build_msg_int(msg.buf, objectID);
+
+ if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
+ efree(msg.buf);
+ return(-1);
+ }
+
+ efree(msg.buf);
+ retmsg = recv_hg_msg(sockfd);
+ if ( retmsg == NULL ) {
+ return(-1);
+ }
+
+ error = *((int *) retmsg->buf);
+
+ efree(retmsg->buf);
+ efree(retmsg);
+ return error;
+}
+
int send_insertobject(int sockfd, char *objrec, char *parms, hw_objectID *objectID)
{
hg_msg msg, *retmsg;
@@ -1522,7 +1591,7 @@ int send_insertobject(int sockfd, char *objrec, char *parms, hw_objectID *object
int send_unlock(int sockfd, hw_objectID objectID)
{
- hg_msg msg, *retmsg;
+ hg_msg msg;
int length, error;
char *tmp;
@@ -1544,16 +1613,7 @@ int send_unlock(int sockfd, hw_objectID objectID)
}
efree(msg.buf);
- retmsg = recv_hg_msg(sockfd);
- if ( retmsg == NULL ) {
- return(-1);
- }
-
- error = (int) *(retmsg->buf);
-
- efree(retmsg->buf);
- efree(retmsg);
- return error;
+ return 0;
}
int send_incollections(int sockfd, int retcol, int cobjids, hw_objectID *objectIDs, int ccollids, hw_objectID *collIDs, int *count, hw_objectID **retIDs)
@@ -1716,7 +1776,7 @@ int send_insdoc(int sockfd, hw_objectID objectID, char *objrec, char *text, hw_o
int send_getdestforanchorsobj(int sockfd, char **anchorrec, char ***destrec, int count);
int send_getreldestforanchorsobj(int sockfd, char **anchorrec, char ***reldestrec, int count, int rootID, int thisID);
-int send_gettext(int sockfd, hw_objectID objectID, int mode, int rootid, char **objattr, char **bodytag, char **text, int *count)
+int send_gettext(int sockfd, hw_objectID objectID, int mode, int rootid, char **objattr, char **bodytag, char **text, int *count, char *urlprefix)
{
hg_msg msg, *retmsg;
int length, *ptr, ancount, error;
@@ -1827,7 +1887,7 @@ int send_gettext(int sockfd, hw_objectID objectID, int mode, int rootid, char **
char *newtext;
char *body;
- newtext = fnInsAnchorsIntoText(*text, pAnchorList, &body);
+ newtext = fnInsAnchorsIntoText(*text, pAnchorList, &body, urlprefix);
dlst_kill(pAnchorList, fnDeleteAnchor);
*bodytag = strdup(body);
efree(body);
@@ -1848,22 +1908,22 @@ int send_edittext(int sockfd, char *objattr, char *text)
char *tmp, *path, *objid;
hw_objectID objectID;
- objid = fnAttributeValue(objattr, "ObjectID=");
+ objid = fnAttributeValue(objattr, "ObjectID");
if(objid == NULL)
return(-1);
if(!sscanf(objid, "0x%x", &objectID))
- return(-1);
+ return(-2);
- path = fnAttributeValue(objattr, "Path=");
+ path = fnAttributeValue(objattr, "Path");
if(path == NULL)
- return(-1);
- length = HEADER_LENGTH + sizeof(hw_objectID) + strlen(path) + 1 + 1 + strlen(text) + 1;
+ return(-3);
+ length = HEADER_LENGTH + sizeof(hw_objectID) + strlen(path) + 1 + 1 + strlen(text) + 1;
build_msg_header(&msg, length, msgid++, EDITTEXT_MESSAGE);
if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
lowerror = LE_MALLOC;
- return(-1);
+ return(-4);
}
tmp = build_msg_int(msg.buf, objectID);
@@ -1876,20 +1936,20 @@ int send_edittext(int sockfd, char *objattr, char *text)
if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
efree(msg.buf);
- return(-1);
+ return(-5);
}
efree(msg.buf);
retmsg = recv_hg_msg(sockfd);
if (retmsg == NULL) {
*text = '\0';
- return(-1);
+ return(-6);
}
ptr = (int *) retmsg->buf;
error = *ptr;
- efree(retmsg);
efree(retmsg->buf);
+ efree(retmsg);
return(error);
}
@@ -2009,7 +2069,6 @@ int send_getremote(int sockfd, hw_objectID objectID, char **objattr, char **text
build_msg_header(&msg, length, msgid++, GETOBJECT_MESSAGE);
if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
lowerror = LE_MALLOC;
return(-1);
}
@@ -2045,7 +2104,6 @@ int send_getremote(int sockfd, hw_objectID objectID, char **objattr, char **text
build_msg_header(&msg, length, msgid++, GETREMOTE_MESSAGE);
if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
lowerror = LE_MALLOC;
return(-1);
}
@@ -2355,7 +2413,6 @@ int send_children(int sockfd, hw_objectID objectID, hw_objectID **childIDs, int
build_msg_header(&msg, length, msgid++, CHILDREN_MESSAGE);
if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
-/* perror("send_command"); */
lowerror = LE_MALLOC;
return(-1);
}
@@ -3096,7 +3153,7 @@ int send_getreldestforanchorsobj(int sockfd, char **anchorrec, char ***reldestre
if(anchorrec[i]) efree(anchorrec[i]);
anchorrec[i] = NULL;
} else {
- int j, k, *retthisIDs, *retdestIDs, equaltill, mincount, countthis, countdest, destdocid;
+ int j, *retthisIDs, *retdestIDs, equaltill, mincount, countthis, countdest, destdocid;
char destdocname[200];
char anchorstr[300];
char temp[200];
@@ -3114,6 +3171,7 @@ int send_getreldestforanchorsobj(int sockfd, char **anchorrec, char ***reldestre
send_incollections(sockfd, 1, 1, &thisID, 1, &rootID, &countthis, &retthisIDs);
send_incollections(sockfd, 1, 1, &destdocid, 1, &rootID, &countdest, &retdestIDs);
+/*
fprintf(stderr, "%d: ", thisID);
for(k=0; k<countthis; k++)
fprintf(stderr,"%d, ", retthisIDs[k]);
@@ -3122,6 +3180,7 @@ fprintf(stderr,"%d: ", destdocid);
for(k=0; k<countdest; k++)
fprintf(stderr,"%d: %d, ", destdocid, retdestIDs[k]);
fprintf(stderr,"\n");
+*/
mincount = (countthis < countdest) ? countthis : countdest;
for(j=0; (j<mincount) && (retthisIDs[j]==retdestIDs[j]); j++)
@@ -3132,7 +3191,7 @@ fprintf(stderr,"\n");
strcat(anchorstr, "../");
strcat(anchorstr, "./");
for(j=equaltill; j<countdest; j++) {
- char *temprec, tempname[100], objectidstr[100];
+ char *temprec, tempname[100];
send_getobject(sockfd, retdestIDs[j], &temprec);
if(NULL != (str = strstr(temprec, "Name="))) {
str += 5;
@@ -3149,10 +3208,10 @@ fprintf(stderr,"\n");
*strptr = '_';
strptr++;
}
-fprintf(stderr, "Adding '%s' to '%s'\n", temp, anchorstr);
+/* fprintf(stderr, "Adding '%s' to '%s'\n", temp, anchorstr); */
strcat(anchorstr, temp);
strcat(anchorstr, "/");
-fprintf(stderr, "Is now '%s'\n", anchorstr);
+/* fprintf(stderr, "Is now '%s'\n", anchorstr); */
efree(temprec);
}
/* if the anchor destination is a collection it may not be added anymore. */
@@ -3170,7 +3229,7 @@ fprintf(stderr, "Is now '%s'\n", anchorstr);
strcat(anchorstr, "\n");
sprintf(temp, "ObjectID=0x%x", destdocid);
strcat(anchorstr, temp);
-fprintf(stderr, "%s\n", anchorstr);
+/* fprintf(stderr, "%s\n", anchorstr); */
efree(retthisIDs);
efree(retdestIDs);
reldestptr[i] = estrdup(anchorstr);
@@ -3233,7 +3292,7 @@ int fn_findpath(int sockfd, int *retIDs, int count, int id) {
* document with id destID. *
********************************************************************/
int getrellink(int sockfd, int rootID, int thisID, int destID, char **reldeststr) {
- int i, j, k, *retthisIDs, *retdestIDs, equaltill, count, mincount, countthis, countdest, destdocid;
+ int i, j, k, *retthisIDs, *retdestIDs, equaltill, count, mincount, countthis, countdest;
char anchorstr[300];
char temp[200];
char *strptr;
@@ -3300,7 +3359,7 @@ fprintf(stderr, "first unequal = %d\n", j);
strcat(anchorstr, "../");
strcat(anchorstr, "./");
for(j=equaltill; j<countdest; j++) {
- char *temprec, *str, tempname[100], objectidstr[100];
+ char *temprec, *str, tempname[100];
if(0 == send_getobject(sockfd, retdestIDs[j], &temprec)) {
if(NULL != (str = strstr(temprec, "Name="))) {
str += 5;
@@ -3387,6 +3446,100 @@ int send_identify(int sockfd, char *name, char *passwd, char **userdata) {
return(0);
}
+int send_objectbyidquery(int sockfd, hw_objectID *IDs, int *count, char *query, char ***objrecs)
+{
+ hg_msg msg, *retmsg;
+ int length, error;
+ char *tmp, *str;
+ int *ptr, i, *ptr1;
+ int *offsets, *childIDs;
+ char **childrec;
+
+ length = HEADER_LENGTH + sizeof(int) + sizeof(int) + *count * sizeof(hw_objectID);
+ if(query)
+ length = length + strlen(query) + 1;
+
+ build_msg_header(&msg, length, msgid++, OBJECTBYIDQUERY_MESSAGE);
+
+ if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
+ lowerror = LE_MALLOC;
+ return(-1);
+ }
+
+ tmp = build_msg_int(msg.buf, 1);
+ tmp = build_msg_int(tmp, *count);
+ for(i=0; i<*count; i++)
+ tmp = build_msg_int(tmp, IDs[i]);
+ if(query)
+ tmp = build_msg_str(tmp, query);
+
+ if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
+ efree(msg.buf);
+ return(-1);
+ }
+ efree(msg.buf);
+ retmsg = recv_hg_msg(sockfd);
+ if ( retmsg == NULL )
+ return(-1);
+
+ ptr = (int *) retmsg->buf;
+ if(ptr == NULL) {
+ if(retmsg) efree(retmsg);
+ return -1;
+ }
+ if(*ptr++ != 0) {
+ error = *((int *) retmsg->buf);
+ efree(retmsg->buf);
+ efree(retmsg);
+ return error;
+ }
+
+ *count = *ptr++;
+ if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) {
+ ptr1 = childIDs;
+ for(i=0; i<*count; ptr++, i++)
+ ptr1[i] = *ptr;
+ if(NULL != (offsets = emalloc(*count * sizeof(int)))) {
+ ptr1 = offsets;
+ for(i=0; i<*count; ptr++, i++)
+ ptr1[i] = *ptr;
+ } else {
+ efree(retmsg->buf);
+ efree(retmsg);
+ efree(childIDs);
+ lowerror = LE_MALLOC;
+ return(-1);
+ }
+ } else {
+ efree(retmsg->buf);
+ efree(retmsg);
+ lowerror = LE_MALLOC;
+ return(-1);
+ }
+
+ str = (char *)ptr;
+ if(NULL == (childrec = (char **) emalloc(*count * sizeof(hw_objrec *)))) {
+ efree(offsets);
+ efree(childIDs);
+ efree(retmsg->buf);
+ efree(retmsg);
+ lowerror = LE_MALLOC;
+ return(-1);
+ } else {
+ for(i=0; i<*count; i++) {
+ childrec[i] = estrdup(str);
+ str += offsets[i];
+ }
+ *objrecs = childrec;
+ }
+
+ efree(retmsg->buf);
+ efree(retmsg);
+ efree(childIDs);
+ efree(offsets);
+ return(0);
+}
+
int send_getobjbyquery(int sockfd, char *query, int maxhits, hw_objectID **childIDs, int *count)
{
hg_msg msg, *retmsg;
@@ -3909,7 +4062,7 @@ int send_getparentsobj(int sockfd, hw_objectID objectID, char ***childrec, int *
return(0);
}
-int send_pipedocument(int sockfd, char *host, hw_objectID objectID, int mode, int rootid, char **objattr, char **bodytag, char **text, int *count)
+int send_pipedocument(int sockfd, char *host, hw_objectID objectID, int mode, int rootid, char **objattr, char **bodytag, char **text, int *count, char *urlprefix)
{
hg_msg msg, *retmsg;
int length, len;
@@ -3933,13 +4086,13 @@ int send_pipedocument(int sockfd, char *host, hw_objectID objectID, int mode, in
*/
if(host) {
if((hostptr = gethostbyname(host)) == NULL) {
- php_error(E_WARNING, "gethostbyname failed for %s", host);
- close(fd);
- return(-1);
+ php3_error(E_WARNING, "gethostbyname failed for %s", host);
+ HWSOCK_FCLOSE(fd);
+ return(-2);
}
} else {
- close(fd);
- return(-1);
+ HWSOCK_FCLOSE(fd);
+ return(-2);
}
switch(hostptr->h_addrtype) {
@@ -3951,20 +4104,20 @@ int send_pipedocument(int sockfd, char *host, hw_objectID objectID, int mode, in
hostip = inet_ntoa(*ptr1);
break;
default:
- close(fd);
- return(-1);
+ HWSOCK_FCLOSE(fd);
+ return(-3);
break;
}
/* Bottom half of send_getobject */
if(0 > bh_send_getobject(sockfd, objectID)) {
- close(fd);
- return -1;
+ HWSOCK_FCLOSE(fd);
+ return -4;
}
/* Upper half of send_getobject */
if(0 > (error = uh_send_getobject(sockfd, &attributes))) {
- close(fd);
+ HWSOCK_FCLOSE(fd);
return error;
}
@@ -3973,7 +4126,7 @@ int send_pipedocument(int sockfd, char *host, hw_objectID objectID, int mode, in
if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) {
lowerror = LE_MALLOC;
- return(-1);
+ return(-5);
}
tmp = build_msg_int(msg.buf, objectID);
@@ -3984,8 +4137,8 @@ int send_pipedocument(int sockfd, char *host, hw_objectID objectID, int mode, in
if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
if(attributes) efree(attributes);
efree(msg.buf);
- close(fd);
- return(-1);
+ HWSOCK_FCLOSE(fd);
+ return(-6);
}
efree(msg.buf);
@@ -3993,8 +4146,8 @@ int send_pipedocument(int sockfd, char *host, hw_objectID objectID, int mode, in
retmsg = recv_hg_msg(sockfd);
if ( retmsg == NULL ) {
if(attributes) efree(attributes);
- close(fd);
- return(-1);
+ HWSOCK_FCLOSE(fd);
+ return(-7);
}
ptr = (int *) retmsg->buf;
@@ -4003,7 +4156,7 @@ int send_pipedocument(int sockfd, char *host, hw_objectID objectID, int mode, in
efree(retmsg);
if(retmsg->buf) efree(retmsg->buf);
if(attributes) efree(attributes);
- close(fd);
+ HWSOCK_FCLOSE(fd);
return(error);
}
@@ -4015,12 +4168,12 @@ int send_pipedocument(int sockfd, char *host, hw_objectID objectID, int mode, in
*/
len = sizeof(serv_addr);
if((newfd = accept(fd, (struct sockaddr *) &serv_addr, &len)) < 0) {
-/* php_printf("client: can't open data connection to server\n"); */
+/* php3_printf("client: can't open data connection to server\n"); */
if(attributes) efree(attributes);
- close(fd);
- return(-1);
+ HWSOCK_FCLOSE(fd);
+ return(-8);
} else {
- close(fd);
+ HWSOCK_FCLOSE(fd);
}
/* First of all read the header */
@@ -4044,7 +4197,7 @@ int send_pipedocument(int sockfd, char *host, hw_objectID objectID, int mode, in
}
/* close the data connection */
- close(newfd);
+ HWSOCK_FCLOSE(newfd);
documenttype = fnAttributeValue(attributes, "DocumentType");
@@ -4071,7 +4224,7 @@ int send_pipedocument(int sockfd, char *host, hw_objectID objectID, int mode, in
char *newtext;
char *body;
- newtext = fnInsAnchorsIntoText(*text, pAnchorList, &body);
+ newtext = fnInsAnchorsIntoText(*text, pAnchorList, &body, urlprefix);
dlst_kill(pAnchorList, fnDeleteAnchor);
*bodytag = strdup(body);
efree(body);
@@ -4110,12 +4263,12 @@ int send_pipecgi(int sockfd, char *host, hw_objectID objectID, char *cgi_env_str
*/
if(host) {
if((hostptr = gethostbyname(host)) == NULL) {
- php_error(E_WARNING, "gethostbyname failed for %s", host);
- close(fd);
+ php3_error(E_WARNING, "gethostbyname failed for %s", host);
+ HWSOCK_FCLOSE(fd);
return(-1);
}
} else {
- close(fd);
+ HWSOCK_FCLOSE(fd);
return(-1);
}
@@ -4128,19 +4281,19 @@ int send_pipecgi(int sockfd, char *host, hw_objectID objectID, char *cgi_env_str
hostip = inet_ntoa(*ptr1);
break;
default:
-/* php_printf(stderr, "unknown address type\n"); */
+/* php3_printf(stderr, "unknown address type\n"); */
break;
}
/* Bottom half of send_getobject */
if(0 > bh_send_getobject(sockfd, objectID)) {
- close(fd);
+ HWSOCK_FCLOSE(fd);
return -1;
}
/* Upper half of send_getobject */
if(0 > (error = uh_send_getobject(sockfd, &attributes))) {
- close(fd);
+ HWSOCK_FCLOSE(fd);
return error;
}
@@ -4167,7 +4320,7 @@ int send_pipecgi(int sockfd, char *host, hw_objectID objectID, char *cgi_env_str
if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
if(attributes) efree(attributes);
efree(msg.buf);
- close(fd);
+ HWSOCK_FCLOSE(fd);
return(-1);
}
efree(msg.buf);
@@ -4176,7 +4329,7 @@ int send_pipecgi(int sockfd, char *host, hw_objectID objectID, char *cgi_env_str
retmsg = recv_hg_msg(sockfd);
if ( retmsg == NULL ) {
if(attributes) efree(attributes);
- close(fd);
+ HWSOCK_FCLOSE(fd);
return(-1);
}
@@ -4185,7 +4338,7 @@ int send_pipecgi(int sockfd, char *host, hw_objectID objectID, char *cgi_env_str
efree(retmsg);
if(retmsg->buf) efree(retmsg->buf);
if(attributes) efree(attributes);
- close(fd);
+ HWSOCK_FCLOSE(fd);
return(-1);
}
@@ -4198,10 +4351,10 @@ int send_pipecgi(int sockfd, char *host, hw_objectID objectID, char *cgi_env_str
len = sizeof(serv_addr);
if((newfd = accept(fd, (struct sockaddr *) &serv_addr, &len)) < 0) {
if(attributes) efree(attributes);
- close(fd);
+ HWSOCK_FCLOSE(fd);
return(-1);
} else {
- close(fd);
+ HWSOCK_FCLOSE(fd);
}
/* First of all read the header */
@@ -4224,7 +4377,7 @@ int send_pipecgi(int sockfd, char *host, hw_objectID objectID, char *cgi_env_str
}
/* close the data connection */
- close(newfd);
+ HWSOCK_FCLOSE(newfd);
documenttype = fnAttributeValue(attributes, "DocumentType");
@@ -4238,7 +4391,7 @@ int send_pipecgi(int sockfd, char *host, hw_objectID objectID, char *cgi_env_str
return(0);
}
-int send_putdocument(int sockfd, char *host, hw_objectID parentID, char *objectRec, char *text, int count)
+int send_putdocument(int sockfd, char *host, hw_objectID parentID, char *objectRec, char *text, int count, hw_objectID *objectID)
{
hg_msg msg, *retmsg;
int length, len;
@@ -4246,7 +4399,7 @@ int send_putdocument(int sockfd, char *host, hw_objectID parentID, char *objectR
struct sockaddr_in serv_addr;
struct hostent *hostptr;
char *hostip = NULL;
- int newfd, fd, port, objectID, error;
+ int newfd, fd, port, error;
int *ptr;
/* First of all we have to insert the document record */
@@ -4278,7 +4431,7 @@ int send_putdocument(int sockfd, char *host, hw_objectID parentID, char *objectR
ptr = (int *) retmsg->buf;
if(0 == (error = *ptr)) {
ptr++;
- objectID = *ptr;
+ *objectID = *ptr;
} else {
efree(retmsg);
if(retmsg->buf) efree(retmsg->buf);
@@ -4293,7 +4446,7 @@ int send_putdocument(int sockfd, char *host, hw_objectID parentID, char *objectR
*/
if(host) {
if((hostptr = gethostbyname(host)) == NULL) {
- php_error(E_WARNING, "gethostbyname failed for %s", host);
+ php3_error(E_WARNING, "gethostbyname failed for %s", host);
/* close(fd); fd is not set yet */
return(-1);
}
@@ -4331,7 +4484,7 @@ int send_putdocument(int sockfd, char *host, hw_objectID parentID, char *objectR
return(-1);
}
- tmp = build_msg_int(msg.buf, objectID);
+ tmp = build_msg_int(msg.buf, *objectID);
tmp = build_msg_int(tmp, port);
tmp = build_msg_str(tmp, hostip);
tmp = build_msg_str(tmp, "Hyperwave");
@@ -4339,7 +4492,7 @@ int send_putdocument(int sockfd, char *host, hw_objectID parentID, char *objectR
if ( send_hg_msg(sockfd, &msg, length) == -1 ) {
efree(msg.buf);
- close(fd);
+ HWSOCK_FCLOSE(fd);
return(-1);
}
efree(msg.buf);
@@ -4349,10 +4502,10 @@ int send_putdocument(int sockfd, char *host, hw_objectID parentID, char *objectR
*/
len = sizeof(serv_addr);
if((newfd = accept(fd, (struct sockaddr *) &serv_addr, &len)) < 0) {
- close(fd);
+ HWSOCK_FCLOSE(fd);
return(-1);
} else {
- close(fd);
+ HWSOCK_FCLOSE(fd);
}
/* First of all write the header. According to the documentation
@@ -4364,24 +4517,24 @@ int send_putdocument(int sockfd, char *host, hw_objectID parentID, char *objectR
sprintf(header, "HGHDR\nsz=%d\nref=12345678\n", count);
len = strlen(header) + 1;
if(len != write_to(newfd, header, len, wtimeout)) {
- close(newfd);
+ HWSOCK_FCLOSE(newfd);
return(-1);
}
/* And now the document */
if(count != write_to(newfd, text, count, wtimeout)) {
- close(newfd);
+ HWSOCK_FCLOSE(newfd);
return(-1);
}
/* The data connection has to be close before the return
msg can be read. The server will not sent it before. */
- close(newfd);
+ HWSOCK_FCLOSE(newfd);
/* Just check if the command was understood */
retmsg = recv_hg_msg(sockfd);
if ( retmsg == NULL ) {
- close(fd);
+ HWSOCK_FCLOSE(fd);
return(-1);
}
@@ -4389,7 +4542,7 @@ int send_putdocument(int sockfd, char *host, hw_objectID parentID, char *objectR
if((ptr == NULL) || (*ptr != 0)) {
efree(retmsg);
if(retmsg->buf) efree(retmsg->buf);
- close(fd);
+ HWSOCK_FCLOSE(fd);
return(-1);
}
@@ -4511,9 +4664,9 @@ int send_getsrcbydest(int sockfd, hw_objectID objectID, char ***childrec, int *c
return(0);
}
-char *get_hw_info(hw_connection *conn)
- {
- char temp[200];
+#define BUFFERLEN 200
+char *get_hw_info(hw_connection *conn) {
+ char temp[BUFFERLEN];
int len;
struct sockaddr_in serv_addr;
@@ -4521,18 +4674,19 @@ char *get_hw_info(hw_connection *conn)
if(getsockname(conn->socket, (struct sockaddr *)&serv_addr, &len) < 0)
return(NULL);
- sprintf(temp, "%s, %s, %d, %s, %d, %d", conn->server_string, conn->hostname,
+ snprintf(temp, BUFFERLEN, "%s, %s, %d, %s, %d, %d", conn->server_string, conn->hostname,
conn->version, conn->username,
serv_addr.sin_port, conn->swap_on);
return(estrdup(temp));
- }
+}
+#undef BUFFERLEN
static int send_hg_msg(int sockfd, hg_msg *msg, int length)
{
char *buf, *tmp;
#ifdef HW_DEBUG
- php_printf("<B>Sending msg: </B>type = %d -- id = %d<BR>\n", msg->msg_type, msg->version_msgid);
+ php3_printf("<B>Sending msg: </B>type = %d -- id = %d<BR>\n", msg->msg_type, msg->version_msgid);
#endif
if ( length < HEADER_LENGTH ) {
/* fprintf(stderr, "send_hg_msg: bad msg\n"); */
@@ -4644,7 +4798,7 @@ static char *build_msg_int(char *buf, int val) {
int tmp;
#ifdef HW_DEBUG
- php_printf(" Added int to header: <B>%d</B><BR>\n", val);
+ php3_printf(" Added int to header: <B>%d</B><BR>\n", val);
#endif
tmp = swap_on ? swap(val) : val;
memcpy(buf, (char *)&tmp, 4);
@@ -4658,7 +4812,7 @@ static char *build_msg_str(char *buf, char *str)
int len = strlen(str)+1;
#ifdef HW_DEBUG
- php_printf(" Added str to header: <B>%s</B> (%d)<BR>\n", str, strlen(str));
+ php3_printf(" Added str to header: <B>%s</B> (%d)<BR>\n", str, strlen(str));
#endif
memcpy(buf, str, len);
@@ -4682,8 +4836,8 @@ static int swap(int val)
void close_hg_connection(int sockfd)
{
- shutdown(sockfd, 2);
- close(sockfd);
+ shutdown(sockfd, 2);
+ HWSOCK_FCLOSE(sockfd);
}
#endif