diff options
author | SVN Migration <svn@php.net> | 2003-02-27 17:43:39 +0000 |
---|---|---|
committer | SVN Migration <svn@php.net> | 2003-02-27 17:43:39 +0000 |
commit | 078bcec0997ad0e07b720c43cc9e6d0e046a75ab (patch) | |
tree | 36cb0f6be2ef078fe3374de8c087b93ecf82f812 /ext/hyperwave | |
parent | fd61f69077f6156ca71dde60ecfd9ed9765a02db (diff) | |
download | php-git-PHP-5.tar.gz |
This commit was manufactured by cvs2svn to create branch 'PHP_5'.PHP-5
Diffstat (limited to 'ext/hyperwave')
-rw-r--r-- | ext/hyperwave/CREDITS | 2 | ||||
-rw-r--r-- | ext/hyperwave/config.m4 | 20 | ||||
-rw-r--r-- | ext/hyperwave/debug.h | 206 | ||||
-rw-r--r-- | ext/hyperwave/hg_comm.c | 5841 | ||||
-rw-r--r-- | ext/hyperwave/hg_comm.h | 238 | ||||
-rw-r--r-- | ext/hyperwave/hw.c | 4081 | ||||
-rw-r--r-- | ext/hyperwave/hw_error.h | 111 | ||||
-rw-r--r-- | ext/hyperwave/hyperwave.dsp | 120 | ||||
-rw-r--r-- | ext/hyperwave/php_hyperwave.h | 147 |
9 files changed, 0 insertions, 10766 deletions
diff --git a/ext/hyperwave/CREDITS b/ext/hyperwave/CREDITS deleted file mode 100644 index b01b16907f..0000000000 --- a/ext/hyperwave/CREDITS +++ /dev/null @@ -1,2 +0,0 @@ -HyperWave -Uwe Steinmann diff --git a/ext/hyperwave/config.m4 b/ext/hyperwave/config.m4 deleted file mode 100644 index 9e5a31cc6d..0000000000 --- a/ext/hyperwave/config.m4 +++ /dev/null @@ -1,20 +0,0 @@ -dnl -dnl $Id$ -dnl - -AC_MSG_CHECKING(for Hyperwave support) -AC_ARG_WITH(hyperwave, -[ --with-hyperwave Include Hyperwave support], -[ - if test "$withval" != "no"; then - AC_DEFINE(HYPERWAVE,1,[ ]) - AC_MSG_RESULT(yes) - PHP_NEW_EXTENSION(hyperwave, hw.c hg_comm.c) - else - AC_DEFINE(HYPERWAVE,0,[ ]) - AC_MSG_RESULT(no) - fi -],[ - AC_DEFINE(HYPERWAVE,0,[ ]) - AC_MSG_RESULT(no) -]) diff --git a/ext/hyperwave/debug.h b/ext/hyperwave/debug.h deleted file mode 100644 index 5b72dbb194..0000000000 --- a/ext/hyperwave/debug.h +++ /dev/null @@ -1,206 +0,0 @@ -/**************************************************************************** -* -* Copyright (C) 1991 Kendall Bennett. -* All rights reserved. -* -* Filename: $RCSfile$ -* Version: $Revision$ -* -* Language: ANSI C -* Environment: any -* -* Description: General header file for portable code. -* -* $Id$ -* -* Revision History: -* ----------------- -* -* $Log$ -* Revision 1.2 2000/07/02 23:46:41 sas -* Change header protection macros to conform to standard. -* -* Draft 3 of IEEE 1003.1 200x, "2.2 The Compilation Environment" -* -* All identifiers that begin with an underscore and either an uppercase -* letter or another underscore are always reserved for any use by the -* implementation. -* -* Revision 1.1 1999/04/21 23:37:47 ssb -* moved db -* -* Revision 1.1.1.1 1999/04/07 21:03:29 zeev -* PHP 4.0 -* -* Revision 1.1.1.1 1999/03/17 04:29:10 andi -* PHP4 -* -* Revision 1.1.1.1 1998/12/21 07:56:22 andi -* Trying to start the zend CVS tree -* -* Revision 1.1 1998/08/12 09:29:16 steinm -* First version of Hyperwave module. -* -* Revision 1.6 92/03/15 12:51:48 kjb -* Added MK_FP macro and ushort typedef. -* -* Revision 1.5 91/10/28 03:17:33 kjb -* Ported to the Iris. -* -* Revision 1.4 91/09/26 15:29:02 kjb -* Added stuff for the SGI Iris 4D. -* -* Revision 1.3 91/09/26 10:07:04 kjb -* Added general typedef stuff. -* -* Revision 1.2 91/09/03 18:19:14 ROOT_DOS -* Added a few defines that are supplied by <dir.h> for UNIX compatibility. -* -* Revision 1.1 91/08/16 13:19:06 ROOT_DOS -* Initial revision -* -****************************************************************************/ - -#ifndef DEBUG_H -#define DEBUG_H - -#ifdef DEBUG -# define D(x) x -#else -# define D(x) -#endif - -#define PRIVATE static -#define PUBLIC - -#ifdef __MSDOS__ /* Compiling for MSDOS */ -# define MS(x) x -# define UX(x) -# define IR(x) -# define _8086 /* We know we have an 8086 type processor */ -#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__) -# define LDATA -# define NULL 0L -#else -# define NULL 0 -#endif -#else __MSDOS__ -#ifdef __IRIS4D__ /* Compiling for the SGI Iris 4D */ -# define MS(x) -# define UX(x) x /* The Iris is a UNIX machine */ -# define IR(x) x -# define O_BINARY 0 /* no binary input mode in UNIX open() */ -# define MAXFILE 255 /* These are defined in <dir.h>, but */ -# define MAXDIR 255 /* on UNIX machines, we just define */ -# define MAXPATH 255 /* them all to be the same size */ -# define far /* Near and far do not exist under */ -# define near /* UNIX or the Iris. */ -# define NULL ((void *)0) -#else __IRIS4D__ /* Assume UNIX compilation */ -# define MS(x) -# define UX(x) x -# define IR(x) -# define O_BINARY 0 /* no binary input mode in UNIX open() */ -# define MAXFILE 255 /* These are defined in <dir.h>, but */ -# define MAXDIR 255 /* on UNIX machines, we just define */ -# define MAXPATH 255 /* them all to be the same size */ -# define far /* Near and far do not exist under */ -# define near /* UNIX or the Iris. */ -# ifndef NULL -# define NULL ((void *)0) -# endif -#endif __IRIS4D__ -#endif __MSDOS__ - -/**************************************************************************** -* -* SEG(p) Evaluates to the segment portion of an 8086 address. -* OFF(p) Evaluates to the offset portion of an 8086 address. -* FP(s,o) Creates a far pointer given a segment offset pair. -* PHYS(p) Evaluates to a long holding a physical address -* -****************************************************************************/ - -#ifdef _8086 -# define SEG(p) ( ((unsigned *)&(void far *)(p))[1] ) -# define OFF(p) ( (unsigned)(p) ) -# define FP(s,o) ( (void far *)( ((unsigned long)s << 16) + \ - (unsigned long)o )) -# define PHYS(p) ( (unsigned long)OFF(p) + \ - ((unsigned long)SEG(p) << 4)) -#else -# define PHYS(p) (p) -#endif _8086 - -/**************************************************************************** -* -* NUMELE(array) Evaluates to the array size in elements -* LASTELE(array) Evaluates to a pointer to the last element -* INBOUNDS(array,p) Evaluates to true if p points into the array -* RANGE(a,b,c) Evaluates to true if a <= b <= c -* max(a,b) Evaluates to a or b, whichever is larger -* min(a,b) Evaluates to a or b, whichever is smaller -* ABS(a) Evaluates to the absolute value of a -* NBITS(type) Returns the number of bits in a variable of the -* indicated type -* MAXINT Evaluates to the value of the largest signed integer -* -****************************************************************************/ - -#define NUMELE(a) (sizeof(a)/sizeof(*(a))) -#define LASTELE(a) ((a) + (NUMELE(a)-1)) -#ifdef LDATA -#define TOOHIGH(a, p) ((long)PHYS(p) - (long)PHYS(a) > (long)(NUMELE(a)-1)) -#define TOOLOW(a, p) ((long)PHYS(p) - (long)PHYS(a) < 0) -#else -#define TOOHIGH(a, p) ((long)(p) - (long)(a) > (long)(NUMELE(a)-1)) -#define TOOLOW(a, p) ((long)(p) - (long)(a) < 0) -#endif -#define INBOUNDS(a, p) ( ! (TOOHIGH(a, p) || TOOLOW(a, p)) ) - -#define _IS(t, x) (((t)1 << (x)) != 0) /* Evaluates true if the width of */ - /* variable of type t is < x. */ - /* The != 0 assures that the */ - /* answer is 1 or 0 */ - -#define NBITS(t) (4 * (1 + _IS(t, 4) + _IS(t, 8) + _IS(t, 12) + _IS(t, 16) \ - + _IS(t, 20) + _IS(t, 24) + _IS(t, 28) + _IS(t, 32))) - -#define MAXINT (((unsigned)~0) >> 1) - -#ifndef MAX -# define MAX(a, b) ( ((a) > (b)) ? (a) : (b)) -#endif -#ifndef MIN -# define MIN(a, b) ( ((a) < (b)) ? (a) : (b)) -#endif -#ifndef ABS -# define ABS(a) ((a) >= 0 ? (a) : -(a)) -#endif - -#define RANGE(a, b, c) ( (a) <= (b) && (b) <= (c) ) - -/* General typedefs */ - -#ifndef __GENDEFS -#define __GENDEFS -typedef void *ptr; -typedef void near *nearptr; -typedef void far *farptr; -/*typedef unsigned char uchar; -typedef unsigned short ushort; -typedef unsigned int uint; -typedef unsigned long ulong;*/ -typedef int bool; -#endif __GENDEFS - -/* Boolean truth values */ - -#define false 0 -#define true 1 -#define FALSE 0 -#define TRUE 1 -#define NO 0 -#define YES 1 - -#endif /* DEBUG_H */ diff --git a/ext/hyperwave/hg_comm.c b/ext/hyperwave/hg_comm.c deleted file mode 100644 index 5aaae3dcfd..0000000000 --- a/ext/hyperwave/hg_comm.c +++ /dev/null @@ -1,5841 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP Version 4 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2003 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 2.02 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.php.net/license/2_02.txt. | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: Uwe Steinmann <Uwe.Steinmann@fernuni-hagen.de> | - +----------------------------------------------------------------------+ - */ - -/* $Id$ */ - -/* #define HW_DEBUG */ - -#include <stdlib.h> -#include "php.h" -#include "php_globals.h" -#include "SAPI.h" - -#if HYPERWAVE - -#include <stdio.h> -#include <string.h> -#include <sys/types.h> -#ifdef PHP_WIN32 -# include <winsock2.h> -# define EWOULDBLOCK WSAEWOULDBLOCK -# define ETIMEDOUT WSAETIMEDOUT -# define bcopy memcpy -# define bzero(a, b) memset(a, 0, b) -#else -# include <sys/socket.h> -# include <netinet/in.h> -# include <netdb.h> -# include <unistd.h> -# include <sys/param.h> -# include <arpa/inet.h> -#endif -#include <fcntl.h> -#include <errno.h> -#include "hg_comm.h" -#include "ext/standard/head.h" - -/* Defining hw_optimize does optimize the send_objectbyidquery() function. - Instead of getting the complete return message including the objectrecords - with recv_hg_msg(), only the header of the return message is fetched. - The object records itself are fetched as they are needed straight from - the socket. This method requires less memory and is twice as fast because - reading from the net seems to be a bottleneck which has less impact if - the processing of the data is done in parallel. -*/ -#define hw_optimize - -/* Define hw_less_server_stress does reduce the stress on the hw server, by - using send_objectbyidquery() instead of send_getobject() multiple times. - send_objectbyidquery() gets a bunch of object records with one message. - This also reduced the number of lines in the servers log files. - Unfortunately this is not faster unless hw_optimize is defined, because - getting object records with multiple send_getobject() is already optimized. - First all request messages for each object are send and the the answers - are read. This gives the server the possibility to answer request already - while more request are comming in. -*/ -#define hw_less_server_stress - -static int set_nonblocking(int fd); -/* static int set_blocking(int fd); */ - -static int hg_read_exact(int sockfd, char *buf, int size); -/* static int hg_read(int sockfd, char *buf, int size); */ -static int hg_write(int sockfd, char *buf, int size); - -static int send_hg_msg(int sockfd, hg_msg *msg, int length); -static void build_msg_header(hg_msg *msg, int length, int version_msgid, int msg_type); -static char *build_msg_int(char *buf, int val); -static char *build_msg_str(char *buf, char *str); -static int swap(int val); - - -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 the output is investigated. The bit is also - need to allow access on other server through the local - server. The hw_mapid() function won't work unless you - set F_DISTRIBUTED */ -/* 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; -static int swap_on = 0; -static int rtimeout = 40; -static int wtimeout = 40; -static int lowerror = 0; - -/*********************************************************************** -* Function fnInsStr() * -* * -* Insert string in string at position. The old string will be freed * -* with efree!!! The new string is allocated with malloc. * -* Parameter: string *str: string in which insstr is to be inserted * -* int pos: Position where string is to inserted (0=first) * -* string *insstr: string to be inserted * -* Return: pointer to new string or NULL. If NULL is returned the * -* memory for the old string has not been freed. * -***********************************************************************/ -char *fnInsStr(char *str, int pos, char *insstr) -{ - char *newstr, *ptr; - - if((str == NULL) || (insstr == NULL)) - return NULL; - if(pos > (int)strlen(str)) - return NULL; - - if(insstr[0] == '\0') - return str; - - if(NULL == (newstr = malloc(strlen(str) + strlen(insstr) + 1))) { - lowerror = LE_MALLOC; - return NULL; - } - - ptr = newstr; - memcpy(newstr, str, pos); - ptr += pos; - strcpy(ptr, insstr); - ptr += strlen(insstr); - strcpy(ptr, str+pos); - - free(str); - return newstr; -} - -/*********************************************************************** -* Function fnAddAnchor() * -* * -* Inserts new anchor into anchor list. * -* Parameter: DLIST pList: Anchor list * -* int objectID: object ID of Anchor * -* int start: start position * -* int end: end position * -* Return: Pointer to new anchor, NULL if error * -***********************************************************************/ -#ifdef newlist -ANCHOR *fnAddAnchor(zend_llist *pAnchorList, - int objectID, - int start, int end) -#else -ANCHOR *fnAddAnchor(DLIST *pAnchorList, - int objectID, - int start, int end) -#endif -{ - ANCHOR *cur_ptr; - -#ifdef newlist - ANCHOR **ptr; - if(NULL == (cur_ptr = (ANCHOR *) emalloc(sizeof(ANCHOR)))) - return NULL; -#else - if((cur_ptr = (ANCHOR *) dlst_newnode(sizeof(ANCHOR))) == NULL) { - return NULL; - } -#endif - - memset(cur_ptr, 0, sizeof(ANCHOR)); - cur_ptr->start = start; - cur_ptr->end = end; - cur_ptr->id = objectID; - cur_ptr->destdocname = NULL; - cur_ptr->nameanchor = NULL; - cur_ptr->link = NULL; - cur_ptr->tagattr = NULL; - cur_ptr->htmlattr = NULL; - cur_ptr->codebase = NULL; - cur_ptr->code = NULL; - cur_ptr->keyword = NULL; - cur_ptr->fragment = NULL; - -#ifdef newlist - zend_llist_prepend_element(pAnchorList, &cur_ptr); - ptr = (ANCHOR **) zend_llist_get_first(pAnchorList); -#else - dlst_insertafter(pAnchorList, cur_ptr, PHP_DLST_HEAD(pAnchorList)); -#endif - - return(cur_ptr); -} - -/*********************************************************************** -* Function fnDeleteAnchor() * -* * -* Inserts new anchor into anchor list. * -* Parameter: ptr: pointer to node * -* Return: void * -***********************************************************************/ -#ifdef newlist -void fnDeleteAnchor(void *ptr1) -#else -void fnDeleteAnchor(ANCHOR *ptr) -#endif -{ -#ifdef newlist - ANCHOR **ptr2, *ptr; - ptr2 = (ANCHOR **) ptr1; - ptr = *ptr2; -#endif - - if(ptr->destdocname) efree(ptr->destdocname); - if(ptr->nameanchor) efree(ptr->nameanchor); - if(ptr->link) efree(ptr->link); - if(ptr->tagattr) efree(ptr->tagattr); - if(ptr->htmlattr) efree(ptr->htmlattr); - if(ptr->codebase) efree(ptr->codebase); - if(ptr->code) efree(ptr->code); - if(ptr->keyword) efree(ptr->keyword); - if(ptr->fragment) efree(ptr->fragment); - -#ifdef newlist - efree(ptr); -#else - dlst_freenode(ptr); -#endif -} - -/*********************************************************************** -* Function fnListAnchor() * -* * -* Lists all anchors in anchor list. * -* Parameter: ptr: pointer to list * -* Return: void * -***********************************************************************/ -#ifdef newlist -void fnListAnchor(zend_llist *pAnchorList) -#else -void fnListAnchor(DLIST *pAnchorList) -#endif -{ -#ifdef newlist - ANCHOR *cur_ptr, **ptr; - ptr = (ANCHOR **) zend_llist_get_last(pAnchorList); - if(ptr) - cur_ptr = *ptr; - while(ptr) { - fprintf(stderr, "0x%X->0x%X ", (int) ptr, (int) cur_ptr); -#else - ANCHOR *cur_ptr; - cur_ptr = (ANCHOR *) dlst_last(pAnchorList); - while(cur_ptr) { - fprintf(stderr, "0x%X ", (int) cur_ptr); -#endif - - fprintf(stderr, "%d, %d, %s, %s, %s, %s %s\n", cur_ptr->start, - cur_ptr->end, - cur_ptr->tanchor == 1 ? "src" : "dest", - cur_ptr->destdocname, - cur_ptr->nameanchor, - cur_ptr->link, - cur_ptr->tagattr); -#ifdef newlist - ptr = (ANCHOR **) zend_llist_get_prev(pAnchorList); - if(ptr) - cur_ptr = *ptr; -#else - cur_ptr = (ANCHOR *) dlst_prev(cur_ptr); -#endif - } -} - -/*********************************************************************** -* Function fnCmpAnchors() * -* * -* Compares to Anchors by its start position * -* Parameter: ANCHOR a1: First Anchor * -* ANCHOR a2: Second Anchor * -* Return: As strcmp * -***********************************************************************/ -#ifdef newlist -int fnCmpAnchors(const void *e1, const void *e2 TSRMLS_DC) -{ - ANCHOR *a1, **aa1, *a2, **aa2; - zend_llist_element **ee1, **ee2; - ee1 = (zend_llist_element **) e1; - ee2 = (zend_llist_element **) e2; - aa1 = (ANCHOR **) (*ee1)->data; - aa2 = (ANCHOR **) (*ee2)->data; - a1 = *aa1; - a2 = *aa2; -#else -int fnCmpAnchors(ANCHOR *a1, ANCHOR *a2 TSRMLS_DC) -{ -#endif - if(a1->start < a2->start) - return -1; - if(a1->start == a2->start) { - /* It's importent to check this case as well, because a link with - a bigger end has to be inserted first. - */ - if(a1->end < a2->end) - return -1; - /* If both start and end are equal (yes, it is possible) - we will Src Anchor before a Dest anchor. There has been - a case where an IMG was surrounded by a NAME which was - surrounded by a HREF. In such a case the HREF doesn't - work. - */ - if(a1->end == a2->end) { - if(a1->tanchor > a2->tanchor) - return -1; - } - } - - return 1; -} - -/*********************************************************************** -* Function fnCreateAnchorList() * -* Uses either docofanchorrec or reldestrec to create a list of anchors * -* depending on anchormode * -* * -* Returns a list of Anchors converted from an object record * -* Parameter: int objectID: the object for which the list is created * -* char **anchors: object records of anchors * -* char **docofanchorrec: Name of destination absolut * -* char **reldestrec: Name of destination relativ to current * -* object * -* int ancount: number of anchors * -* int anchormode: 0 = use absolut dest, else rel. dest * -* Return: List of Anchors, NULL if error * -***********************************************************************/ -#ifdef newlist -zend_llist *fnCreateAnchorList(hw_objectID objID, char **anchors, char **docofanchorrec, char **reldestrec, int ancount, int anchormode) -#else -DLIST *fnCreateAnchorList(hw_objectID objID, char **anchors, char **docofanchorrec, char **reldestrec, int ancount, int anchormode) -#endif -{ - int start, end, i, destid, anchordestid, objectID; - ANCHOR *cur_ptr = NULL; -#ifdef newlist - zend_llist *pAnchorList; - pAnchorList = (zend_llist *) emalloc(sizeof(zend_llist)); - zend_llist_init(pAnchorList, sizeof(char *), fnDeleteAnchor, 0); -#else - DLIST *pAnchorList = dlst_init(); -#endif - - for(i=ancount-1; i>=0; i--) { - char *object = NULL; - char *docofanchorptr = NULL; - char *reldestptr = NULL; - char *str, *str1, link[200]; - - if(NULL != anchors[i]) { - object = anchors[i]; - docofanchorptr = docofanchorrec[i]; - if(reldestrec) /* FIXME reldestrec may only be NULL if anchormode != 0 */ - reldestptr = reldestrec[i]; - - /* 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; - if(((int) str != 9) && (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; - - /* 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) { - destid = 0; - if(NULL != (str = strstr(tempptr, "ObjectID="))) { - str += 9; - sscanf(str, "0x%X", &destid); - } - /* This is basically for NAME tags. There is no need - to add the destname if it is the document itself. - */ -/* if(destid == objID) { - cur_ptr->destdocname = NULL; - } else { */ - /* 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); - } -/* } */ - } - } - - /* 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) { - if(NULL != (str = strstr(object, "Dest="))) { - str += 5; - 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); - } - - { - char *htmlattr, *str2; - int offset; - str1 = object; - htmlattr = emalloc(strlen(object)); /* alloc mem big enough for htmlattr */ - htmlattr[0] = '\0'; - offset = 0; - while(NULL != (str = strstr(str1, "HtmlAttr="))) { - str += 9; - str1 = str; - while((*str1 != '\n') && (*str1 != '\0')) - str1++; - /* Find the '=' in the HTML attr and make sure it is part of the - attr and not somewhere in the objrec. */ - if((NULL != (str2 = strchr(str, '='))) && (str2 < str1)) { - str2++; - strncpy(&htmlattr[offset], str, str2 - str); - offset = offset + (str2 - str); - htmlattr[offset++] = '"'; - strncpy(&htmlattr[offset], str2, str1 - str2); - offset = offset + (str1 - str2); - htmlattr[offset++] = '"'; - htmlattr[offset++] = ' '; - htmlattr[offset] = '\0'; - } - } - if(offset){ - /* remove last space */ - htmlattr[offset-1] = '\0'; - cur_ptr->htmlattr = estrdup(htmlattr); - } - efree(htmlattr); - } - - if(NULL != (str = strstr(object, "LinkType="))) { - str += 9; - if(strncmp(str, "background", 10) == 0) - cur_ptr->linktype=HW_BACKGROUND_LINK; - else - if(strncmp(str, "intagnodel", 10) == 0) { /* New type introduced by Uwe Steinmann 16.03.2001 */ - cur_ptr->linktype=HW_INTAGNODEL_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, "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 { /* 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); - } - - } - - } - /* free memory even if it is an invisible anchor */ - efree(anchors[i]); - if(docofanchorrec[i]) efree(docofanchorrec[i]); - if(reldestrec) - if(reldestrec[i]) efree(reldestrec[i]); - } - } - return pAnchorList; -} - -/*********************************************************************** -* Function fnInsAnchorsIntoText() * -* * -* Returns the text document with all anchors inserted form list * -* Parameter: char *text: text without anchors * -* DList *pAnchorList: list of anchors * -* Return: Text with anchors * -***********************************************************************/ -#define BUFFERLEN 200 -#ifdef newlist -char *fnInsAnchorsIntoText(char *text, zend_llist *pAnchorList, char **bodytag, char **urlprefix) { - ANCHOR **ptr; -#else -char *fnInsAnchorsIntoText(char *text, DLIST *pAnchorList, char **bodytag, char **urlprefix) { -#endif - ANCHOR *cur_ptr; - char bgstr[BUFFERLEN], istr[BUFFERLEN]; - char **scriptname; - char *newtext; - int offset = 0; - int laststart=0; - char emptystring[BUFFERLEN]; - int i; - TSRMLS_FETCH(); - - emptystring[0] = '\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() or hw_pipedocument(). - FIXME: Currently, the variable SCRIPT_NAME is empty thouht SCRIPT_URL is - not. In our case this is OK, since as mentioned above it is better to have no - SCRIPT_NAME than to have if rewriting is on. -*/ - if(urlprefix) { - scriptname = urlprefix; - } else { - zval **script_name; - scriptname = emalloc(5*sizeof(char *)); - if (zend_hash_find(&EG(symbol_table), "SCRIPT_NAME", sizeof("SCRIPT_NAME"), (void **) &script_name)==FAILURE) - for(i=0; i<5; i++) - scriptname[i] = &emptystring; - else { - convert_to_string_ex(script_name); - for(i=0; i<5; i++) - scriptname[i] = Z_STRVAL_PP(script_name); - } - -#if 0 -#if APACHE - { - 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")) || - (0 == strcmp(elts[j].key, "SCRIPT_URL"))) - break; - } - scriptname = elts[j].val; - } -#else - scriptname = getenv("SCRIPT_FILENAME"); -#endif -#endif - } - - newtext = text; - bgstr[0] = '\0'; -#ifdef newlist - zend_llist_sort(pAnchorList, fnCmpAnchors TSRMLS_CC); - ptr = (ANCHOR **) zend_llist_get_last(pAnchorList); - if(ptr) - cur_ptr = *ptr; - while(NULL != ptr) { -#else - dlst_mergesort(pAnchorList, fnCmpAnchors); - cur_ptr = (ANCHOR *) dlst_last(pAnchorList); - while(NULL != cur_ptr) { -#endif - - istr[0] = '\0'; - if(cur_ptr->tanchor == 1) { /* Src Anchor */ - if(laststart >= cur_ptr->end) - offset = 0; - if((cur_ptr->link != NULL) && (cur_ptr->link[0] != '\0')) { - /* The link is only set if the Link points to an external document */ - switch(cur_ptr->linktype) { - case HW_BACKGROUND_LINK: - snprintf(istr, BUFFERLEN, " background='%s'", cur_ptr->link); - break; - case HW_INTAG_LINK: - snprintf(istr, BUFFERLEN, " %s='%s'", cur_ptr->tagattr, cur_ptr->link); - offset -= 4; /* because there is no closing tag </A> */ -/* laststart = cur_ptr->start; */ - break; - case HW_INTAGNODEL_LINK: - snprintf(istr, BUFFERLEN, "%s", cur_ptr->link); - offset -= 4; /* because there is no closing tag </A> */ -/* laststart = cur_ptr->start; */ - break; - case HW_APPLET_LINK: - if(cur_ptr->codebase) - snprintf(istr, BUFFERLEN, " CODEBASE='%s' CODE='%s'", cur_ptr->codebase, cur_ptr->code); - else - snprintf(istr, BUFFERLEN, " CODEBASE='/' CODE='%s'", cur_ptr->code); - break; - default: - newtext = fnInsStr(newtext, cur_ptr->end+offset, "</A>"); - if(cur_ptr->fragment) - snprintf(istr, BUFFERLEN, "<A HREF='%s#%s'", cur_ptr->link, cur_ptr->fragment); - else - snprintf(istr, BUFFERLEN, "<A HREF='%s'", cur_ptr->link); - if(cur_ptr->htmlattr) { - strncat(istr, " ", BUFFERLEN - 1 - strlen(istr)); - strncat(istr, cur_ptr->htmlattr, BUFFERLEN - 1 - strlen(istr)); - } - strncat(istr, ">", BUFFERLEN - 1 - strlen(istr)); - } - } else { - switch(cur_ptr->linktype) { - case HW_BACKGROUND_LINK: - if(NULL != cur_ptr->destdocname) { - snprintf(istr, BUFFERLEN, " background='%s/%s'", scriptname[HW_BACKGROUND_LINK], cur_ptr->destdocname); - } else - istr[0] = '\0'; - break; - case HW_INTAG_LINK: - if(cur_ptr->fragment) - snprintf(istr, BUFFERLEN, " %s='#%s'", cur_ptr->tagattr, cur_ptr->fragment); - else - snprintf(istr, BUFFERLEN, " %s='%s/%s'", cur_ptr->tagattr, scriptname[HW_INTAG_LINK], cur_ptr->destdocname); - offset -= 4; /* because there is no closing tag </A> */ - break; - case HW_INTAGNODEL_LINK: - snprintf(istr, BUFFERLEN, "%s", cur_ptr->destdocname); - offset -= 4; /* because there is no closing tag </A> */ - break; - case HW_APPLET_LINK: - if(cur_ptr->codebase) -/* snprintf(istr, BUFFERLEN, " CODEBASE='%s%s' CODE='%s'", scriptname == NULL ? "" : scriptname, cur_ptr->codebase, cur_ptr->code); */ - snprintf(istr, BUFFERLEN, " CODEBASE='%s%s' CODE='%s'", scriptname[HW_APPLET_LINK], cur_ptr->codebase, cur_ptr->code); - else - snprintf(istr, BUFFERLEN, " CODEBASE='/' CODE='%s'", cur_ptr->code); - break; - default: - newtext = fnInsStr(newtext, cur_ptr->end+offset, "</A>"); - - if(cur_ptr->nameanchor) - snprintf(istr, BUFFERLEN, "<A HREF='%s/%s#%s'", scriptname[HW_DEFAULT_LINK], cur_ptr->destdocname, cur_ptr->nameanchor); - else if(cur_ptr->fragment) - snprintf(istr, BUFFERLEN, "<A HREF=\"%s/%s#%s\"", scriptname[HW_DEFAULT_LINK], cur_ptr->destdocname, cur_ptr->fragment); - else - snprintf(istr, BUFFERLEN, "<A HREF='%s/%s'", scriptname[HW_DEFAULT_LINK], cur_ptr->destdocname); - - if(cur_ptr->htmlattr) { - strncat(istr, " ", BUFFERLEN - 1 - strlen(istr)); - strncat(istr, cur_ptr->htmlattr, BUFFERLEN - 1 - strlen(istr)); - } - strncat(istr, ">", BUFFERLEN - 1 - strlen(istr)); - } - } - } else { - if(laststart >= cur_ptr->end) - offset = 0; - newtext = fnInsStr(newtext, cur_ptr->end+offset, "</a>"); - - /* If we have a keyword, we assume we had a fragment which has been used - instead of the destdocname - */ - if(cur_ptr->keyword) - snprintf(istr, BUFFERLEN, "<A NAME='%s'>", cur_ptr->keyword); - else if(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> */ - offset += strlen(istr) + 4; - laststart = cur_ptr->start; -#ifdef newlist - ptr = (ANCHOR **) zend_llist_get_prev(pAnchorList); - if(ptr) - cur_ptr = *ptr; -#else - cur_ptr = (ANCHOR *) dlst_prev(cur_ptr); -#endif - } - snprintf(istr, BUFFERLEN, "<BODY %s>", bgstr); - *bodytag = estrdup(istr); -/* if(scriptname != urlprefix) efree(scriptname); */ - if(scriptname != NULL) efree(scriptname); - return(newtext); -} -#undef BUFFERLEN - -/*********************************************************************** -* Function fnAttributeValue() * -* * -* Returns the value of an attribute * -* Parameter: char *object: object record * -* char *attrname: attribute name * -* Return: char*: attribute value, NULL if name not found * -***********************************************************************/ -char *fnAttributeValue(char *object, char *attrname) -{ - char *str, *str1, *attrvalue; - int len; - - str = strstr(object, attrname); - if(NULL == str) - return(NULL); - str += strlen(attrname); - str++; - str1 = str; - while((*str1 != '\0') && (*str1 != '\n')) - str1++; - len = str1 - str; - if(NULL == (attrvalue = emalloc(len+1))) { - lowerror = LE_MALLOC; - return NULL; - } - memcpy(attrvalue, str, len); - attrvalue[len] = '\0'; - return(attrvalue); -} - -/*********************************************************************** -* Function fnAttributeCompare() * -* * -* Checks if an attribute in an objrec has a certain value * -* Parameter: char *object: object record * -* char *attrname: attribute name * -* char *value: value of attribute * -* Return: char*: as strcmp * -***********************************************************************/ -int fnAttributeCompare(char *object, char *attrname, char *value) -{ - char *str, *str1; - int len; - - if((NULL == object) || (NULL == attrname) || (NULL == value)) - return -2; - - /* Find the attribute Name and make sure it is followed by - a '=' sign and preceded by a '\n'; - */ - str = strstr(object, attrname); - if((NULL == str) || - (str[strlen(attrname)] != '=') || - (str[-1] != '\n')) { - return(-2); - } - str += strlen(attrname); /* skip the attribute name */ - str++; /* skip the equal sign */ - - /* Search for end of attribute value */ - str1 = str; - while((*str1 != '\0') && (*str1 != '\n')) - str1++; - len = str1 - str; - return(strncmp(str, value, len)); -} - -/********************************************************************* -* Function fnCOpenDataCon() * -* * -* Opens data connection on client side. This function is called * -* right after the client has requested any data from the server * -* Parameter: int sockfd: socket of control connection * -* int *port: port of control und data connection * -* Return : sockfd on success, <0 if error * -*********************************************************************/ -static int fnCOpenDataCon(int sockfd, int *port) - { - int fd; - struct sockaddr_in serv_addr; - int len; - int option = 1; - -/* len = sizeof(com_addr); - if(getsockname(sockfd, (struct sockaddr *) &com_addr, &len) < 0) - { - return(-1); - } - - *port = htons(com_addr.sin_port); */ - - /* - ** Open a TCP socket (an Internet stream socket) - */ - if((fd = socket(AF_INET, SOCK_STREAM, 0)) == SOCK_ERR) - { - return(-1); - } - - /* - ** Make sure that address may be reused - */ -#if defined(SUN) || defined(PHP_WIN32) - setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&option, sizeof(option)); -#else - setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option)); -#endif - - /* - ** Open connection aktiv - ** Let bind() select a port number - */ - bzero((char *) &serv_addr, sizeof(serv_addr)); - if(bind(fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) - { - return(-1); - } - - /* - ** Get the port number bind selected - */ - len = sizeof (serv_addr); - if(getsockname(fd, (struct sockaddr *)&serv_addr, &len) < 0) - { - return(-1); - } - *port = ntohs(serv_addr.sin_port); - - listen(fd, 5); - - return(fd); - } - -/*====================================================================== - * - * Read/write routines with timeout detection. - * - * Usage: write_to(fd, buffer, n, timeout) - * read_to(fd, buffer, n, timeout) - * - * David Chavez - * Engineering Services & Software - * 7841 New Salem Street - * San Diego, CA 92126 - * USA - * - * dec@essw.com - * - *====================================================================*/ -#ifdef PHP_WIN32 -#include <time.h> -#else -#include <sys/fcntl.h> -#include <sys/time.h> -#include <sys/types.h> -#endif -#include <errno.h> -#include <signal.h> - -#ifndef PHP_WIN32 -static sigset_t newmask, oldmask, zeromask; -#endif - -static int set_noblock(int fd) -{ -#ifdef PHP_WIN32 - u_long argp=1; - - return ioctlsocket (fd, FIONBIO , &argp); -#else - - sigemptyset(&zeromask); - sigemptyset(&newmask); - sigaddset(&newmask, SIGHUP); - sigaddset(&newmask, SIGUSR1); - sigaddset(&newmask, SIGUSR2); - if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) return -1; - - return fcntl(fd, F_SETFL, O_NONBLOCK | O_NDELAY /* | FNBIO*/); -#endif -} - -int write_to(int fd, void *buffer, int n, int timeout) -{ - int nrem, nw=0; - char *bptr; - int error=0; -#if defined(SYSV) || defined(PHP_WIN32) - int width = 20; -#else - int width = getdtablesize(); -#endif - fd_set writefds; - struct timeval select_timeout; - - select_timeout.tv_sec = timeout; -#ifdef PHP_WIN32 - select_timeout.tv_usec = 0; -#else /* is this just a typo? */ - select_timeout.tv_usec = 0.; -#endif - - /* Set fd to non-blocking */ - - if (set_noblock(fd) != 0) return -1; - - /* Write to fd until no more can be written */ - - FD_ZERO(&writefds); - - FD_SET((unsigned int)fd, &writefds); - - for( nrem = n, bptr = buffer; nrem;) - { - if(( error = select(width, - (fd_set *) 0, - &writefds, - (fd_set *) 0, - &select_timeout)) <= 0 && errno != EINTR) break; - - if(errno != EINTR && ( nw = write(fd, bptr, nrem)) <= 0) { - /* - * check for error number - and keep trying to - * write - */ - if(errno == EWOULDBLOCK || errno == EAGAIN || errno == EINTR) - { - continue; - } - else - { - error = nw; - break; - } - } else { - nrem -= nw; - bptr += nw; - } - } -#ifndef PHP_WIN32 - if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) return -1; -#endif - if( ! error ) { - errno = ETIMEDOUT; - return(-2); - } else if (error < 0) { - return(error); - } else { - return(n); - } -} - -int read_to(int fd, char *buffer, int n, int timeout) - { - int nrem, nread, nr=0; - char *bptr; - int error=0; - -#if defined(SYSV) || defined(PHP_WIN32) - int width = 20; -#else - int width = getdtablesize(); -#endif - fd_set readfds; - struct timeval select_timeout; - - select_timeout.tv_sec = timeout; -#ifdef PHP_WIN32 - select_timeout.tv_usec = 0; -#else - select_timeout.tv_usec = 0.; -#endif - - /* Set fd to non-blocking */ - - if (set_noblock(fd) != 0) return -1; - - FD_ZERO(&readfds); - - FD_SET((unsigned int)fd, &readfds); - - for( nrem = n, bptr = buffer, nread = 0; nrem;) - { - if(( error = select(width, - &readfds, - (fd_set *) 0, - (fd_set *) 0, - &select_timeout)) <= 0 && errno != EINTR) break; - - if(errno != EINTR && (nr = read (fd, bptr, nrem)) < 0) - { - /* - * check for error number - and keep trying to - * read - */ - if(errno == EWOULDBLOCK || errno == EAGAIN || errno == EINTR) - { - continue; - } - else - { - error = nr; - break; - } - } - else if(nr == 0) - { - break; - } - else - { - nread += nr; - bptr += nr; - nrem -= nr; - } - } - -#ifndef PHP_WIN32 - if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) return -1; -#endif - if( ! error ) - { - errno = ETIMEDOUT; - return(-2); - } - else if ( error < 0) - { - return(-1); - } - else - { - return(nread); - } - } - -void set_swap(int do_swap) -{ - swap_on = do_swap; -} - -/*********************************************************************** -* Function open_hg_connection() * -* * -***********************************************************************/ -int open_hg_connection(char *server_name, int port) -{ - int sockfd; - int option = 1; - struct sockaddr_in server_addr; - struct hostent *hp; - - if ( NULL == server_name ) - return(-1); - - if ( (hp = gethostbyname(server_name)) == NULL ) { - return(-2); - } - - bzero((char *)&server_addr, sizeof(server_addr)); - server_addr.sin_family = AF_INET; - if ( port != 0 ) - server_addr.sin_port = htons(port); - else - server_addr.sin_port = htons(HG_SERVER_PORT); -/* bcopy(hp->h_addr, (char *) &server_addr.sin_addr, hp->h_length); */ - server_addr.sin_addr = *(struct in_addr *) hp->h_addr; - - if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == SOCK_ERR ) { - return(-3); - } - -#if defined(SUN) || defined(PHP_WIN32) - setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&option, sizeof(option)); -#else - setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option)); -#endif /* SUN */ - - if (connect(sockfd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) { - HWSOCK_FCLOSE(sockfd); - return(-4); - } - -#ifndef PHP_WIN32 - if ( (sock_flags = fcntl(sockfd, F_GETFL, 0)) == -1 ) -#endif - - if ( set_nonblocking(sockfd) == -1 ) { - HWSOCK_FCLOSE(sockfd); - return(-5); - } - - return(sockfd); -} - - -/*********************************************************************** -* Function initialize_hg_connection() * -* * -***********************************************************************/ -int initialize_hg_connection(int sockfd, int *do_swap, int *version, char **userdata, char **server_string, char *username, char *password) -{ - char buf, c; - char *tmp; - hg_msg *ready_msg, *retmsg, msg; - int i = 0x01; - int length; - - *do_swap = 0; - buf = 'T'; - if ( hg_write(sockfd, &buf, 1) == -1 ) { - return(-2); - } - - if ( hg_read_exact(sockfd, &buf, 1) == -1 ) { - return(-3); - } - if ( buf == 'F' ) { - return(-4); - } - if ( buf != 'T' ) { - return(-5); - } - - buf = c = ( *(char *)&i ) ? 'l' : 'B'; - if ( hg_write(sockfd, &buf, 1) == -1 ) { - return(-6); - } - if ( hg_read_exact(sockfd, &buf, 1) == -1 ) { - return(-7); - } - if ( c != buf ) { - swap_on = 1; - *do_swap = 1; - } else { - swap_on = 0; - *do_swap = 0; - } - - if ( send_ready(sockfd) == -1) { - return(-8); - } - - /* Receive return from Ready message */ - if ( (ready_msg = recv_ready(sockfd)) == NULL ) { - return(-9); - } - - if ((ready_msg->version_msgid & F_VERSION) < HW_VERSION) - return(-8); - *version = ready_msg->version_msgid; - *server_string = strdup(ready_msg->buf+4); - efree(ready_msg->buf); - efree(ready_msg); - - /* If we have a username and password then do the identification. */ - if((NULL != username) && (NULL != password)) { - length = HEADER_LENGTH + sizeof(int) + strlen(username) + 1 + strlen(password) + 1; - - build_msg_header(&msg, length, msgid++, IDENTIFY_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_int(msg.buf, 0); - tmp = build_msg_str(tmp, username); - tmp = build_msg_str(tmp, password); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - return(-10); - } - efree(msg.buf); - } - - if((NULL != username) && (NULL != password)) { - /* Receive return form identify message */ - retmsg = recv_hg_msg(sockfd); - if ( retmsg == NULL ) - return(-11); - - *userdata = retmsg->buf; - efree(retmsg); - } - - return(0); -} - - -static int set_nonblocking(int fd) -{ -#ifdef PHP_WIN32 - unsigned int argp=0; - -/* if ( sock_flags == -1 ) - getsockopt (fd, SOL_SOCKET, optname, optval, optlen); -*/ if(ioctlsocket (fd, FIONBIO , &argp) == -1) - return(-1); -#else - if ( sock_flags == -1 ) - sock_flags = fcntl(fd, F_GETFL, 0); - if ( fcntl(fd, F_SETFL, O_NONBLOCK) == -1 ) - return(-1); -#endif - non_blocking = 1; - return(0); -} - - -/* -static int set_blocking(int fd) -{ -#ifdef PHP_WIN32 - unsigned int argp=1; - - if(ioctlsocket (fd, FIONBIO , &argp) == -1) - return(-1); -#else - if ( fcntl(fd, F_SETFL, sock_flags) == -1 ) - return(-1); -#endif - return(0); -} -*/ - -static int hg_read_exact(int sockfd, char *buf, int size) -{ - int len = 0; - - len = read_to(sockfd, (void *) buf, size, rtimeout); - if ( len < 0 ) - return -1; - return(len); -} - -/* -static int hg_read(int sockfd, char *buf, int size) -{ - int try = 0; - int len = 0; - - if ( !non_blocking ) - set_nonblocking(sockfd); - while ( len == 0 ) { - len = recv(sockfd, (void *) buf, size, 0); - if ( len == -1 ) { - if ( (errno == EAGAIN) || (errno == EWOULDBLOCK) ) { - if ( ++try > 5 ) - return(-1); - php_sleep(1); - } - else return(-1); - } - } - return(len); -} -*/ - -static int hg_write(int sockfd, char *buf, int size) -{ - int try = 0; - int len = 0; - - if ( !non_blocking ) - set_nonblocking(sockfd); - while ( size > 0 ) { - len = send(sockfd, (void *) buf, size, 0); - if ( len == -1 ) { - if ( (errno == EAGAIN) || (errno == EWOULDBLOCK) ) { - if ( ++try > 5 ) - return(-1); - php_sleep(1); - } - else return(-1); - } - else { - size -= len; - buf += len; - try = 0; - } - } - return(0); -} - -hg_msg *recv_hg_msg_head(int sockfd) -{ - hg_msg *msg; - - if ( (msg = (hg_msg *)emalloc(sizeof(hg_msg))) == NULL ) { - lowerror = LE_MALLOC; - return(NULL); - } - - if ( hg_read_exact(sockfd, (char *)&(msg->length), 4) == -1 ) { - efree(msg); - return(NULL); - } - - if ( hg_read_exact(sockfd, (char *)&(msg->version_msgid), 4) == -1 ) { - efree(msg); - return(NULL); - } - - if ( hg_read_exact(sockfd, (char *)&(msg->msg_type), 4) == -1 ) { - efree(msg); - return(NULL); - } - -#ifdef HW_DEBUG - php_printf("<b> Recv msg: </b>type = %d -- id = %d<br />\n", msg->msg_type, msg->version_msgid); -#endif - return(msg); -} - - -hg_msg *recv_hg_msg(int sockfd) -{ - hg_msg *msg; - - if ( (msg = (hg_msg *)emalloc(sizeof(hg_msg))) == NULL ) { -/* php_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"); */ - 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"); */ - 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"); */ - efree(msg); - return(NULL); - } - - if ( msg->length > HEADER_LENGTH ) { - if ( (msg->buf = (char *) emalloc(msg->length-HEADER_LENGTH)) == NULL ) { -/* php_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"); */ - efree(msg->buf); - efree(msg); - return(NULL); - } - } - else - msg->buf = NULL; - -#ifdef HW_DEBUG - php_printf("<b> Recv msg: </b>type = %d -- id = %d<br />\n", msg->msg_type, msg->version_msgid); -#endif - return(msg); -} - - -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"); */ - 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); */ - efree(ready_msg); - return(NULL); - } - - return(ready_msg); -} - - -hg_msg *recv_command(int sockfd) -{ - hg_msg *comm_msg; - - if ( (comm_msg = recv_hg_msg(sockfd)) == NULL ) { -/* fprintf(stderr, "recv_command: recv_hg_msg returned NULL\n"); */ - return(NULL); - } - if ( comm_msg->msg_type != COMMAND_MESSAGE ) { -/* fprintf(stderr, "recv_command: recv_hg_msg returned wrong message\n"); */ - return(NULL); - } - - return(comm_msg); -} - -int send_dummy(int sockfd, hw_objectID objectID, int msgid, char **attributes) -{ - hg_msg msg, *retmsg; - int length, error; - char *tmp; - - length = HEADER_LENGTH + sizeof(hw_objectID); - - build_msg_header(&msg, length, msgid++, msgid); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - 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 ) { - *attributes = NULL; - return(-1); - } - - if(0 == (int) *(retmsg->buf)) { - *attributes = estrdup(retmsg->buf+sizeof(int)); - efree(retmsg->buf); - efree(retmsg); - } else { - error = *((int *) retmsg->buf); - *attributes = NULL; - efree(retmsg->buf); - efree(retmsg); - return error; - } - - return(0); -} - -static int bh_send_deleteobject(int sockfd, hw_objectID objectID) { - hg_msg msg; - int length; - char *tmp; - - length = HEADER_LENGTH + sizeof(hw_objectID); - - build_msg_header(&msg, length, msgid++, DELETEOBJECT_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - 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); - - return(msgid-1); -} - -static int uh_send_deleteobject(int sockfd) { - hg_msg *retmsg; - int error; - - retmsg = recv_hg_msg(sockfd); - if ( retmsg == NULL ) { - return(-1); - } - - if(NULL == retmsg->buf) { - efree(retmsg); - return -1; - } - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return(error); -} - -int send_deleteobject(int sockfd, hw_objectID objectID) -{ - if(0 > bh_send_deleteobject(sockfd, objectID)) - return -1; - return(uh_send_deleteobject(sockfd)); -} - -static int bh_send_changeobject(int sockfd, hw_objectID objectID, char *mod) { - hg_msg msg; - int length; - char *tmp; - - length = HEADER_LENGTH + sizeof(hw_objectID) + strlen(mod) + 1; - - build_msg_header(&msg, length, msgid++, CHANGEOBJECT_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_int(msg.buf, objectID); - tmp = build_msg_str(tmp, mod); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - return(-1); - } - efree(msg.buf); - - return(msgid-1); -} - -static int uh_send_changeobject(int sockfd) { - hg_msg *retmsg; - int error; - - retmsg = recv_hg_msg(sockfd); - if ( retmsg == NULL ) { - return(-1); - } - - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return(error); -} - -int send_changeobject(int sockfd, hw_objectID objectID, char *modification) -{ - if(0 > bh_send_changeobject(sockfd, objectID, modification)) - return -1; - 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; - char *tmp; - - length = HEADER_LENGTH + sizeof(hw_objectID); - - build_msg_header(&msg, length, msgid++, GETOBJECT_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); - - return(msgid-1); -} - -static int uh_send_getobject(int sockfd, char **attributes) { - hg_msg *retmsg; - int error; - - retmsg = recv_hg_msg(sockfd); - if ( retmsg == NULL ) { - *attributes = NULL; - return(-1); - } - - if(0 == (int) *(retmsg->buf)) { - *attributes = estrdup(retmsg->buf+sizeof(int)); - efree(retmsg->buf); - efree(retmsg); - } else { - error = *((int *) retmsg->buf); - *attributes = NULL; - efree(retmsg->buf); - efree(retmsg); - return error; - } - - return(0); -} - -int send_getobject(int sockfd, hw_objectID objectID, char **attributes) -{ - if(0 > bh_send_getobject(sockfd, objectID)) - return -1; - return(uh_send_getobject(sockfd, attributes)); -} - -int send_getandlock(int sockfd, hw_objectID objectID, char **attributes) -{ - 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 ) { -/* perror("send_command"); */ - 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 ) { - *attributes = NULL; - return(-1); - } - - if(0 == (error = (int) *(retmsg->buf))) { - *attributes = estrdup(retmsg->buf+sizeof(int)); - } else { - *attributes = NULL; - } - - efree(retmsg->buf); - efree(retmsg); - 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; - int length, error; - char *tmp; - int *ptr; - - length = HEADER_LENGTH + strlen(objrec) + 1 + strlen(parms) + 1; - - build_msg_header(&msg, length, msgid++, INSERTOBJECT_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_str(msg.buf, objrec); - tmp = build_msg_str(tmp, parms); -/*fprintf(stderr, "objrec = %s, parms = %s\n", objrec, parms); */ - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - return(-1); - } - - efree(msg.buf); - retmsg = recv_hg_msg(sockfd); - if ( retmsg == NULL ) { - *objectID = 0; - return(-1); - } - - ptr = (int *) retmsg->buf; - if(0 == (error = *ptr)) { - ptr++; - *objectID = *ptr; - } else { - *objectID = 0; - } - efree(retmsg->buf); - efree(retmsg); - return error; -} - -int send_unlock(int sockfd, hw_objectID objectID) -{ - hg_msg msg; - int length; - char *tmp; - - length = HEADER_LENGTH + sizeof(hw_objectID); - - build_msg_header(&msg, length, msgid++, UNLOCK_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - 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); - return 0; -} - -int send_incollections(int sockfd, int retcol, int cobjids, hw_objectID *objectIDs, int ccollids, hw_objectID *collIDs, int *count, hw_objectID **retIDs) -{ - hg_msg msg, *retmsg; - int length, error; - char *tmp; - int *ptr, *ptr1, i; - - length = HEADER_LENGTH + sizeof(hw_objectID) + (cobjids + ccollids) * sizeof(hw_objectID) + 2 * sizeof(int); - - build_msg_header(&msg, length, msgid++, INCOLLECTIONS_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { - lowerror = LE_MALLOC; - return(-3); - } - - tmp = build_msg_int(msg.buf, retcol); - tmp = build_msg_int(tmp, cobjids); - for(i=0; i<cobjids; i++) - tmp = build_msg_int(tmp, objectIDs[i]); - tmp = build_msg_int(tmp, ccollids); - for(i=0; i<ccollids; i++) - tmp = build_msg_int(tmp, collIDs[i]); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - return(-2); - } - - 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) { - *count = *ptr; - ptr++; - if(NULL != (*retIDs = emalloc(*count * sizeof(hw_objectID)))) { - ptr1 = *retIDs; - for(i=0; i<*count; ptr++, i++) - ptr1[i] = *ptr; - efree(retmsg->buf); - efree(retmsg); - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - error = *((int *) retmsg->buf); - if(retmsg->buf) efree(retmsg->buf); - if(retmsg) efree(retmsg); - return error; - } - return(0); -} - - -int send_inscoll(int sockfd, hw_objectID objectID, char *objrec, hw_objectID *new_objectID) -{ - hg_msg msg, *retmsg; - int length, error; - char *tmp; - int *ptr; - - length = HEADER_LENGTH + sizeof(hw_objectID) + strlen(objrec) + 1; - - build_msg_header(&msg, length, msgid++, INSCOLL_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { - lowerror = LE_MALLOC; - return(-3); - } - - tmp = build_msg_int(msg.buf, objectID); - tmp = build_msg_str(tmp, objrec); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - return(-2); - } - - efree(msg.buf); - retmsg = recv_hg_msg(sockfd); - if(retmsg == NULL) { - return(-1); - } - - ptr = (int *) retmsg->buf; - if(0 != (error = *ptr)) { - efree(retmsg->buf); - efree(retmsg); - *new_objectID = 0; - return error; - } - - ptr++; - *new_objectID = *ptr; - efree(retmsg->buf); - efree(retmsg); - return 0; -} - -int send_insdoc(int sockfd, hw_objectID objectID, char *objrec, char *text, hw_objectID *new_objectID) -{ - hg_msg msg, *retmsg; - int length, error; - char *tmp; - int *ptr; - - length = HEADER_LENGTH + sizeof(hw_objectID) + strlen(objrec) + 1; - if(text) { - length += strlen(text); - length++; - } - - build_msg_header(&msg, length, msgid++, INSDOC_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { - lowerror = LE_MALLOC; - return(-3); - } - - tmp = build_msg_int(msg.buf, objectID); - tmp = build_msg_str(tmp, objrec); - if(text) - tmp = build_msg_str(tmp, text); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - return(-2); - } - - efree(msg.buf); - retmsg = recv_hg_msg(sockfd); - if(retmsg == NULL) { - return(-1); - } - - ptr = (int *) retmsg->buf; - if(0 != (error = *ptr)) { - efree(retmsg->buf); - efree(retmsg); - *new_objectID = 0; - return error; - } - - ptr++; - *new_objectID = *ptr; - efree(retmsg->buf); - efree(retmsg); - return 0; -} - -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, char *urlprefix) -{ - hg_msg msg, *retmsg; - int length, *ptr, ancount, error; - char *tmp, *attributes, *documenttype; - char **anchors; - int i; - - length = HEADER_LENGTH + sizeof(hw_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); - } - - 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) { - attributes = NULL; - return(-1); - } - - ptr = (int *) retmsg->buf; - if(*ptr == 0) { - attributes = estrdup(retmsg->buf+sizeof(int)); - efree(retmsg->buf); - efree(retmsg); - } else { - error = *ptr; - attributes = NULL; - efree(retmsg->buf); - efree(retmsg); - return error; - } - - length = HEADER_LENGTH + strlen(attributes) + 1; - build_msg_header(&msg, length, msgid++, GETTEXT_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_str(msg.buf, attributes); - - documenttype = fnAttributeValue(attributes, "DocumentType"); - *objattr = strdup(attributes); - efree(attributes); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - return(-1); - } - - efree(msg.buf); - retmsg = recv_hg_msg(sockfd); - if (retmsg == NULL) { - *text = NULL; - return(-1); - } - - ptr = (int *) retmsg->buf; - if(*ptr == 0) { - ptr++; - *count = retmsg->length-HEADER_LENGTH-sizeof(int); - if(NULL != (*text = malloc(*count + 1))) { - memcpy(*text, retmsg->buf+sizeof(int), *count); -/* *text[*count] = 0; */ - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - error = *ptr; - efree(retmsg->buf); - efree(retmsg); - *text = NULL; - return(error); - } - efree(retmsg->buf); - efree(retmsg); - - if((documenttype != NULL) && (strcmp(documenttype, "Image") != 0)) { - if(send_getanchorsobj(sockfd, objectID, &anchors, &ancount) == 0) { - char **destrec, **reldestrec; -#ifdef newlist - zend_llist *pAnchorList; -#else - DLIST *pAnchorList; -#endif - - /* Get dest as relative and absolut path */ - send_getdestforanchorsobj(sockfd, anchors, &destrec, ancount); - send_getreldestforanchorsobj(sockfd, anchors, &reldestrec, ancount, rootid, objectID); - pAnchorList = fnCreateAnchorList(objectID, anchors, destrec, reldestrec, ancount, mode); - - /* Free only the array, the objrecs has been freed in fnCreateAnchorList() */ - if(anchors) efree(anchors); - if(destrec) efree(destrec); - if(reldestrec) efree(reldestrec); - - if(pAnchorList != NULL) { - char *newtext; - char *body = NULL; - char **prefixarray; - - prefixarray = emalloc(5*sizeof(char *)); - for(i=0; i<5; i++) - prefixarray[i] = urlprefix; - - newtext = fnInsAnchorsIntoText(*text, pAnchorList, &body, prefixarray); - - efree(prefixarray); -#ifdef newlist - zend_llist_destroy(pAnchorList); - efree(pAnchorList); -#else - dlst_kill(pAnchorList, fnDeleteAnchor); -#endif - *bodytag = strdup(body); - if(body) efree(body); - *text = newtext; - *count = strlen(newtext); - } - } - } - - if(documenttype) efree(documenttype); - return(0); -} - -int send_insertanchors(char **text, int *count, char **anchors, char **destrec, int ancount, char **urlprefix, char **bodytag) { - char **reldestrec = NULL; - int mode = 0; - hw_objectID objectID = 0; -#ifdef newlist - zend_llist *pAnchorList = NULL; -#else - DLIST *pAnchorList = NULL; -#endif - pAnchorList = fnCreateAnchorList(objectID, anchors, destrec, reldestrec, ancount, mode); - - /* Free only the array, the objrecs has been freed in fnCreateAnchorList() */ - if(anchors) efree(anchors); - if(destrec) efree(destrec); - if(reldestrec) efree(reldestrec); - - if(pAnchorList != NULL) { - char *newtext; - char *body = NULL; - - newtext = fnInsAnchorsIntoText(*text, pAnchorList, &body, urlprefix); - -#ifdef newlist - zend_llist_destroy(pAnchorList); - efree(pAnchorList); -#else - dlst_kill(pAnchorList, fnDeleteAnchor); -#endif - *bodytag = strdup(body); - if(body) efree(body); - *text = newtext; - *count = strlen(newtext); - } - return 0; -} - -int send_edittext(int sockfd, char *objattr, char *text) -{ - hg_msg msg, *retmsg; - int length, *ptr, error; - char *tmp, *path, *objid; - hw_objectID objectID; - - objid = fnAttributeValue(objattr, "ObjectID"); - if(objid == NULL) - return(-1); - if(!sscanf(objid, "0x%x", &objectID)) - return(-2); - - path = fnAttributeValue(objattr, "Path"); - if(path == NULL) - 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(-4); - } - - tmp = build_msg_int(msg.buf, objectID); - tmp = build_msg_str(tmp, path); - tmp = build_msg_str(tmp, ""); - tmp = build_msg_str(tmp, text); - - if(path) efree(path); - if(objid) efree(objid); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - return(-5); - } - - efree(msg.buf); - retmsg = recv_hg_msg(sockfd); - if (retmsg == NULL) { - *text = '\0'; - return(-6); - } - - ptr = (int *) retmsg->buf; - error = *ptr; - efree(retmsg->buf); - efree(retmsg); - return(error); -} - -int send_getcgi(int sockfd, hw_objectID objectID, char *cgi_env_str, char **objattr, char **text, int *count) -{ - hg_msg msg, *retmsg; - int length, *ptr, error, new_attr_len; - char *tmp, *attributes, *new_attr; - - length = HEADER_LENGTH + sizeof(hw_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); - } - - 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) { - attributes = NULL; - return(-1); - } - - ptr = (int *) retmsg->buf; - if(*ptr == 0) { - attributes = estrdup(retmsg->buf+sizeof(int)); - efree(retmsg->buf); - efree(retmsg); - } else { - error = *ptr; - attributes = NULL; - efree(retmsg->buf); - efree(retmsg); - return error; - } - - new_attr_len = strlen(attributes) + strlen(cgi_env_str) + 2; - new_attr = malloc(new_attr_len); - strcpy(new_attr, attributes); - strcat(new_attr, cgi_env_str); - length = HEADER_LENGTH + strlen(new_attr) + 1 + sizeof(int); - build_msg_header(&msg, length, msgid++, GETCGI_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_str(msg.buf, new_attr); - tmp = build_msg_int(tmp, 0); - - *objattr = strdup(attributes); - efree(attributes); - free(new_attr); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - return(-1); - } - - efree(msg.buf); - retmsg = recv_hg_msg(sockfd); - if (retmsg == NULL) { - *text = NULL; - return(-1); - } - - /* Attention: It looks like the documentation is not quite right. - According to the docs the buffer starts with an integer which - is followed by the output of the cgi script. This seems not to - be true. There is another integer right after the error. - The output of the cgi script is also preceded by the 'Content-type' - header. */ - ptr = (int *) retmsg->buf; - if(*ptr++ == 1024) { - *count = *ptr++; - if(NULL != (*text = malloc(*count + 1))) { - memcpy(*text, ptr, *count); - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - error = *ptr + 1024; /* move errors to >2024 */ - efree(retmsg->buf); - efree(retmsg); - *text = NULL; - return(error); - } - efree(retmsg->buf); - efree(retmsg); - - return(0); -} - -int send_getremote(int sockfd, hw_objectID objectID, char **objattr, char **text, int *count) -{ - hg_msg msg, *retmsg; - int length, *ptr, error; - char *tmp, *attributes; - - length = HEADER_LENGTH + sizeof(hw_objectID); - - build_msg_header(&msg, length, msgid++, GETOBJECT_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) { - attributes = NULL; - return(-1); - } - - ptr = (int *) retmsg->buf; - if(*ptr == 0) { - attributes = estrdup(retmsg->buf+sizeof(int)); - efree(retmsg->buf); - efree(retmsg); - } else { - error = *ptr; - attributes = NULL; - efree(retmsg->buf); - efree(retmsg); - return error; - } - - length = HEADER_LENGTH + strlen(attributes) + 1 + sizeof(int); - build_msg_header(&msg, length, msgid++, GETREMOTE_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_str(msg.buf, attributes); - tmp = build_msg_int(tmp, 0); - - *objattr = strdup(attributes); - efree(attributes); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - return(-1); - } - - efree(msg.buf); - retmsg = recv_hg_msg(sockfd); - if (retmsg == NULL) { - *text = NULL; - return(-1); - } - - ptr = (int *) retmsg->buf; - if(*ptr == 1024) { - *count = retmsg->length-HEADER_LENGTH-sizeof(int)-sizeof(int); - if(NULL != (*text = malloc(*count + 1))) { - memcpy(*text, ptr+2, *count); -/* *text[*count] = 0; */ - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - error = *ptr + 1024; /* move errors to >2024 */ - efree(retmsg->buf); - efree(retmsg); - *text = NULL; - return(error); - } - efree(retmsg->buf); - efree(retmsg); - - return(0); -} - -int send_getremotechildren(int sockfd, char *attributes, char **text, int **childIDs, int *count) -{ - hg_msg msg, *retmsg; - int length, *ptr, *ptr1, error; - char *tmp; - -/* length = HEADER_LENGTH + sizeof(hw_objectID); - - build_msg_header(&msg, length, msgid++, GETOBJECT_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) { - attributes = NULL; - return(-1); - } - - ptr = (int *) retmsg->buf; - if(*ptr == 0) { - attributes = estrdup(retmsg->buf+sizeof(int)); - efree(retmsg->buf); - efree(retmsg); - } else { - error = *ptr; - attributes = NULL; - efree(retmsg->buf); - efree(retmsg); - return error; - } -*/ - length = HEADER_LENGTH + strlen(attributes) + 1 + sizeof(int); - build_msg_header(&msg, length, msgid++, GETREMOTECHILDREN_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_str(msg.buf, attributes); - tmp = build_msg_int(tmp, 0); - -/* efree(attributes); */ - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - return(-1); - } - - efree(msg.buf); - retmsg = recv_hg_msg(sockfd); - if (retmsg == NULL) { - *childIDs = NULL; - return(-1); - } - ptr = (int *) retmsg->buf; - if(*ptr++ == 1024) { - int i, remlen, sum; - *count = *ptr; - ptr++; - if(NULL != (*childIDs = emalloc(*count * sizeof(hw_objectID)))) { - ptr1 = *childIDs; - sum = 0; - for(i=0; i<*count; ptr++, i++) { - ptr1[i] = *ptr; - sum += *ptr; - } - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - - remlen = retmsg->length - HEADER_LENGTH - *count * sizeof(int) - 2 * sizeof(int); -/*ptr1[i-1] = remlen; */ -/*ptr1[i-2] = sum; */ -/*ptr1[i-3] = *count; */ - if(NULL != (*text = emalloc(remlen + 1))) { - memcpy(*text, ptr, remlen); - } else { - efree(childIDs); - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - efree(retmsg->buf); - efree(retmsg); - } else { - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - *childIDs = NULL; - *text = NULL; - return error; - } - return(0); -} - -int send_mvcpdocscollscoll(int sockfd, hw_objectID *objectIDs, int count, int from, int dest, int cpmv, int doccoll) -{ - hg_msg msg, *retmsg; - int length, i, error; - char *tmp; - - if(count <= 0) - return 0; - - /* HEADER_LENGTH + cpmv + from + dest + count + nr of obj */ - length = HEADER_LENGTH + sizeof(hw_objectID) + sizeof(hw_objectID) + sizeof(hw_objectID) + sizeof(hw_objectID) + count * sizeof(hw_objectID); - - switch(doccoll) { - case DOCUMENT: - build_msg_header(&msg, length, msgid++, MVCPDOCSCOLL_MESSAGE); - break; - case COLLECTION: - build_msg_header(&msg, length, msgid++, MVCPCOLLSCOLL_MESSAGE); - break; - } - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_int(msg.buf, cpmv); - tmp = build_msg_int(tmp, from); - tmp = build_msg_int(tmp, dest); - tmp = build_msg_int(tmp, count); - for(i=0; i<count;i++) - tmp = build_msg_int(tmp, objectIDs[i]); - - 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_docbyanchor(int sockfd, hw_objectID objectID, hw_objectID *anchorID) -{ - hg_msg msg, *retmsg; - int length, error; - char *tmp; - int *ptr; - - length = HEADER_LENGTH + sizeof(hw_objectID); - - build_msg_header(&msg, length, msgid++, GETDOCBYANCHOR_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - 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); - } - - ptr = (int *) retmsg->buf; - error = *ptr++; - if(error == 0) { - *anchorID = *ptr; - } else { - *anchorID = 0; - } - efree(retmsg->buf); - efree(retmsg); - return error; -} - -int send_docbyanchorobj(int sockfd, hw_objectID objectID, char **objrec) -{ - hg_msg msg, *retmsg; - int length, error; - char *tmp; - int *ptr, anchorID; - - length = HEADER_LENGTH + sizeof(hw_objectID); - - build_msg_header(&msg, length, msgid++, GETDOCBYANCHOR_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - 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); - } - - ptr = (int *) retmsg->buf; - error = *ptr++; - if(error == 0) { - anchorID = *ptr; - } else { - anchorID = 0; - } - efree(retmsg->buf); - efree(retmsg); - - if(0 > bh_send_getobject(sockfd, anchorID)) - return -1; - return(uh_send_getobject(sockfd, objrec)); -} - -int send_children(int sockfd, hw_objectID objectID, hw_objectID **childIDs, int *count) -{ - hg_msg msg, *retmsg; - int length, i, error; - char *tmp; - int *ptr, *ptr1; - - length = HEADER_LENGTH + sizeof(hw_objectID); - - build_msg_header(&msg, length, msgid++, CHILDREN_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_int(msg.buf, objectID); - - if (-1 == send_hg_msg(sockfd, &msg, length)) { - efree(msg.buf); - return(-2); - } - - efree(msg.buf); - retmsg = recv_hg_msg(sockfd); - if ( retmsg == NULL ) { - return(-3); - } - - ptr = (int *) retmsg->buf; - if(ptr == NULL) { - if(retmsg) efree(retmsg); - return -1; - } - if(*ptr++ == 0) { - *count = *ptr++; - if(NULL != (*childIDs = emalloc(*count * sizeof(hw_objectID)))) { - ptr1 = *childIDs; - for(i=0; i<*count; ptr++, i++) - ptr1[i] = *ptr; - efree(retmsg->buf); - efree(retmsg); - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return error; - } - - return(0); -} - -int send_childrenobj(int sockfd, hw_objectID objectID, char ***childrec, int *count) -{ - hg_msg msg, *retmsg; - int length, i, error; - char *tmp; - int *childIDs = NULL; - int *ptr; - - length = HEADER_LENGTH + sizeof(hw_objectID); - - 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); - } - - 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); - - ptr = (int *) retmsg->buf; - if(ptr == NULL) { - if(retmsg) efree(retmsg); - return -1; - } - if(*ptr++ == 0) { - *count = *ptr++; - if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) { - for(i=0; i<*count; ptr++, i++) - childIDs[i] = *ptr; - efree(retmsg->buf); - efree(retmsg); - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return error; - } - - /* Now get for each child collection the object record */ -#ifdef hw_less_server_stress - if(0 != send_objectbyidquery(sockfd, childIDs, count, NULL, childrec)) { - efree(childIDs); - return -2; - } - efree(childIDs); -#else - for(i=0; i<*count; i++) { - - length = HEADER_LENGTH + sizeof(hw_objectID); - build_msg_header(&msg, length, childIDs[i], GETOBJECT_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { - efree(childIDs); - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_int(msg.buf, childIDs[i]); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(childIDs); - efree(msg.buf); - return(-1); - } - - efree(msg.buf); - } - efree(childIDs); - - if(NULL == (objptr = (char **) emalloc(*count * sizeof(hw_objrec *)))) { - /* if emalloc fails, get at least all remaining messages from server */ - for(i=0; i<*count; i++) { - retmsg = recv_hg_msg(sockfd); - efree(retmsg->buf); - efree(retmsg); - } - *childrec = NULL; - lowerror = LE_MALLOC; - return(-1); - } else { - *childrec = objptr; - - for(i=0; i<*count; i++) { - retmsg = recv_hg_msg(sockfd); - if ( retmsg != NULL ) { - if(0 == (int) *(retmsg->buf)) { - *objptr = estrdup(retmsg->buf+sizeof(int)); - objptr++; - efree(retmsg->buf); - efree(retmsg); - } else { - *objptr = NULL; - objptr++; - efree(retmsg->buf); - efree(retmsg); - } - } - } - } -#endif - return(0); -} - -int send_getchildcoll(int sockfd, hw_objectID objectID, hw_objectID **childIDs, int *count) -{ - hg_msg msg, *retmsg; - int length, error; - char *tmp; - int *ptr, i, *ptr1; - - length = HEADER_LENGTH + sizeof(hw_objectID); - - build_msg_header(&msg, length, msgid++, GETCHILDCOLL_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - 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); - } - - ptr = (int *) retmsg->buf; - if(ptr == NULL) { - if(retmsg) efree(retmsg); - return -1; - } - if(*ptr++ == 0) { - *count = *ptr++; - if(NULL != (*childIDs = emalloc(*count * sizeof(hw_objectID)))) { - ptr1 = *childIDs; - for(i=0; i<*count; ptr++, i++) - ptr1[i] = *ptr; - efree(retmsg->buf); - efree(retmsg); - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return error; - } - - return(0); -} - -int send_getchildcollobj(int sockfd, hw_objectID objectID, char ***childrec, int *count) -{ - hg_msg msg, *retmsg; - int length, i, error; - char *tmp; - int *childIDs = NULL; - int *ptr; - - length = HEADER_LENGTH + sizeof(hw_objectID); - - build_msg_header(&msg, length, msgid++, GETCHILDCOLL_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - 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); - - ptr = (int *) retmsg->buf; - if(ptr == NULL) { - if(retmsg) efree(retmsg); - return -1; - } - if(*ptr++ == 0) { - *count = *ptr++; - if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) { - for(i=0; i<*count; ptr++, i++) - childIDs[i] = *ptr; - efree(retmsg->buf); - efree(retmsg); - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return error; - } - - /* Now get for each child collection the object record */ -#ifdef hw_less_server_stress - if(0 != send_objectbyidquery(sockfd, childIDs, count, NULL, childrec)) { - efree(childIDs); - return -2; - } - efree(childIDs); -#else - for(i=0; i<*count; i++) { - - length = HEADER_LENGTH + sizeof(hw_objectID); - build_msg_header(&msg, length, childIDs[i], GETOBJECT_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { - efree(childIDs); - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_int(msg.buf, childIDs[i]); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(childIDs); - efree(msg.buf); - return(-1); - } - - efree(msg.buf); - } - efree(childIDs); - - if(NULL == (objptr = (char **) emalloc(*count * sizeof(hw_objrec *)))) { - /* if emalloc fails, get at least all remaining messages from server */ - for(i=0; i<*count; i++) { - retmsg = recv_hg_msg(sockfd); - efree(retmsg->buf); - efree(retmsg); - } - *childrec = NULL; - lowerror = LE_MALLOC; - return(-1); - } else { - *childrec = objptr; - - for(i=0; i<*count; i++) { - retmsg = recv_hg_msg(sockfd); - if ( retmsg != NULL ) { - if(0 == (int) *(retmsg->buf)) { - *objptr = estrdup(retmsg->buf+sizeof(int)); - objptr++; - efree(retmsg->buf); - efree(retmsg); - } else { - *objptr = NULL; - objptr++; - efree(retmsg->buf); - efree(retmsg); - } - } - } - } -#endif - return(0); -} - -int send_getchilddoccoll(int sockfd, hw_objectID objectID, hw_objectID **childIDs, int *count) -{ - hg_msg msg, *retmsg; - int length, error; - char *tmp; - - length = HEADER_LENGTH + sizeof(hw_objectID); - - build_msg_header(&msg, length, msgid++, GETCHILDDOCCOLL_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - 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); - } else { - efree(msg.buf); - retmsg = recv_hg_msg(sockfd); - if ( retmsg != NULL ) { - int *ptr, i, *ptr1; - - ptr = (int *) retmsg->buf; - if(ptr == NULL) { - if(retmsg) efree(retmsg); - return -1; - } - if(*ptr++ == 0) { - *count = *ptr++; - if(NULL != (*childIDs = emalloc(*count * sizeof(hw_objectID)))) { - ptr1 = *childIDs; - for(i=0; i<*count; ptr++, i++) - ptr1[i] = *ptr; - efree(retmsg->buf); - efree(retmsg); - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return error; - } - } - } - - return(0); - -} - -int send_getchilddoccollobj(int sockfd, hw_objectID objectID, hw_objrec ***childrec, int *count) -{ - hg_msg msg, *retmsg; - int length, error; - char *tmp; - int *childIDs = NULL; - - length = HEADER_LENGTH + sizeof(hw_objectID); - - build_msg_header(&msg, length, msgid++, GETCHILDDOCCOLL_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - 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 ) { - int *ptr, i; - - ptr = (int *) retmsg->buf; - if(ptr == NULL) { - if(retmsg->buf) efree(retmsg->buf); - return -1; - } - if(*ptr++ == 0) { - *count = *ptr++; - if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) { - for(i=0; i<*count; ptr++, i++) - childIDs[i] = *ptr; - efree(retmsg->buf); - efree(retmsg); - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return error; - } - } - - /* Now get for each child collection the object record */ -#ifdef hw_less_server_stress - if(0 != send_objectbyidquery(sockfd, childIDs, count, NULL, childrec)) { - efree(childIDs); - return -2; - } - efree(childIDs); -#else - for(i=0; i<*count; i++) { - length = HEADER_LENGTH + sizeof(hw_objectID); - build_msg_header(&msg, length, childIDs[i], GETOBJECT_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_int(msg.buf, childIDs[i]); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - return(-1); - } - - efree(msg.buf); - } - - if(NULL == (objptr = (char **) emalloc(*count * sizeof(hw_objrec *)))) { - /* if emalloc fails, get at least all remaining messages from server */ - for(i=0; i<*count; i++) { - retmsg = recv_hg_msg(sockfd); - efree(retmsg->buf); - efree(retmsg); - } - *childrec = NULL; - lowerror = LE_MALLOC; - return(-1); - } else { - *childrec = objptr; - - for(i=0; i<*count; i++) { - retmsg = recv_hg_msg(sockfd); - if ( retmsg != NULL ) { - if(0 == (int) *(retmsg->buf)) { - *objptr = estrdup(retmsg->buf+sizeof(int)); - objptr++; - efree(retmsg->buf); - efree(retmsg); - } else { - *objptr = NULL; - objptr++; - efree(retmsg->buf); - efree(retmsg); - } - } - } - } -#endif - return(0); -} - -int send_getanchors(int sockfd, hw_objectID objectID, int **anchorIDs, int *count) -{ - hg_msg msg, *retmsg; - int length, error; - char *tmp; - int *ptr, i, *ptr1; - - length = HEADER_LENGTH + sizeof(hw_objectID); - - build_msg_header(&msg, length, msgid++, GETANCHORS_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - 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); - - if (NULL == (retmsg = recv_hg_msg(sockfd))) - return(-1); - - ptr = (int *) retmsg->buf; - if(ptr == NULL) { - if(retmsg) efree(retmsg); - return -1; - } - if(*ptr++ == 0) { - *count = *ptr++; - if(NULL != (*anchorIDs = emalloc(*count * sizeof(hw_objectID)))) { - ptr1 = *anchorIDs; - for(i=0; i<*count; ptr++, i++) - ptr1[i] = *ptr; - efree(retmsg->buf); - efree(retmsg); - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return error; - } - - return(0); -} - -int send_getanchorsobj(int sockfd, hw_objectID objectID, char ***childrec, int *count) -{ - hg_msg msg, *retmsg; - int length, error; - char *tmp; - int *ptr, i, *ptr1; - int *anchorIDs = NULL; - - length = HEADER_LENGTH + sizeof(hw_objectID); - - build_msg_header(&msg, length, 50, GETANCHORS_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - 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); - - if (NULL == (retmsg = recv_hg_msg(sockfd))) - return(-1); - - ptr = (int *) retmsg->buf; - if(ptr == NULL) { - if(retmsg) efree(retmsg); - return -1; - } - if(*ptr++ == 0) { - *count = *ptr++; - if(NULL != (anchorIDs = emalloc(*count * sizeof(hw_objectID)))) { - ptr1 = anchorIDs; - for(i=0; i<*count; ptr++, i++) - ptr1[i] = *ptr; - efree(retmsg->buf); - efree(retmsg); - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return error; - } - - /* Now get for each anchor the object record */ -#ifdef hw_less_server_stress - if(0 != send_objectbyidquery(sockfd, anchorIDs, count, NULL, childrec)) { - efree(anchorIDs); - return -2; - } - efree(anchorIDs); -#else - for(i=0; i<*count; i++) { - - length = HEADER_LENGTH + sizeof(hw_objectID); - build_msg_header(&msg, length, anchorIDs[i], GETOBJECT_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_int(msg.buf, anchorIDs[i]); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - return(-1); - } - - efree(msg.buf); - } - if(anchorIDs) efree(anchorIDs); - - if(NULL == (objptr = (char **) emalloc(*count * sizeof(hw_objrec *)))) { - /* if emalloc fails, get at least all remaining messages from server */ - for(i=0; i<*count; i++) { - retmsg = recv_hg_msg(sockfd); - efree(retmsg->buf); - efree(retmsg); - } - *childrec = NULL; - lowerror = LE_MALLOC; - return(-1); - } else { - *childrec = objptr; - - for(i=0; i<*count; i++) { - retmsg = recv_hg_msg(sockfd); - if ( retmsg != NULL ) { - if(0 == (int) *(retmsg->buf)) { - *objptr = estrdup(retmsg->buf+sizeof(int)); - objptr++; - efree(retmsg->buf); - efree(retmsg); - } else { - *objptr = NULL; - objptr++; - efree(retmsg->buf); - efree(retmsg); - } - } - } - } -#endif - return(0); -} - -int send_getdestforanchorsobj(int sockfd, char **anchorrec, char ***destrec, int count) -{ - int i; - char *objptr, **destptr; - char *str; - int objectID; - - if(NULL == (destptr = (char **) emalloc(count * sizeof(hw_objrec *)))) { - lowerror = LE_MALLOC; - return -1; - } - - /* Now get for each anchor the object record of its destination */ - for(i=0; i<count; i++) { - /* if you retrieve the anchors you sometimes get more than actually accessible. - */ - if((NULL != anchorrec[i]) && (NULL != (str = fnAttributeValue(anchorrec[i], "Dest")))) { - sscanf(str, "0x%x", &objectID); - efree(str); - - /* Using send_docbyanchorobj() makes sense because the Destination can - be both, an anchor or a document. If it is a document you get the - objectrecord of that document. If it is an anchor the function - graps the document which belongs to the anchor - and you get also the objectrecord of that document. - */ - if(0 > send_docbyanchorobj(sockfd, objectID, &objptr)) { - efree(destptr); - return -1; - } - destptr[i] = objptr; - /* if we can't get the object rec of the dest, than this document - is probably not accessible for us. For later functions simply - set anchorrec[i] to NULL */ - if(destptr[i] == NULL) { - if(anchorrec[i]) efree(anchorrec[i]); - anchorrec[i] = NULL; - } - } else { - destptr[i] = NULL; - } - } - *destrec = destptr; - - return(0); -} - -int send_getreldestforanchorsobj(int sockfd, char **anchorrec, char ***reldestrec, int count, int rootID, int thisID) -{ - int i; - char *docofanchorptr, **reldestptr; - char *str; - int destobjectID; - - if(NULL == (reldestptr = (char **) emalloc(count * sizeof(char *)))) { - lowerror = LE_MALLOC; - return -1; - } - - /* Now get for each anchor the object record of its destination */ - for(i=0; i<count; i++) { - /* if you retrieve the anchors you sometimes get more than actually accessible. - */ - if((NULL != anchorrec[i]) && (NULL != (str = fnAttributeValue(anchorrec[i], "Dest")))) { - sscanf(str, "0x%x", &destobjectID); - efree(str); - - /* See note in send_getdestforanchorsobj() at same position in source code */ - if(0 > send_docbyanchorobj(sockfd, destobjectID, &docofanchorptr)) { - efree(reldestptr); - return -1; - } - - reldestptr[i] = docofanchorptr; - /* if we can't get the object rec of the dest, than this document - is probably not accessible for us. For later functions simply - set anchorrec[i] to NULL */ - if(reldestptr[i] == NULL) { - if(anchorrec[i]) efree(anchorrec[i]); - anchorrec[i] = NULL; - } else { - int j, *retthisIDs, *retdestIDs, equaltill, mincount, countthis, countdest, destdocid; - char destdocname[200]; - char anchorstr[300]; - char temp[200]; - char *strptr; - - if(NULL != (str = strstr(docofanchorptr, "Name="))) { - str += 5; - sscanf(str, "%s\n", destdocname); - } - if(NULL != (str = strstr(docofanchorptr, "ObjectID="))) { - str += 9; - sscanf(str, "0x%X", &destdocid); - } - - 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]); -fprintf(stderr, "\n"); -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++) - ; - equaltill = j; - strcpy(anchorstr, "Name="); - for(j=equaltill; j<countthis; j++) - strcat(anchorstr, "../"); - strcat(anchorstr, "./"); - for(j=equaltill; j<countdest; j++) { - char *temprec, tempname[100]; - send_getobject(sockfd, retdestIDs[j], &temprec); - if(NULL != (str = strstr(temprec, "Name="))) { - str += 5; - sscanf(str, "%s\n", tempname); - } else if(NULL != (str = strstr(temprec, "ObjectID="))) { - str += 9; - sscanf(str, "%s\n", tempname); - } - - sprintf(temp, "%s", tempname); - strptr = temp; - while(*strptr != '\0') { - if(*strptr == '/') - *strptr = '_'; - strptr++; - } -/* fprintf(stderr, "Adding '%s' to '%s'\n", temp, anchorstr); */ - strcat(anchorstr, temp); - strcat(anchorstr, "/"); -/* fprintf(stderr, "Is now '%s'\n", anchorstr); */ - efree(temprec); - } - /* if the anchor destination is a collection it may not be added anymore. */ - if(destdocid != retdestIDs[countdest-1]) { - strptr = destdocname; - while(*strptr != '\0') { - if(*strptr == '/') - *strptr = '_'; - strptr++; - } - strcat(anchorstr, destdocname); - } else { - strcat(anchorstr, "index.html"); - } - strcat(anchorstr, "\n"); - sprintf(temp, "ObjectID=0x%x", destdocid); - strcat(anchorstr, temp); -/* fprintf(stderr, "%s\n", anchorstr); */ - efree(retthisIDs); - efree(retdestIDs); - efree(reldestptr[i]); - reldestptr[i] = estrdup(anchorstr); - } - } else { - reldestptr[i] = NULL; - } - } - *reldestrec = reldestptr; - - return(0); -} - -int fn_findpath(int sockfd, int *retIDs, int count, int id) { - int *pathIDs; - int *parentIDs, pcount, pid; - int u, j, i; - - if(NULL == (pathIDs = emalloc(count * sizeof(int)))) { - lowerror = LE_MALLOC; - return -1; - } - u = count-1; - pid = id; - pcount = 1; - /* FIXME but parentIDs is not set at this point, why checking it? */ - while((u >= 0) && (pcount != 0) && (parentIDs != NULL) && (pid != 0)) { -/*fprintf(stderr, "Get parents for %d\n", pid); */ - if(0 != send_getparents(sockfd, pid, &parentIDs, &pcount)) { - efree(pathIDs); - return -1; - } - pid = 0; - for(i=0; i<pcount; i++) { - for(j=0; j<count; j++) { - if(parentIDs[i] == retIDs[j]) { - pathIDs[u--] = retIDs[j]; - pid = retIDs[j]; - } - } - } - if(pid == 0) - fprintf(stderr, "parent not found in list\n"); - if(parentIDs) efree(parentIDs); - } -/*fprintf(stderr, "sorted path: "); */ - for(i=0; i<count; i++) { - retIDs[i] = pathIDs[i]; -/*fprintf(stderr, "%d, ", retIDs[i]); */ - } -/*fprintf(stderr, "\n"); */ - efree(pathIDs); - return 0; -} - -/******************************************************************** -* function getrellink() * -* * -* Returns the link to point from document with ID sourceID to * -* 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; - char anchorstr[300]; - char temp[200]; - char *strptr; - - send_incollections(sockfd, 1, 1, &thisID, 1, &rootID, &countthis, &retthisIDs); - send_incollections(sockfd, 1, 1, &destID, 1, &rootID, &countdest, &retdestIDs); - - -fprintf(stderr, "%d: ", thisID); -for(k=0; k<countthis; k++) - fprintf(stderr, "%d, ", retthisIDs[k]); -fprintf(stderr, "\n"); -fprintf(stderr, "%d: ", destID); -for(k=0; k<countdest; k++) - fprintf(stderr, "%d, ", retdestIDs[k]); -fprintf(stderr, "\n"); - - /* - ** The message incollections returned a list of collections - ** in which the destID or thisID is contained. Unfortunately - ** this list ist not the path for the destID or thisID, but - ** a sorted list of collection IDs. If for example you are - ** looking for an ID 20 which has a path 1 -> 5 -> 4 -> 20 - ** (this means: 20 is child of 4, 4 is child of 5, 5 is child - ** of 1) it will return 1, 4, 5 instead of 1, 5, 4 - ** Consequently, we have to create the correct path, by checking - ** for the parents and identifying it in the list. - ** But there is another problem. If the id for which the list of - ** of collection is generated is a colletion itself, it will - ** show up in the list as well. In order to make the algorithmn - ** work proberly it has to be the last member of the list. - */ - for(i=0; i<countdest; i++) - if(retdestIDs[i] == destID) { - retdestIDs[i] = retdestIDs[countdest-1]; - retdestIDs[countdest-1] = destID; - } - count = (retdestIDs[countdest-1] == destID) ? countdest-1 : countdest; - if(0 != fn_findpath(sockfd, retdestIDs, count, destID)) { - efree(retthisIDs); - efree(retdestIDs); - return -1; - } - for(i=0; i<countthis; i++) - if(retthisIDs[i] == thisID) { - retthisIDs[i] = retthisIDs[countthis-1]; - retthisIDs[countthis-1] = thisID; - } - count = (retthisIDs[countthis-1] == thisID) ? countthis-1 : countthis; - if(0 != fn_findpath(sockfd, retthisIDs, count, thisID)) { - efree(retthisIDs); - efree(retdestIDs); - return -1; - } - - mincount = (countthis < countdest) ? countthis : countdest; -fprintf(stderr, "mincount = %d\n", mincount); - for(j=0; (j<mincount) && (retthisIDs[j]==retdestIDs[j]); j++) - ; - equaltill = j; -fprintf(stderr, "first unequal = %d\n", j); - strcpy(anchorstr, ""); - for(j=equaltill; j<countthis; j++) - strcat(anchorstr, "../"); - strcat(anchorstr, "./"); - for(j=equaltill; j<countdest; j++) { - char *temprec, *str, tempname[100]; - if(0 == send_getobject(sockfd, retdestIDs[j], &temprec)) { - if(NULL != (str = strstr(temprec, "Name="))) { - str += 5; - sscanf(str, "%s\n", tempname); - } else if(NULL != (str = strstr(temprec, "ObjectID="))) { - str += 9; - sscanf(str, "%s\n", tempname); - } - - sprintf(temp, "%s", tempname); - strptr = temp; - while(*strptr != '\0') { - if(*strptr == '/') - *strptr = '_'; - strptr++; - } -fprintf(stderr, "Adding '%s' (%d) to '%s'\n", temp, retdestIDs[j], anchorstr); - strcat(anchorstr, temp); - strcat(anchorstr, "/"); -fprintf(stderr, "Is now '%s'\n", anchorstr); - efree(temprec); - } else { - strcat(anchorstr, "No access/"); - } - } - /* if the anchor destination is a collection it may not be added anymore. */ - if(destID != retdestIDs[countdest-1]) { - char destdocname[100], *str; - send_getobject(sockfd, destID, &str); - if(NULL != (strptr = strstr(str, "Name="))) { - strptr += 5; - sscanf(strptr, "%s\n", destdocname); - } - strptr = destdocname; - while(*strptr != '\0') { - if(*strptr == '/') - *strptr = '_'; - strptr++; - } - strcat(anchorstr, destdocname); - efree(str); - } else { -/* strcat(anchorstr, "index.html"); */ - } -/*fprintf(stderr, "%s\n", anchorstr); */ - efree(retthisIDs); - efree(retdestIDs); - *reldeststr = estrdup(anchorstr); - return 0; -} - -int send_identify(int sockfd, char *name, char *passwd, char **userdata) { - hg_msg msg, *retmsg; - int length; - char *tmp; - - length = HEADER_LENGTH + sizeof(int) + strlen(name) + 1 + strlen(passwd) + 1; - - build_msg_header(&msg, length, msgid++, IDENTIFY_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_int(msg.buf, 0); - tmp = build_msg_str(tmp, name); - tmp = build_msg_str(tmp, passwd); - - 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); - - *userdata = (char *) retmsg->buf; - efree(retmsg); - - return(0); -} - -int send_objectbyidquery(int sockfd, hw_objectID *IDs, int *count, char *query, char ***objrecs) -{ - hg_msg msg, *retmsg; - int length; - char *tmp, *str; - int *ptr, i; - int *offsets, *childIDs; - char **childrec; - - if(*count <= 0) { - *objrecs = emalloc(0); - return(0); - } - 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); - -#ifdef hw_optimize - { - int hg_error; - int c, allc; - - allc = 0; - retmsg = recv_hg_msg_head(sockfd); - if ( retmsg == NULL ) - return(-1); - - /* read error field */ - if ( (c = hg_read_exact(sockfd, (char *) &hg_error, 4)) == -1 ) { - if(retmsg) efree(retmsg); - return(-2); - } - allc += c; - - if(hg_error) { - if(retmsg) efree(retmsg); - return(-3); - } - - /* read count field */ - if ( (c = hg_read_exact(sockfd, (char *) count, 4)) == -1 ) { - if(retmsg) efree(retmsg); - return(-2); - } - allc += c; - - if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) { - if((c = hg_read_exact(sockfd, (char *) childIDs, *count * sizeof(hw_objectID))) == -1) { - efree(childIDs); - if(retmsg) efree(retmsg); - return(-3); - } - } else { - efree(retmsg); - lowerror = LE_MALLOC; - return(-4); - } - allc += c; - - if(NULL != (offsets = emalloc(*count * sizeof(int)))) { - if((c = hg_read_exact(sockfd, (char *) offsets, *count * sizeof(int))) == -1) { - efree(childIDs); - efree(offsets); - if(retmsg) efree(retmsg); - return(-5); - } - } else { - efree(retmsg); - efree(childIDs); - lowerror = LE_MALLOC; - return(-6); - } - allc += c; - - str = (char *)ptr; - if(NULL == (childrec = (char **) emalloc(*count * sizeof(hw_objrec *)))) { - efree(offsets); - efree(childIDs); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } else { - for(i=0; i<*count; i++) { - char *ptr; - childrec[i] = emalloc(offsets[i] + 1); - ptr = childrec[i]; - c = hg_read_exact(sockfd, (char *) ptr, offsets[i]); - ptr[c] = '\0'; - allc += c; - } - /* Reading the trailing '\0' */ - c = hg_read_exact(sockfd, (char *) &hg_error, 1); - *objrecs = childrec; - } - } -#else - 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++) { - char *ptr; - childrec[i] = emalloc(offsets[i] + 1); - ptr = childrec[i]; - memcpy(ptr, str, offsets[i]); - ptr[offsets[i]] = '\0'; - str += offsets[i]; - } - *objrecs = childrec; - } - - efree(retmsg->buf); -#endif - - 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; - int length, error; - char *tmp; - int *ptr, i, *ptr1; - - length = HEADER_LENGTH + strlen(query) + 1; - - build_msg_header(&msg, length, msgid++, GETOBJBYQUERY_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_str(msg.buf, 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) { - *count = (*ptr < maxhits) ? *ptr : maxhits; - ptr++; - if(NULL != (*childIDs = emalloc(*count * sizeof(hw_objectID)))) { - ptr1 = *childIDs; - for(i=0; i<*count; ptr++, i++) - ptr1[i] = *ptr; - efree(retmsg->buf); - efree(retmsg); - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return error; - } - return(0); -} - -int send_getobjbyqueryobj(int sockfd, char *query, int maxhits, char ***childrec, int *count) -{ - hg_msg msg, *retmsg; - int length, i, error; - char *tmp; - int *childIDs = NULL; - int *ptr, *ptr1; - - length = HEADER_LENGTH + strlen(query) + 1; - - build_msg_header(&msg, length, msgid++, GETOBJBYQUERY_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_str(msg.buf, query); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - return(-2); - } - - efree(msg.buf); - retmsg = recv_hg_msg(sockfd); - if ( retmsg == NULL ) - return(-3); - - ptr = (int *) retmsg->buf; - if(ptr == NULL) { - if(retmsg) efree(retmsg); - return -4; - } - if(*ptr++ == 0) { - *count = (*ptr < maxhits) ? *ptr : maxhits; - ptr++; - if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) { - ptr1 = childIDs; - for(i=0; i<*count; ptr++, i++) - ptr1[i] = *ptr; - efree(retmsg->buf); - efree(retmsg); - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-5); - } - } else { - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return error; - } - - /* Now get for each child collection the object record */ -#ifdef hw_less_server_stress - if(0 != send_objectbyidquery(sockfd, childIDs, count, NULL, childrec)) { - efree(childIDs); - return -2; - } - efree(childIDs); -#else - for(i=0; i<*count; i++) { - length = HEADER_LENGTH + sizeof(hw_objectID); - build_msg_header(&msg, length, childIDs[i], GETOBJECT_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - efree(childIDs); - lowerror = LE_MALLOC; - return(-6); - } - - tmp = build_msg_int(msg.buf, childIDs[i]); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - efree(childIDs); - return(-7); - } - - efree(msg.buf); - } - efree(childIDs); - - if(NULL == (objptr = (char **) emalloc(*count * sizeof(hw_objrec *)))) { - /* if emalloc fails, get at least all remaining messages from server */ - for(i=0; i<*count; i++) { - retmsg = recv_hg_msg(sockfd); - efree(retmsg->buf); - efree(retmsg); - } - *childrec = NULL; - lowerror = LE_MALLOC; - return(-8); - } else { - *childrec = objptr; - - for(i=0; i<*count; i++) { - retmsg = recv_hg_msg(sockfd); - if ( retmsg != NULL ) { - if(0 == (int) *(retmsg->buf)) { - *objptr = estrdup(retmsg->buf+sizeof(int)); - objptr++; - efree(retmsg->buf); - efree(retmsg); - } else { - *objptr = NULL; - objptr++; - efree(retmsg->buf); - efree(retmsg); - } - } - } - } -#endif - return(0); -} - -int send_getobjbyquerycoll(int sockfd, hw_objectID collID, char *query, int maxhits, hw_objectID **childIDs, int *count) -{ - hg_msg msg, *retmsg; - int length, error; - char *tmp; - int *ptr, i, *ptr1; - - length = HEADER_LENGTH + strlen(query) + 1 + sizeof(int) + sizeof(collID); - - build_msg_header(&msg, length, msgid++, GETOBJBYQUERYCOLL_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_int(msg.buf, 1); - tmp = build_msg_int(tmp, collID); - 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) { - *count = (*ptr < maxhits) ? *ptr : maxhits; - ptr++; - if(NULL != (*childIDs = emalloc(*count * sizeof(hw_objectID)))) { - ptr1 = *childIDs; - for(i=0; i<*count; ptr++, i++) - ptr1[i] = *ptr; - efree(retmsg->buf); - efree(retmsg); - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return error; - } - return(0); -} - -int send_getobjbyquerycollobj(int sockfd, hw_objectID collID, char *query, int maxhits, char ***childrec, int *count) -{ - hg_msg msg, *retmsg; - int length, i, error; - char *tmp; - hw_objectID *childIDs = NULL; - int *ptr, *ptr1; - - length = HEADER_LENGTH + strlen(query) + 1 + sizeof(int) + sizeof(hw_objectID); - - build_msg_header(&msg, length, msgid++, GETOBJBYQUERYCOLL_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_int(msg.buf, 1); - tmp = build_msg_int(tmp, collID); - 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) { - *count = (*ptr < maxhits) ? *ptr : maxhits; - ptr++; - if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) { - ptr1 = childIDs; - for(i=0; i<*count; ptr++, i++) - ptr1[i] = *ptr; - efree(retmsg->buf); - efree(retmsg); - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return error; - } - - /* Now get for each child collection the object record */ -#ifdef hw_less_server_stress - if(0 != send_objectbyidquery(sockfd, childIDs, count, NULL, childrec)) { - if(childIDs) efree(childIDs); - return -2; - } - if(childIDs) efree(childIDs); -#else - for(i=0; i<*count; i++) { - length = HEADER_LENGTH + sizeof(hw_objectID); - build_msg_header(&msg, length, childIDs[i], GETOBJECT_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - efree(childIDs); - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_int(msg.buf, childIDs[i]); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - efree(childIDs); - return(-1); - } - - efree(msg.buf); - } - efree(childIDs); - - if(NULL == (objptr = (char **) emalloc(*count * sizeof(hw_objrec *)))) { - /* if emalloc fails, get at least all remaining messages from server */ - for(i=0; i<*count; i++) { - retmsg = recv_hg_msg(sockfd); - efree(retmsg->buf); - efree(retmsg); - } - *childrec = NULL; - lowerror = LE_MALLOC; - return(-1); - } else { - *childrec = objptr; - - for(i=0; i<*count; i++) { - retmsg = recv_hg_msg(sockfd); - if ( retmsg != NULL ) { - if(0 == (int) *(retmsg->buf)) { - *objptr = estrdup(retmsg->buf+sizeof(int)); - objptr++; - efree(retmsg->buf); - efree(retmsg); - } else { - *objptr = NULL; - objptr++; - efree(retmsg->buf); - efree(retmsg); - } - } - } - } -#endif - return(0); -} - -int send_getobjbyftquery(int sockfd, char *query, int maxhits, hw_objectID **childIDs, float **weights, int *count) -{ - hg_msg msg, *retmsg; - int length, error; - char *tmp; - int *ptr, i, *ptr1; - float *ptr2; - - length = HEADER_LENGTH + strlen(query) + 1; - - build_msg_header(&msg, length, msgid++, GETOBJBYFTQUERY_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_str(msg.buf, 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) { - char *cptr, tmp[20]; - float weight; - int j; - *count = (*ptr < maxhits) ? *ptr : maxhits; - ptr++; - if(NULL != (*childIDs = emalloc(*count * sizeof(hw_objectID)))) { - ptr1 = *childIDs; - if(NULL != (*weights = emalloc(*count * sizeof(float)))) { - ptr2 = *weights; - for(i=0; i<*count; i++) { - ptr1[i] = *ptr++; /* Object id */ - cptr = (char *) ptr; - j = 0; - while(*cptr != ' ') { - tmp[j++] = *cptr++; - } - cptr++; /* Skip space after weight */ - tmp[j] = '\0'; - sscanf(tmp, "%f", &weight); - ptr2[i] = weight; - ptr = (int *) cptr; - ptr++; /* Skip 0-Integer after weight string */ - } - efree(retmsg->buf); - efree(retmsg); - } else { - efree(*childIDs); - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return error; - } - return(0); -} - -int send_getobjbyftqueryobj(int sockfd, char *query, int maxhits, char ***childrec, float **weights, int *count) -{ - hg_msg msg, *retmsg; - int length, i, error; - char *tmp; - int *childIDs = NULL; - int *ptr, *ptr1; - float *ptr2; - - length = HEADER_LENGTH + strlen(query) + 1; - - build_msg_header(&msg, length, msgid++, GETOBJBYFTQUERY_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_str(msg.buf, query); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - return(-2); - } - - efree(msg.buf); - retmsg = recv_hg_msg(sockfd); - if ( retmsg == NULL ) - return(-3); - - ptr = (int *) retmsg->buf; - if(ptr == NULL) { - if(retmsg) efree(retmsg); - return -4; - } - if(*ptr++ == 0) { - char *cptr, tmp[20]; - float weight; - int j; - *count = (*ptr < maxhits) ? *ptr : maxhits; - ptr++; - if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) { - ptr1 = childIDs; - if(NULL != (*weights = emalloc(*count * sizeof(float)))) { - ptr2 = *weights; - for(i=0; i<*count; i++) { - ptr1[i] = *ptr++; /* Object id */ - cptr = (char *) ptr; - j = 0; - while(*cptr != ' ') { - tmp[j++] = *cptr++; - } - cptr++; /* Skip space after weight */ - tmp[j] = '\0'; - sscanf(tmp, "%f", &weight); - ptr2[i] = weight; - ptr = (int *) cptr; - ptr++; /* Skip 0-Integer after weight string */ - } - efree(retmsg->buf); - efree(retmsg); - } else { - efree(childIDs); - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-5); - } - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-5); - } - } else { - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return error; - } - - /* Now get for each child collection the object record */ -#ifdef hw_less_server_stress - if(0 != send_objectbyidquery(sockfd, childIDs, count, NULL, childrec)) { - efree(childIDs); - efree(*weights); - return -2; - } - efree(childIDs); -#else - for(i=0; i<*count; i++) { - length = HEADER_LENGTH + sizeof(hw_objectID); - build_msg_header(&msg, length, childIDs[i], GETOBJECT_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { - efree(childIDs); - efree(*weights); - lowerror = LE_MALLOC; - return(-6); - } - - tmp = build_msg_int(msg.buf, childIDs[i]); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - efree(childIDs); - efree(*weights); - return(-7); - } - - efree(msg.buf); - } - efree(childIDs); - - if(NULL == (objptr = (char **) emalloc(*count * sizeof(hw_objrec *)))) { - /* if emalloc fails, get at least all remaining messages from server */ - for(i=0; i<*count; i++) { - retmsg = recv_hg_msg(sockfd); - efree(retmsg->buf); - efree(retmsg); - } - *childrec = NULL; - lowerror = LE_MALLOC; - return(-8); - } else { - *childrec = objptr; - - for(i=0; i<*count; i++) { - retmsg = recv_hg_msg(sockfd); - if ( retmsg != NULL ) { - if(0 == (int) *(retmsg->buf)) { - *objptr = estrdup(retmsg->buf+sizeof(int)); - objptr++; - efree(retmsg->buf); - efree(retmsg); - } else { - *objptr = NULL; - objptr++; - efree(retmsg->buf); - efree(retmsg); - } - } - } - } -#endif - return(0); -} - -int send_getobjbyftquerycoll(int sockfd, hw_objectID collID, char *query, int maxhits, hw_objectID **childIDs, float **weights, int *count) -{ - hg_msg msg, *retmsg; - int length, error; - char *tmp; - int *ptr, i, *ptr1; - float *ptr2; - - length = HEADER_LENGTH + strlen(query) + 1 + sizeof(int) + sizeof(collID); - - build_msg_header(&msg, length, msgid++, GETOBJBYFTQUERYCOLL_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, collID); - 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) { - char *cptr, tmp[20]; - float weight; - int j; - *count = (*ptr < maxhits) ? *ptr : maxhits; - ptr++; - if(NULL != (*childIDs = emalloc(*count * sizeof(hw_objectID)))) { - ptr1 = *childIDs; - if(NULL != (*weights = emalloc(*count * sizeof(float)))) { - ptr2 = *weights; - for(i=0; i<*count; i++) { - ptr1[i] = *ptr++; /* Object id */ - cptr = (char *) ptr; - j = 0; - while(*cptr != ' ') { - tmp[j++] = *cptr++; - } - cptr++; /* Skip space after weight */ - tmp[j] = '\0'; - sscanf(tmp, "%f", &weight); - ptr2[i] = weight; - ptr = (int *) cptr; - ptr++; /* Skip 0-Integer after weight string */ - } - } else { - efree(*childIDs); - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - efree(retmsg->buf); - efree(retmsg); - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return error; - } - return(0); -} - -int send_getobjbyftquerycollobj(int sockfd, hw_objectID collID, char *query, int maxhits, char ***childrec, float **weights, int *count) -{ - hg_msg msg, *retmsg; - int length, i, error; - char *tmp; - hw_objectID *childIDs = NULL; - int *ptr, *ptr1; - float *ptr2; - - length = HEADER_LENGTH + strlen(query) + 1 + sizeof(int) + sizeof(hw_objectID); - - build_msg_header(&msg, length, msgid++, GETOBJBYFTQUERYCOLL_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, collID); - 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) { - char *cptr, tmp[20]; - float weight; - int j; - *count = (*ptr < maxhits) ? *ptr : maxhits; - ptr++; - if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) { - ptr1 = childIDs; - if(NULL != (*weights = emalloc(*count * sizeof(float)))) { - ptr2 = *weights; - for(i=0; i<*count; i++) { - ptr1[i] = *ptr++; /* Object id */ - cptr = (char *) ptr; - j = 0; - while(*cptr != ' ') { - tmp[j++] = *cptr++; - } - cptr++; /* Skip space after weight */ - tmp[j] = '\0'; - sscanf(tmp, "%f", &weight); - ptr2[i] = weight; - ptr = (int *) cptr; - ptr++; /* Skip 0-Integer after weight string */ - } - efree(retmsg->buf); - efree(retmsg); - } else { - efree(childIDs); - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return error; - } - - /* Now get for each child collection the object record */ -#ifdef hw_less_server_stress - if(0 != send_objectbyidquery(sockfd, childIDs, count, NULL, childrec)) { - if(childIDs) efree(childIDs); - if(*weights) efree(weights); - return -2; - } - if(childIDs) efree(childIDs); -#else - for(i=0; i<*count; i++) { - length = HEADER_LENGTH + sizeof(hw_objectID); - build_msg_header(&msg, length, childIDs[i], GETOBJECT_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - efree(childIDs); - efree(*weights); - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_int(msg.buf, childIDs[i]); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - efree(childIDs); - efree(*weights); - return(-1); - } - - efree(msg.buf); - } - efree(childIDs); - - if(NULL == (objptr = (char **) emalloc(*count * sizeof(hw_objrec *)))) { - /* if emalloc fails, get at least all remaining messages from server */ - for(i=0; i<*count; i++) { - retmsg = recv_hg_msg(sockfd); - efree(retmsg->buf); - efree(retmsg); - } - *childrec = NULL; - lowerror = LE_MALLOC; - return(-1); - } else { - *childrec = objptr; - - for(i=0; i<*count; i++) { - retmsg = recv_hg_msg(sockfd); - if ( retmsg != NULL ) { - if(0 == (int) *(retmsg->buf)) { - *objptr = estrdup(retmsg->buf+sizeof(int)); - objptr++; - efree(retmsg->buf); - efree(retmsg); - } else { - *objptr = NULL; - objptr++; - efree(retmsg->buf); - efree(retmsg); - } - } - } - } -#endif - return(0); -} - -int send_getparents(int sockfd, hw_objectID objectID, hw_objectID **childIDs, int *count) -{ - hg_msg msg, *retmsg; - int length, i, error; - char *tmp; - int *ptr, *ptr1; - - length = HEADER_LENGTH + sizeof(hw_objectID); - - build_msg_header(&msg, length, msgid++, GETPARENT_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_int(msg.buf, objectID); - - if (-1 == send_hg_msg(sockfd, &msg, length)) { - efree(msg.buf); - return(-2); - } - - efree(msg.buf); - retmsg = recv_hg_msg(sockfd); - if ( retmsg == NULL ) { - return(-3); - } - - ptr = (int *) retmsg->buf; - if(ptr == NULL) { - if(retmsg) efree(retmsg); - return -1; - } - if(*ptr++ == 0) { - *count = *ptr++; - if(NULL != (*childIDs = emalloc(*count * sizeof(hw_objectID)))) { - ptr1 = *childIDs; - for(i=0; i<*count; ptr++, i++) - ptr1[i] = *ptr; - efree(retmsg->buf); - efree(retmsg); - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return error; - } - - return(0); -} - -int send_getparentsobj(int sockfd, hw_objectID objectID, char ***childrec, int *count) -{ - hg_msg msg, *retmsg; - int length, i, error; - char *tmp; - hw_objectID *childIDs = NULL; - int *ptr; - - length = HEADER_LENGTH + sizeof(hw_objectID); - - build_msg_header(&msg, length, msgid++, GETPARENT_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_int(msg.buf, objectID); - - if (-1 == send_hg_msg(sockfd, &msg, length)) { - 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) { - *count = *ptr++; - if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) { - for(i=0; i<*count; ptr++, i++) - childIDs[i] = *ptr; - efree(retmsg->buf); - efree(retmsg); - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return error; - } - - /* Now get for each parent the object record */ -#ifdef hw_less_server_stress - if(0 != send_objectbyidquery(sockfd, childIDs, count, NULL, childrec)) { - efree(childIDs); - return -2; - } - efree(childIDs); -#else - for(i=0; i<*count; i++) { - length = HEADER_LENGTH + sizeof(hw_objectID); - build_msg_header(&msg, length, childIDs[i], GETOBJECT_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_int(msg.buf, childIDs[i]); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - return(-1); - } - - efree(msg.buf); - } - efree(childIDs); - - if(NULL == (objptr = (char **) emalloc(*count * sizeof(hw_objrec *)))) { - /* if emalloc fails, get at least all remaining messages from server */ - for(i=0; i<*count; i++) { - retmsg = recv_hg_msg(sockfd); - efree(retmsg->buf); - efree(retmsg); - } - *childrec = NULL; - lowerror = LE_MALLOC; - return(-1); - } else { - *childrec = objptr; - - for(i=0; i<*count; i++) { - retmsg = recv_hg_msg(sockfd); - if ( retmsg != NULL ) { - if(0 == (int) *(retmsg->buf)) { - *objptr = estrdup(retmsg->buf+sizeof(int)); - objptr++; - efree(retmsg->buf); - efree(retmsg); - } else { - *objptr = NULL; - objptr++; - efree(retmsg->buf); - efree(retmsg); - } - } - } - } -#endif - return(0); -} - -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; - char *tmp, header[80], *head_ptr, *sizestr; - struct sockaddr_in serv_addr; - struct hostent *hostptr; - char *hostip = NULL; - char *attributes = NULL; - char *documenttype; - char **anchors; - int newfd, fd, port, size, error, ancount; - int *ptr; - - if(-1 == (fd = fnCOpenDataCon(sockfd, &port))) { - /* not set yet efree(msg.buf); */ - return(-1); - } - - /* - ** Get information about host - */ - if(host) { - if((hostptr = gethostbyname(host)) == NULL) { - HWSOCK_FCLOSE(fd); - return(-2); - } - } else { - HWSOCK_FCLOSE(fd); - return(-2); - } - - switch(hostptr->h_addrtype) { - struct in_addr *ptr1; - case AF_INET: - ptr1 = (struct in_addr *) hostptr->h_addr_list[0]; - hostip = inet_ntoa(*ptr1); - break; - default: - HWSOCK_FCLOSE(fd); - return(-3); - break; - } - - /* Bottom half of send_getobject */ - if(0 > bh_send_getobject(sockfd, objectID)) { - HWSOCK_FCLOSE(fd); - return -4; - } - - /* Upper half of send_getobject */ - if(0 > (error = uh_send_getobject(sockfd, &attributes))) { - HWSOCK_FCLOSE(fd); - return error; - } - - length = HEADER_LENGTH + sizeof(hw_objectID) + sizeof(int) + strlen(hostip) + 1 + strlen("Refno=0x12345678") + 1; - build_msg_header(&msg, length, msgid++, PIPEDOCUMENT_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { - if(attributes) efree(attributes); - lowerror = LE_MALLOC; - return(-5); - } - - tmp = build_msg_int(msg.buf, objectID); - tmp = build_msg_int(tmp, port); - tmp = build_msg_str(tmp, hostip); - tmp = build_msg_str(tmp, "Refno=0x12345678"); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - if(attributes) efree(attributes); - efree(msg.buf); - HWSOCK_FCLOSE(fd); - return(-6); - } - efree(msg.buf); - - /* Just check if the command was understood */ - retmsg = recv_hg_msg(sockfd); - if ( retmsg == NULL ) { - if(attributes) efree(attributes); - HWSOCK_FCLOSE(fd); - return(-7); - } - - ptr = (int *) retmsg->buf; - if((ptr == NULL) || (*ptr != 0)) { - error = *ptr; - if(retmsg->buf) efree(retmsg->buf); - efree(retmsg); - if(attributes) efree(attributes); - HWSOCK_FCLOSE(fd); - return(error); - } - - efree(retmsg->buf); - efree(retmsg); - - /* passively open the data connection. The HG server is probably - already waiting for us. - */ - 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"); */ - if(attributes) efree(attributes); - HWSOCK_FCLOSE(fd); - return(-8); - } else { - HWSOCK_FCLOSE(fd); - } - - /* First of all read the header */ - head_ptr = header; - while((read_to(newfd, head_ptr, 1, rtimeout) == 1) && (*head_ptr != '\0')) { - head_ptr++; - } - - /* Let's see how big the document is and read it into var text */ - sizestr = strstr(header, "sz="); - if(sizestr) { - sizestr += 3; - sscanf(sizestr, "%d\n", &size); - *count = size; - if((size != 0) && (NULL != (*text = malloc(size+1)))) { - read_to(newfd, *text, size, rtimeout); - (*text)[size] = '\0'; - } - } else { - *text = NULL; - } - - /* close the data connection */ - HWSOCK_FCLOSE(newfd); - - documenttype = fnAttributeValue(attributes, "DocumentType"); - - /* Make a copy with strdup (not estrdup), because we want to - keep the attributes in hw_document struct. - */ - *objattr = strdup(attributes); - efree(attributes); - - if((documenttype != NULL) && (!strcmp(documenttype, "text") != 0)) { - if(send_getanchorsobj(sockfd, objectID, &anchors, &ancount) == 0) { - char **destrec, **reldestrec; -#ifdef newlist - zend_llist *pAnchorList = NULL; -#else - DLIST *pAnchorList = NULL; -#endif - - /* Get dest as relative and absolut path */ - send_getdestforanchorsobj(sockfd, anchors, &destrec, ancount); - send_getreldestforanchorsobj(sockfd, anchors, &reldestrec, ancount, rootid, objectID); - pAnchorList = fnCreateAnchorList(objectID, anchors, destrec, reldestrec, ancount, mode); - /* Free only the array, the objrecs has been freed in fnCreateAnchorList() */ - if(anchors) efree(anchors); - if(destrec) efree(destrec); - if(reldestrec) efree(reldestrec); - - if(pAnchorList != NULL) { - char *newtext; - char *body = NULL; - - newtext = fnInsAnchorsIntoText(*text, pAnchorList, &body, urlprefix); -#ifdef newlist - zend_llist_destroy(pAnchorList); - efree(pAnchorList); -#else - dlst_kill(pAnchorList, fnDeleteAnchor); -#endif - *bodytag = strdup(body); - if(body) efree(body); - *text = newtext; - *count = strlen(newtext); - } - } - } else { - *bodytag = NULL; - } - - if(documenttype) efree(documenttype); - return(0); -} - -int send_pipecgi(int sockfd, char *host, hw_objectID objectID, char *cgi_env_str, char **objattr, char **text, int *count) -{ - hg_msg msg, *retmsg; - int length, len, new_attr_len; - char *tmp, header[80], *head_ptr, *sizestr; - struct sockaddr_in serv_addr; - struct hostent *hostptr; - char *hostip = NULL; - char *attributes = NULL; - char *documenttype, *new_attr; - int newfd, fd, port, size, error; - int *ptr; - - if(-1 == (fd = fnCOpenDataCon(sockfd, &port))) { - /* not set yet? efree(msg.buf); */ - return(-1); - } - - /* - ** Get information about host - */ - if(host) { - if((hostptr = gethostbyname(host)) == NULL) { - HWSOCK_FCLOSE(fd); - return(-1); - } - } else { - HWSOCK_FCLOSE(fd); - return(-1); - } - - switch(hostptr->h_addrtype) { - struct in_addr *ptr1; - case AF_INET: - ptr1 = (struct in_addr *) hostptr->h_addr_list[0]; - hostip = inet_ntoa(*ptr1); - break; - default: -/* php_printf(stderr, "unknown address type\n"); */ - break; - } - - /* Bottom half of send_getobject */ - if(0 > bh_send_getobject(sockfd, objectID)) { - HWSOCK_FCLOSE(fd); - return -1; - } - - /* Upper half of send_getobject */ - if(0 > (error = uh_send_getobject(sockfd, &attributes))) { - HWSOCK_FCLOSE(fd); - return error; - } - - new_attr_len = strlen(attributes) + strlen(cgi_env_str) + 2; - new_attr = malloc(new_attr_len); - strcpy(new_attr, attributes); - strcat(new_attr, cgi_env_str); - length = HEADER_LENGTH + strlen(new_attr) + 1 + sizeof(int) + strlen(hostip) + 1 + sizeof(int) + sizeof(int); - build_msg_header(&msg, length, msgid++, PIPECGI_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { - if(attributes) efree(attributes); - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_str(msg.buf, hostip); - tmp = build_msg_int(tmp, port); - tmp = build_msg_str(tmp, new_attr); - tmp = build_msg_int(tmp, 1); - tmp = build_msg_int(tmp, 0x12345678); - free(new_attr); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - if(attributes) efree(attributes); - efree(msg.buf); - HWSOCK_FCLOSE(fd); - return(-1); - } - efree(msg.buf); - - /* Just check if the command was understood */ - retmsg = recv_hg_msg(sockfd); - if ( retmsg == NULL ) { - if(attributes) efree(attributes); - HWSOCK_FCLOSE(fd); - return(-1); - } - - ptr = (int *) retmsg->buf; - if((ptr == NULL) || (*ptr != 0)) { - if(retmsg->buf) efree(retmsg->buf); - efree(retmsg); - if(attributes) efree(attributes); - HWSOCK_FCLOSE(fd); - return(-1); - } - - efree(retmsg->buf); - efree(retmsg); - - /* passively open the data connection. The HG server is probably - already waiting for us. - */ - len = sizeof(serv_addr); - if((newfd = accept(fd, (struct sockaddr *) &serv_addr, &len)) < 0) { - if(attributes) efree(attributes); - HWSOCK_FCLOSE(fd); - return(-1); - } else { - HWSOCK_FCLOSE(fd); - } - - /* First of all read the header */ - head_ptr = header; - while((read_to(newfd, head_ptr, 1, rtimeout) == 1) && (*head_ptr != '\0')) { - head_ptr++; - } - - /* Let's see how big the document is and read it into var text */ - sizestr = strstr(header, "sz="); - if(sizestr) { - sizestr += 3; - sscanf(sizestr, "%d\n", &size); - *count = size; - if((size != 0) && (NULL != (*text = malloc(size+1)))) { - read_to(newfd, *text, size, rtimeout); - } - } else { - *text = NULL; - } - - /* close the data connection */ - HWSOCK_FCLOSE(newfd); - - documenttype = fnAttributeValue(attributes, "DocumentType"); - - /* Make a copy with strdup (not estrdup), because we want to - keep the attributes in hw_document struct. - */ - *objattr = strdup(attributes); - efree(attributes); - - if(documenttype) efree(documenttype); - return(0); -} - -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; - char *tmp, header[80], parms[30], *head_ptr; - struct sockaddr_in serv_addr; - struct hostent *hostptr; - char *hostip = NULL; - int newfd, fd, port, error; - int *ptr; - - /* First of all we have to insert the document record */ - sprintf(parms, "Parent=0x%x", parentID); - length = HEADER_LENGTH + strlen(objectRec) + 1 + strlen(parms) + 1; - - build_msg_header(&msg, length, msgid++, INSERTOBJECT_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_str(msg.buf, objectRec); - tmp = build_msg_str(tmp, parms); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - return(-2); - } - - efree(msg.buf); - retmsg = recv_hg_msg(sockfd); - if ( retmsg == NULL ) { - return(-3); - } - - ptr = (int *) retmsg->buf; - if(0 == (error = *ptr)) { - ptr++; - *objectID = *ptr; - } else { - if(retmsg->buf) efree(retmsg->buf); - efree(retmsg); - return(error); - } - - efree(retmsg->buf); - efree(retmsg); - - /* - ** Get information about host - */ - if(host) { - if((hostptr = gethostbyname(host)) == NULL) { - /* close(fd); fd is not set yet */ - return(-4); - } - } else { - /* close(fd); fd is not set yet */ - return(-5); - } - - switch(hostptr->h_addrtype) { - struct in_addr *ptr1; - case AF_INET: - ptr1 = (struct in_addr *) hostptr->h_addr_list[0]; - hostip = inet_ntoa(*ptr1); - break; - default: -/* fprintf(stderr, "unknown address type\n"); */ - break; - } - - if(-1 == (fd = fnCOpenDataCon(sockfd, &port))) { - efree(msg.buf); - return(-6); - } - - /* Start building the PUTDOCUMENT message. I works even if - the Refno is skipped. I guess the path can be omitted too. */ - length = HEADER_LENGTH + sizeof(hw_objectID) + sizeof(int) + strlen(hostip) + 1 + strlen("Hyperwave") + 1+ strlen("Refno=0x12345678") + 1; - - build_msg_header(&msg, length, msgid++, PUTDOCUMENT_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { - lowerror = LE_MALLOC; - return(-7); - } - - 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"); - tmp = build_msg_str(tmp, "Refno=0x12345678"); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(msg.buf); - HWSOCK_FCLOSE(fd); - return(-8); - } - efree(msg.buf); - - /* passively open the data connection. The HG server is probably - already waiting for us. - */ - len = sizeof(serv_addr); - if((newfd = accept(fd, (struct sockaddr *) &serv_addr, &len)) < 0) { - HWSOCK_FCLOSE(fd); - return(-9); - } else { - HWSOCK_FCLOSE(fd); - } - - /* First of all write the header. According to the documentation - there should be a header first. Well, after some investigation - with tcpdump I found out, that Harmony and wavemaster don't - sent it. The also do not sent the Refno in the PUTDOCUMENT msg. - Anyway, we sent both. */ - head_ptr = header; - sprintf(header, "HGHDR\nsz=%d\nref=12345678\n", count); - len = strlen(header) + 1; - if(len != write_to(newfd, header, len, wtimeout)) { - HWSOCK_FCLOSE(newfd); - return(-10); - } - - /* And now the document */ - if(count != write_to(newfd, text, count, wtimeout)) { - HWSOCK_FCLOSE(newfd); - return(-11); - } - - /* The data connection has to be close before the return - msg can be read. The server will not sent it before. */ - HWSOCK_FCLOSE(newfd); - - /* Just check if the command was understood */ - retmsg = recv_hg_msg(sockfd); - if ( retmsg == NULL ) { - HWSOCK_FCLOSE(fd); - return(-12); - } - - ptr = (int *) retmsg->buf; - if((ptr == NULL) || (*ptr != 0)) { - if(retmsg->buf) efree(retmsg->buf); - efree(retmsg); - HWSOCK_FCLOSE(fd); - return(-13); - } - - efree(retmsg->buf); - efree(retmsg); - - return(0); -} - -int send_getsrcbydest(int sockfd, hw_objectID objectID, char ***childrec, int *count) -{ - hg_msg msg, *retmsg; - int length, i, error; - char *tmp; - int *childIDs = NULL; - char **objptr; - int *ptr, *ptr1; - - length = HEADER_LENGTH + sizeof(hw_objectID); - - build_msg_header(&msg, length, msgid++, GETSRCBYDEST_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); - - ptr = (int *) retmsg->buf; - if(ptr == NULL) { - if(retmsg) efree(retmsg); - return -1; - } - if(*ptr++ == 0) { - *count = *ptr; - ptr++; - if(NULL != (childIDs = emalloc(*count * sizeof(hw_objectID)))) { - ptr1 = childIDs; - for(i=0; i<*count; ptr++, i++) - ptr1[i] = *ptr; - efree(retmsg->buf); - efree(retmsg); - } else { - efree(retmsg->buf); - efree(retmsg); - lowerror = LE_MALLOC; - return(-1); - } - } else { - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return error; - } - - /* Now get for each source the object record */ - for(i=0; i<*count; i++) { - length = HEADER_LENGTH + sizeof(hw_objectID); - build_msg_header(&msg, length, childIDs[i], GETOBJECT_MESSAGE); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - efree(childIDs); - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_int(msg.buf, childIDs[i]); - - if ( send_hg_msg(sockfd, &msg, length) == -1 ) { - efree(childIDs); - efree(msg.buf); - return(-1); - } - - efree(msg.buf); - } - efree(childIDs); - - if(NULL == (objptr = (char **) emalloc(*count * sizeof(hw_objrec *)))) { - /* if emalloc fails, get at least all remaining messages from server */ - for(i=0; i<*count; i++) { - retmsg = recv_hg_msg(sockfd); - efree(retmsg->buf); - efree(retmsg); - } - *childrec = NULL; - lowerror = LE_MALLOC; - return(-1); - } else { - *childrec = objptr; - - for(i=0; i<*count; i++) { - retmsg = recv_hg_msg(sockfd); - if ( retmsg != NULL ) { - if(0 == (int) *(retmsg->buf)) { - *objptr = estrdup(retmsg->buf+sizeof(int)); - objptr++; - efree(retmsg->buf); - efree(retmsg); - } else { - *objptr = NULL; - objptr++; - efree(retmsg->buf); - efree(retmsg); - } - } - } - } - - return(0); -} - -int send_mapid(int sockfd, int servid, hw_objectID id, int *virtid) -{ - hg_msg msg, *retmsg; - int length, error; - char *tmp; - int *ptr; - - length = HEADER_LENGTH + 2 * sizeof(hw_objectID); - - build_msg_header(&msg, length, msgid++, HG_MAPID); - - if ( (msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { - lowerror = LE_MALLOC; - return(-1); - } - - tmp = build_msg_int(msg.buf, servid); - tmp = build_msg_int(tmp, id); - - if (-1 == send_hg_msg(sockfd, &msg, length)) { - efree(msg.buf); - return(-2); - } - - efree(msg.buf); - retmsg = recv_hg_msg(sockfd); - if ( retmsg == NULL ) { - return(-3); - } - - ptr = (int *) retmsg->buf; - if(ptr == NULL) { - if(retmsg) efree(retmsg); - return -1; - } - if(*ptr++ == 0) { - *virtid = *ptr; - } else { - error = *((int *) retmsg->buf); - efree(retmsg->buf); - efree(retmsg); - return error; - } - - return(0); -} - -#define BUFFERLEN 200 -char *get_hw_info(hw_connection *conn) { - char temp[BUFFERLEN]; - int len; - struct sockaddr_in serv_addr; - - len = sizeof (serv_addr); - if(getsockname(conn->socket, (struct sockaddr *)&serv_addr, &len) < 0) - return(NULL); - - 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); -#endif - if ( length < HEADER_LENGTH ) { -/* fprintf(stderr, "send_hg_msg: bad msg\n"); */ - return(-1); - } - - if ( (tmp = buf = (char *)emalloc(length)) == NULL ) { -/* perror("send_hg_msg"); */ - lowerror = LE_MALLOC; - return(-1); - } - - memcpy(tmp, (char *) &(msg->length), 4); - tmp += 4; - memcpy(tmp, (char *) &(msg->version_msgid), 4); - tmp += 4; - memcpy(tmp, (char *) &(msg->msg_type), 4); - if ( msg->length > HEADER_LENGTH ) { - tmp += 4; - memcpy(tmp, msg->buf, length-HEADER_LENGTH); - } - - if ( hg_write(sockfd, buf, length) == -1 ) { - efree(buf); - return(-1); - } - - efree(buf); - return(0); -} - - -int send_ready(int sockfd) -{ - hg_msg ready_msg; - - build_msg_header(&ready_msg, HEADER_LENGTH, version, READY_MESSAGE); - ready_msg.buf = NULL; - - if ( send_hg_msg(sockfd, &ready_msg, HEADER_LENGTH) == -1 ) { - return(-1); - } - - return(0); -} - - -int send_command(int sockfd, int command, char **answer) -{ - hg_msg comm_msg, *retmsg; - char *comm_str, *tmp; - int respond = 1; - int length; - - if ( command == STAT_COMMAND ) - comm_str = STAT_COMMAND_STR; - else - comm_str = WHO_COMMAND_STR; - length = HEADER_LENGTH + sizeof(respond) + strlen(comm_str) + 1; - - build_msg_header(&comm_msg, length, msgid++, COMMAND_MESSAGE); - - if ( (comm_msg.buf = (char *)emalloc(length-HEADER_LENGTH)) == NULL ) { -/* perror("send_command"); */ - lowerror = LE_MALLOC; - return(-1); - } - - - tmp = build_msg_int(comm_msg.buf, respond); - tmp = build_msg_str(tmp, comm_str); - - - if ( send_hg_msg(sockfd, &comm_msg, length) == -1 ) { - efree(comm_msg.buf); - return(-1); - } - efree(comm_msg.buf); - - /* Just check if the command was understood */ - retmsg = recv_hg_msg(sockfd); - if ( retmsg == NULL ) { - return(-1); - } - - *answer = retmsg->buf; - efree(retmsg); - - return(0); -} - - -static void build_msg_header(hg_msg *msg, int length, int version_msgid, int msg_type) -{ - if ( swap_on ) { - msg->length = swap(length); - msg->version_msgid = swap(version_msgid); - msg->msg_type = swap(msg_type); - } - else { - msg->length = length; - msg->version_msgid = version_msgid; - msg->msg_type = msg_type; - } -} - - -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); -#endif - tmp = swap_on ? swap(val) : val; - memcpy(buf, (char *)&tmp, 4); - - return(buf+4); -} - - -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)); -#endif - - memcpy(buf, str, len); - - return(buf+len); -} - - -static int swap(int val) -{ - int tmp; - - ((char*)&tmp)[0] = ((char*)&val)[3]; - ((char*)&tmp)[1] = ((char*)&val)[2]; - ((char*)&tmp)[2] = ((char*)&val)[1]; - ((char*)&tmp)[3] = ((char*)&val)[0]; - - return(tmp); -} - - -void close_hg_connection(int sockfd) -{ - shutdown(sockfd, 2); - HWSOCK_FCLOSE(sockfd); -} - -#endif - -/* - * Local variables: - * tab-width: 4 - * End: - */ - diff --git a/ext/hyperwave/hg_comm.h b/ext/hyperwave/hg_comm.h deleted file mode 100644 index bad54010e9..0000000000 --- a/ext/hyperwave/hg_comm.h +++ /dev/null @@ -1,238 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP Version 4 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2003 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 2.02 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.php.net/license/2_02.txt. | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: Rasmus Lerdorf <rasmus@php.net> | - +----------------------------------------------------------------------+ -*/ - -/* $Id$ */ - -#ifndef HG_COMM_H -#define HG_COMM_H - -#if HYPERWAVE - -#define newlist - -#include "hw_error.h" -#ifdef newlist -#else -#include "dlist.h" -#endif -#define HG_SERVER_PORT 418 - -#define F_DISTRIBUTED 0x80000000 -#define F_COMPRESSED 0x40000000 -#define F_VERSION 0x00003fff -#define HW_VERSION 717L /* 7.17 */ - -#define HEADER_LENGTH 12 - -#define STAT_COMMAND_STR "stat" -#define WHO_COMMAND_STR "who" -#define STAT_COMMAND 1 -#define WHO_COMMAND 2 - -#define GETDOCBYANCHOR_MESSAGE 2 -#define GETCHILDCOLL_MESSAGE 3 -#define GETPARENT_MESSAGE 4 -#define GETCHILDDOCCOLL_MESSAGE 5 -#define GETOBJECT_MESSAGE 7 -#define GETANCHORS_MESSAGE 8 -#define GETOBJBYQUERY_MESSAGE 9 -#define GETOBJBYQUERYCOLL_MESSAGE 10 -#define OBJECTBYIDQUERY_MESSAGE 11 -#define GETTEXT_MESSAGE 12 -#define INSDOC_MESSAGE 14 -#define INSCOLL_MESSAGE 17 -#define GETSRCBYDEST_MESSAGE 19 -#define MVCPDOCSCOLL_MESSAGE 22 -#define MVCPCOLLSCOLL_MESSAGE 23 -#define IDENTIFY_MESSAGE 24 -#define READY_MESSAGE 25 -#define COMMAND_MESSAGE 26 -#define CHANGEOBJECT_MESSAGE 27 -#define EDITTEXT_MESSAGE 28 -#define GETANDLOCK_MESSAGE 29 -#define UNLOCK_MESSAGE 30 -#define INCOLLECTIONS_MESSAGE 31 -#define INSERTOBJECT_MESSAGE 32 -#define GETOBJBYFTQUERY_MESSAGE 34 -#define GETOBJBYFTQUERYCOLL_MESSAGE 35 -#define PIPEDOCUMENT_MESSAGE 36 -#define DELETEOBJECT_MESSAGE 37 -#define PUTDOCUMENT_MESSAGE 38 -#define GETREMOTE_MESSAGE 39 -#define GETREMOTECHILDREN_MESSAGE 40 -#define HG_MAPID 43 -#define CHILDREN_MESSAGE 44 -#define GETCGI_MESSAGE 45 -#define PIPECGI_MESSAGE 46 - -#define HW_DEFAULT_LINK 0 -#define HW_IMAGE_LINK 1 -#define HW_BACKGROUND_LINK 2 -#define HW_INTAG_LINK 3 -#define HW_APPLET_LINK 4 -#define HW_INTAGNODEL_LINK 5 - -#define COPY 0 -#define MOVE 1 -#define DOCUMENT 0 -#define COLLECTION 1 - - -#ifdef PHP_WIN32 -# define SOCK_ERR INVALID_SOCKET -# define SOCK_CONN_ERR SOCKET_ERROR -# define HWSOCK_FCLOSE(s) closesocket(s) -#else -# define SOCK_ERR -1 -# define SOCK_CONN_ERR -1 -# define HWSOCK_FCLOSE(s) close(s) -#endif - - -/* Low error messages */ -#define LE_MALLOC -1 - -typedef struct { - int id; /* object ID of anchor */ - int tanchor; /* Type of anchor. Can be 1=Src, 2=Dest */ - int start; /* start of anchor */ - int end; /* end of anchor */ - char *nameanchor; /* name tag attribute of destination document */ - /* if anchor is of type Src the following are used as well */ - char *destdocname; /* name of destination document */ - char *link; /* url for external destination */ - int linktype; /* type of link. see above */ - char *tagattr; /* more attributes of tag, like Border=0 */ - char *htmlattr; /* */ - char *codebase; /* codebase of applet */ - char *code; /* code of applet */ - char *fragment; /* name link of Src */ - - /* if anchor is of type Dest the following are used as well */ - char *keyword; /* name link of Dest */ - } ANCHOR; - -typedef struct { - int length; - int version_msgid; - int msg_type; - char *buf; -} hg_msg; - -typedef struct { - int socket; - int swap_on; - int version; - char *server_string; - char *hostname; - char *username; - int lasterror; - int linkroot; -} hw_connection; - -typedef int hw_objectID; -typedef char hw_objrec; -typedef float hw_float; - -#ifdef newlist -void fnDeleteAnchor(void *ptr1); -void fnListAnchor(zend_llist *pAnchorList); -zend_llist *fnCreateAnchorList(hw_objectID objID, char **anchors, char **docofanchorrec, char **reldestrec, int ancount, int anchormode); -char *fnInsAnchorsIntoText(char *text, zend_llist *pAnchorList, char **bodytag, char **urlprefix); -int fnCmpAnchors(const void *e1, const void *e2 TSRMLS_DC); -ANCHOR *fnAddAnchor(zend_llist *pAnchorList, int objectID, int start, int end); -#else -void fnDeleteAnchor(ANCHOR *ptr); -void fnListAnchor(DLIST *pAnchorList); -DLIST *fnCreateAnchorList(hw_objectID objID, char **anchors, char **docofanchorrec, char **reldestrec, int ancount, int anchormode); -char *fnInsAnchorsIntoText(char *text, DLIST *pAnchorList, char **bodytag, char **urlprefix); -int fnCmpAnchors(ANCHOR *a1, ANCHOR *a2 TSRMLS_DC); -ANCHOR *fnAddAnchor(DLIST *pAnchorList, int objectID, int start, int end); -#endif -extern void set_swap(int do_swap); -extern int open_hg_connection(char *server_name, int port); -extern void close_hg_connection(int sockfd); -extern int initialize_hg_connection(int sockfd, int *do_swap, int *version, char **userdata, char **server_string, char *username, char *password); - -extern int send_ready(int sockfd); -extern int send_command(int sockfd, int command, char **answer); - -extern hg_msg *recv_hg_msg(int sockfd); -extern hg_msg *recv_ready(int sockfd); -extern hg_msg *recv_command(int sockfd); - -extern char *fnInsStr(char *str, int pos, char *insstr); -extern int fnAttributeCompare(char *object, char *attrname, char *value); -extern char *fnAttributeValue(char *object, char *attrname); -extern int getrellink(int sockfd, int rootID, int thisID, int destID, char **reldesstr); - -extern int send_deleteobject(int sockfd, hw_objectID objectID); -extern int send_changeobject(int sockfd, hw_objectID objectID, char *mod); -extern int send_groupchangeobject(int sockfd, hw_objectID objectID, char *mod); -extern int send_getobject(int sockfd, hw_objectID objectID, char **attributes); -extern int send_getandlock(int sockfd, hw_objectID objectID, char **attributes); -extern int send_lock(int sockfd, hw_objectID objectID); -extern int send_unlock(int sockfd, hw_objectID objectID); -extern int send_gettext(int sockfd, hw_objectID objectID, int mode, int rootid, char **objattr, char **bodytag, char **text, int *count, char *urlprefix); -extern int send_edittext(int sockfd, char *objattr, char *text); -extern int send_getcgi(int sockfd, hw_objectID objectID, char *cgi_env_str, char **objattr, char **text, int *count); -extern int send_getremote(int sockfd, hw_objectID objectID, char **objattr, char **text, int *count); -extern int send_getremotechildren(int sockfd, char *attributes, char **text, int **childIDs, int *count); -extern int send_docbyanchor(int sockfd, hw_objectID objectID, hw_objectID *anchorID); -extern int send_docbyanchorobj(int sockfd, hw_objectID objectID, char **objrec); -extern int send_mvcpdocscollscoll(int sockfd, hw_objectID *objectIDs, int count, int from, int dest, int cpmv, int docscoll); -extern int send_childrenobj(int sockfd, hw_objectID objectID, char ***childrec, int *count); -extern int send_getchildcoll(int sockfd, int objectID, hw_objectID **childIDs, int *count); -extern int send_getchildcollobj(int sockfd, hw_objectID objectID, hw_objrec ***childrec, int *count); -extern int send_getchilddoccoll(int sockfd, hw_objectID objectID, hw_objectID **childIDs, int *count); -extern int send_getchilddoccollobj(int sockfd, hw_objectID objectID, hw_objrec ***childrec, int *count); -extern int send_getanchors(int sockfd, hw_objectID objectID, hw_objectID **anchorIDs, int *count); -extern int send_getanchorsobj(int sockfd, hw_objectID objectID, char ***childrec, int *count); -extern int send_objectbyidquery(int sockfd, hw_objectID *IDs, int *count, char *query, char ***objrecs); -extern int send_getobjbyquery(int sockfd, char *query, int maxhits, hw_objectID **childIDs, int *count); -extern int send_getobjbyqueryobj(int sockfd, char *query, int maxhits, char ***childrec, int *count); -extern int send_getobjbyquerycoll(int sockfd, hw_objectID collID, char *query, int maxhits, hw_objectID **childIDs, int *count); -extern int send_getobjbyquerycollobj(int sockfd, hw_objectID collID, char *query, int maxhits, char ***childrec, int *count); -extern int send_getobjbyftquery(int sockfd, char *query, int maxhits, hw_objectID **childIDs, float **weights, int *count); -extern int send_getobjbyftqueryobj(int sockfd, char *query, int maxhits, char ***childrec, float **weights, int *count); -extern int send_getobjbyftquerycoll(int sockfd, hw_objectID collID, char *query, int maxhits, hw_objectID **childIDs, float **weight, int *count); -extern int send_getobjbyftquerycollobj(int sockfd, hw_objectID collID, char *query, int maxhits, char ***childrec, float **weight, int *count); -extern int send_identify(int sockfd, char *name, char *passwd, char **userdata); -extern int send_getparents(int sockfd, hw_objectID objectID, hw_objectID **childIDs, int *count); -extern int send_children(int sockfd, hw_objectID objectID, hw_objectID **childIDs, int *count); -extern int send_getparentsobj(int sockfd, hw_objectID objectID, char ***childrec, int *count); -extern int send_pipedocument(int sockfd, char *hostname, hw_objectID objectID, int mode, int rootid, char** objattr, char **bodytag, char **text, int *count, char **urlprefix); -extern int send_pipecgi(int sockfd, char *host, hw_objectID objectID, char *cgi_env_str, char **objattr, char **text, int *count); -extern int send_putdocument(int sockfd, char *hostname, hw_objectID parentID, char *objectRec, char *text, int count, hw_objectID *objectID); -extern int send_inscoll(int sockfd, hw_objectID objectID, char *objrec, hw_objectID *new_objectID); -extern int send_insertobject(int sockfd, char *objrec, char *parms, hw_objectID *objectID); -extern int send_insdoc(int sockfd, hw_objectID objectID, char *objrec, char *text, hw_objectID *new_objectID); -extern int send_incollections(int sockfd, int retcol, int cobjids, hw_objectID *objectIDs, int ccollids, hw_objectID *collIDs, int *count, hw_objectID **retIDs); -extern int send_getsrcbydest(int sockfd, hw_objectID objid, char ***childrec, int *count); -extern int send_mapid(int sockfd, int servid, hw_objectID id, int *virtid); -extern int send_dummy(int sockfd, hw_objectID objectID, int msgid, char **attributes); -extern int send_insertanchors(char **text, int *count, char **anchors, char **destrec, int ancount, char **urlprefix, char **bodytag); -extern char *get_hw_info(hw_connection *conn); - -#define send_mvcpdocscoll(sockfd, objectIDs, count, from, dest, mvcp) \ - send_mvcpdocscollscoll(sockfd, objectIDs, count, from, dest, mvcp, DOCUMENT) -#define send_mvcpcollscoll(sockfd, objectIDs, count, from, dest, mvcp) \ - send_mvcpdocscollscoll(sockfd, objectIDs, count, from, dest, mvcp, COLLECTION) - -#endif -#endif diff --git a/ext/hyperwave/hw.c b/ext/hyperwave/hw.c deleted file mode 100644 index 8859e13952..0000000000 --- a/ext/hyperwave/hw.c +++ /dev/null @@ -1,4081 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP Version 4 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2003 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 2.02 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.php.net/license/2_02.txt. | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: Uwe Steinmann <Uwe.Steinmann@fernuni-hagen.de> | - +----------------------------------------------------------------------+ - */ - -/* $Id$ */ - -#include <stdlib.h> -#include <errno.h> - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "php.h" -#include "php_globals.h" -#include "ext/standard/php_standard.h" -#include "ext/standard/head.h" -#include "ext/standard/info.h" -#include "fopen_wrappers.h" -#include "SAPI.h" - -#ifdef PHP_WIN32 -#include <winsock2.h> -#endif - -#if HYPERWAVE - -#include "php_ini.h" -#include "php_hyperwave.h" - -static int le_socketp, le_psocketp, le_document; - -/*hw_module php_hw_module;*/ - -#define HW_ATTR_NONE 1 -#define HW_ATTR_LANG 2 -#define HW_ATTR_NR 3 - -function_entry hw_functions[] = { - PHP_FE(hw_connect, NULL) - PHP_FE(hw_pconnect, NULL) - PHP_FE(hw_close, NULL) - PHP_FE(hw_root, NULL) - PHP_FE(hw_info, NULL) - PHP_FE(hw_connection_info, NULL) - PHP_FE(hw_error, NULL) - PHP_FE(hw_errormsg, NULL) - PHP_FE(hw_getparentsobj, NULL) - PHP_FE(hw_getparents, NULL) - PHP_FE(hw_children, NULL) - PHP_FE(hw_childrenobj, NULL) - PHP_FE(hw_getchildcoll, NULL) - PHP_FE(hw_getchildcollobj, NULL) - PHP_FE(hw_getobject, NULL) - PHP_FE(hw_getandlock, NULL) - PHP_FE(hw_unlock, NULL) - PHP_FE(hw_gettext, NULL) - PHP_FE(hw_edittext, NULL) - PHP_FE(hw_getcgi, NULL) - PHP_FE(hw_getremote, NULL) - PHP_FE(hw_getremotechildren, NULL) - PHP_FE(hw_pipedocument, NULL) - PHP_FE(hw_pipecgi, NULL) - PHP_FE(hw_insertdocument, NULL) - PHP_FE(hw_mv, NULL) - PHP_FE(hw_cp, NULL) - PHP_FE(hw_deleteobject, NULL) - PHP_FE(hw_changeobject, NULL) - PHP_FE(hw_modifyobject, NULL) - PHP_FE(hw_docbyanchor, NULL) - PHP_FE(hw_docbyanchorobj, NULL) - PHP_FE(hw_getobjectbyquery, NULL) - PHP_FE(hw_getobjectbyqueryobj, NULL) - PHP_FE(hw_getobjectbyquerycoll, NULL) - PHP_FE(hw_getobjectbyquerycollobj, NULL) - PHP_FE(hw_getobjectbyftquery, NULL) - PHP_FE(hw_getobjectbyftqueryobj, NULL) - PHP_FE(hw_getobjectbyftquerycoll, NULL) - PHP_FE(hw_getobjectbyftquerycollobj, NULL) - PHP_FE(hw_getchilddoccoll, NULL) - PHP_FE(hw_getchilddoccollobj, NULL) - PHP_FE(hw_getanchors, NULL) - PHP_FE(hw_getanchorsobj, NULL) - PHP_FE(hw_getusername, NULL) - PHP_FE(hw_setlinkroot, NULL) - PHP_FE(hw_identify, NULL) - PHP_FE(hw_free_document, NULL) - PHP_FE(hw_new_document, NULL) - PHP_FE(hw_new_document_from_file, NULL) - PHP_FE(hw_output_document, NULL) - PHP_FE(hw_document_size, NULL) - PHP_FE(hw_document_attributes, NULL) - PHP_FE(hw_document_bodytag, NULL) - PHP_FE(hw_document_content, NULL) - PHP_FE(hw_document_setcontent, NULL) - PHP_FE(hw_objrec2array, NULL) - PHP_FE(hw_array2objrec, NULL) - PHP_FE(hw_incollections, NULL) - PHP_FE(hw_inscoll, NULL) - PHP_FE(hw_insertobject, NULL) - PHP_FE(hw_insdoc, NULL) - PHP_FE(hw_getsrcbydestobj, NULL) - PHP_FE(hw_insertanchors, NULL) - PHP_FE(hw_getrellink, NULL) - PHP_FE(hw_who, NULL) - PHP_FE(hw_stat, NULL) - PHP_FE(hw_mapid, NULL) - PHP_FE(hw_dummy, NULL) - {NULL, NULL, NULL} -}; - -zend_module_entry hw_module_entry = { - STANDARD_MODULE_HEADER, - "hyperwave", hw_functions, PHP_MINIT(hw), PHP_MSHUTDOWN(hw), NULL, NULL, PHP_MINFO(hw), NO_VERSION_YET, STANDARD_MODULE_PROPERTIES -}; - -/* -#ifdef ZTS -int hw_globals_id; -#else -PHP_HW_API php_hw_globals hw_globals; -#endif -*/ - -ZEND_DECLARE_MODULE_GLOBALS(hw) - -#ifdef COMPILE_DL_HYPERWAVE -ZEND_GET_MODULE(hw) -#endif - -#define HW_FETCH_LINK(hw_zval) \ - convert_to_long_ex(hw_zval); \ - link = Z_LVAL_PP(hw_zval); \ - ptr = (hw_connection *) zend_list_find(link, &type); \ - if(!ptr || (type != le_socketp && type != le_psocketp)) { \ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find file identifier %d", link); \ - RETURN_FALSE; \ - } - -#define HW_FETCH_ID(hw_zval) \ - convert_to_long_ex(hw_zval); \ - id = Z_LVAL_PP(hw_zval); \ - ptr = (hw_document *) zend_list_find(id, &type); \ - if(!ptr || (type != le_document)) { \ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find file identifier %d", id); \ - RETURN_FALSE; \ - } - -void print_msg(hg_msg *msg, char *str, int txt); - -void _close_hw_link(zend_rsrc_list_entry *rsrc TSRMLS_DC) -{ - hw_connection *conn = (hw_connection *)rsrc->ptr; - - if(conn->hostname) - free(conn->hostname); - if(conn->username) - free(conn->username); - close(conn->socket); - free(conn); - HwSG(num_links)--; -} - -void _close_hw_plink(zend_rsrc_list_entry *rsrc TSRMLS_DC) -{ - hw_connection *conn = (hw_connection *)rsrc->ptr; - - if(conn->hostname) - free(conn->hostname); - if(conn->username) - free(conn->username); - close(conn->socket); - free(conn); - HwSG(num_links)--; - HwSG(num_persistent)--; -} - -void _free_hw_document(zend_rsrc_list_entry *rsrc TSRMLS_DC) -{ - hw_document *doc = (hw_document *)rsrc->ptr; - if(doc->data) - free(doc->data); - if(doc->attributes) - free(doc->attributes); - if(doc->bodytag) - free(doc->bodytag); - free(doc); -} - -static void php_hw_init_globals(zend_hw_globals *hw_globals) -{ - hw_globals->num_persistent = 0; -} - -static PHP_INI_MH(OnHyperwavePort) -{ - if (new_value==NULL) { - HwSG(default_port) = HG_SERVER_PORT; - } else { - HwSG(default_port) = atoi(new_value); - } - return SUCCESS; -} - -PHP_INI_BEGIN() - STD_PHP_INI_ENTRY("hyerwave.allow_persistent", "0", PHP_INI_SYSTEM, OnUpdateInt, allow_persistent, zend_hw_globals, hw_globals) - PHP_INI_ENTRY("hyperwave.default_port", "418", PHP_INI_ALL, OnHyperwavePort) -PHP_INI_END() - -PHP_MINIT_FUNCTION(hw) -{ - ZEND_INIT_MODULE_GLOBALS(hw, php_hw_init_globals, NULL); - - REGISTER_INI_ENTRIES(); - le_socketp = zend_register_list_destructors_ex(_close_hw_link, NULL, "hyperwave link", module_number); - le_psocketp = zend_register_list_destructors_ex(NULL, _close_hw_plink, "hyperwave link persistent", module_number); - le_document = zend_register_list_destructors_ex(_free_hw_document, NULL, "hyperwave document", module_number); - Z_TYPE(hw_module_entry) = type; - - REGISTER_LONG_CONSTANT("HW_ATTR_LANG", HW_ATTR_LANG, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("HW_ATTR_NR", HW_ATTR_NR, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("HW_ATTR_NONE", HW_ATTR_NONE, CONST_CS | CONST_PERSISTENT); - return SUCCESS; -} - -PHP_MSHUTDOWN_FUNCTION(hw) -{ - UNREGISTER_INI_ENTRIES(); - return SUCCESS; -} - -/* {{{ make_return_objrec - * creates an array in return value and frees all memory - * Also adds as an assoc. array at the end of the return array with - * statistics. - */ -int make_return_objrec(pval **return_value, char **objrecs, int count) -{ - zval *stat_arr; - int i; - int hidden, collhead, fullcollhead, total; - int collheadnr, fullcollheadnr; - - array_init(*return_value); - - hidden = collhead = fullcollhead = total = 0; - collheadnr = fullcollheadnr = -1; - for(i=0; i<count; i++) { - /* Fill the array with entries. No need to free objrecs[i], since - * it is not duplicated in add_next_index_string(). - */ - if(NULL != objrecs[i]) { - if(0 == fnAttributeCompare(objrecs[i], "PresentationHints", "Hidden")) - hidden++; - if(0 == fnAttributeCompare(objrecs[i], "PresentationHints", "CollectionHead")) { - collhead++; - collheadnr = total; - } - if(0 == fnAttributeCompare(objrecs[i], "PresentationHints", "FullCollectionHead")) { - fullcollhead++; - fullcollheadnr = total; - } - total++; - add_next_index_string(*return_value, objrecs[i], 0); - } - } - efree(objrecs); - - /* Array for statistics */ - MAKE_STD_ZVAL(stat_arr); - array_init(stat_arr); - - add_assoc_long(stat_arr, "Hidden", hidden); - add_assoc_long(stat_arr, "CollectionHead", collhead); - add_assoc_long(stat_arr, "FullCollectionHead", fullcollhead); - add_assoc_long(stat_arr, "Total", total); - add_assoc_long(stat_arr, "CollectionHeadNr", collheadnr); - add_assoc_long(stat_arr, "FullCollectionHeadNr", fullcollheadnr); - - /* Add the stat array */ - zend_hash_next_index_insert(Z_ARRVAL_PP(return_value), &stat_arr, sizeof(zval), NULL); - - return 0; -} -/* }}} */ - -/* {{{ make2_return_array_from_objrec -** creates an array return value from object record -*/ -int make2_return_array_from_objrec(pval **return_value, char *objrec, zval *sarr) { - char *attrname, *str, *temp, language[3]; - zval *spec_arr; - char *strtok_buf = NULL; - - /* Create an array with an entry containing specs for each attribute - and fill in the specs for Title, Description, Keyword, Group. - If an array is passed as the last argument use it instead. - */ - if(NULL != sarr) { - spec_arr = sarr; - } else { - MAKE_STD_ZVAL(spec_arr); - array_init(spec_arr); - add_assoc_long(spec_arr, "Title", HW_ATTR_LANG); - add_assoc_long(spec_arr, "Description", HW_ATTR_LANG); - add_assoc_long(spec_arr, "Keyword", HW_ATTR_LANG); - add_assoc_long(spec_arr, "Group", HW_ATTR_NONE); - add_assoc_long(spec_arr, "HtmlAttr", HW_ATTR_NONE); - add_assoc_long(spec_arr, "Parent", HW_ATTR_NONE); - add_assoc_long(spec_arr, "SQLStmt", HW_ATTR_NR); - } - - array_init(*return_value); - - /* Loop through the attributes of object record and check - if the attribute has a specification. If it has the value - is added to array in spec record. If not it is added straight - to the return_value array. - */ - temp = estrdup(objrec); - attrname = php_strtok_r(temp, "\n", &strtok_buf); - while(attrname != NULL) { - zval *data, **dataptr; - long spec; - str = attrname; - - /* Check if a specification is available. - If it isn't available then insert the attribute as - a string into the return array - */ - while((*str != '=') && (*str != '\0')) - str++; - *str = '\0'; - str++; - if(zend_hash_find(Z_ARRVAL_P(spec_arr), attrname, strlen(attrname)+1, (void **) &dataptr) == FAILURE) { - add_assoc_string(*return_value, attrname, str, 1); - } else { - zval *newarr; - data = *dataptr; - spec = Z_LVAL_P(data); - - if(zend_hash_find(Z_ARRVAL_PP(return_value), attrname, strlen(attrname)+1, (void **) &dataptr) == FAILURE) { - MAKE_STD_ZVAL(newarr); - array_init(newarr); - zend_hash_add(Z_ARRVAL_PP(return_value), attrname, strlen(attrname)+1, &newarr, sizeof(zval *), NULL); - } else { - newarr = *dataptr; - } - - switch(spec) { - case HW_ATTR_LANG: - if(str[2] == ':') { - str[2] = '\0'; - strcpy(language, str); - str += 3; - } else - strcpy(language, "xx"); - - add_assoc_string(newarr, language, str, 1); - break; - case HW_ATTR_NR: - if(str[1] == ':') { - str[1] = '\0'; - strcpy(language, str); - str += 2; - } else - strcpy(language, "x"); - - add_assoc_string(newarr, language, str, 1); - break; - case HW_ATTR_NONE: - add_next_index_string(newarr, str, 1); - break; - } - } - - attrname = php_strtok_r(NULL, "\n", &strtok_buf); - } - if(NULL == sarr){ -/* - spec_arr->refcount--; - zend_hash_destroy(Z_ARRVAL_P(spec_arr)); - efree(Z_ARRVAL_P(spec_arr)); -*/ - zval_dtor(spec_arr); - efree(spec_arr); - } - efree(temp); - - return(0); -} -/* }}} */ - -/* {{{ make_return_array_from_objrec - */ -int make_return_array_from_objrec(pval **return_value, char *objrec) { - char *attrname, *str, *temp, language[3], *title; - int iTitle, iDesc, iKeyword, iGroup; - zval *title_arr; - zval *desc_arr; - zval *keyword_arr; - zval *group_arr; - int hasTitle = 0; - int hasDescription = 0; - int hasKeyword = 0; - int hasGroup = 0; - char *strtok_buf; - - MAKE_STD_ZVAL(title_arr); - MAKE_STD_ZVAL(desc_arr); - MAKE_STD_ZVAL(keyword_arr); - MAKE_STD_ZVAL(group_arr); - - array_init(*return_value); - - /* Fill Array of titles, descriptions and keywords */ - temp = estrdup(objrec); - attrname = php_strtok_r(temp, "\n", &strtok_buf); - while(attrname != NULL) { - str = attrname; - iTitle = 0; - iDesc = 0; - iKeyword = 0; - iGroup = 0; - if(0 == strncmp(attrname, "Title=", 6)) { - if (hasTitle == 0) { - return -1; - } - array_init(title_arr); - hasTitle = 1; - str += 6; - iTitle = 1; - } else if(0 == strncmp(attrname, "Description=", 12)) { - if (hasDescription == 0) { - return -1; - } - array_init(desc_arr); - hasDescription = 1; - str += 12; - iDesc = 1; - } else if(0 == strncmp(attrname, "Keyword=", 8)) { - if (hasKeyword == 0) { - return -1; - } - array_init(keyword_arr); - hasKeyword = 1; - str += 8; - iKeyword = 1; - } else if(0 == strncmp(attrname, "Group=", 6)) { - if (hasGroup == 0) { - return -1; - } - array_init(group_arr); - hasGroup = 1; - str += 6; - iGroup = 1; - } - if(iTitle || iDesc || iKeyword) { /* Poor error check if end of string */ - if(str[2] == ':') { - str[2] = '\0'; - strcpy(language, str); - str += 3; - } else - strcpy(language, "xx"); - - title = str; - if(iTitle) - add_assoc_string(title_arr, language, title, 1); - else if(iDesc) - add_assoc_string(desc_arr, language, title, 1); - else if(iKeyword) - add_assoc_string(keyword_arr, language, title, 1); - } else if(iGroup) { - if(iGroup) - add_next_index_string(group_arr, str, 1); - } - attrname = php_strtok_r(NULL, "\n", &strtok_buf); - } - efree(temp); - - /* Add the title array, if we have one */ - if(hasTitle) { - zend_hash_update(Z_ARRVAL_PP(return_value), "Title", 6, &title_arr, sizeof(zval *), NULL); - - } else { - efree(title_arr); - } - - - if(hasDescription) { - /* Add the description array, if we have one */ - zend_hash_update(Z_ARRVAL_PP(return_value), "Description", 12, &desc_arr, sizeof(zval *), NULL); - - } else { - efree(desc_arr); - } - - if(hasKeyword) { - /* Add the keyword array, if we have one */ - zend_hash_update(Z_ARRVAL_PP(return_value), "Keyword", 8, &keyword_arr, sizeof(zval *), NULL); - - } else { - efree(keyword_arr); - } - - if(hasGroup) { - /* Add the Group array, if we have one */ - zend_hash_update(Z_ARRVAL_PP(return_value), "Group", 6, &group_arr, sizeof(zval *), NULL); - - } else { - efree(group_arr); - } - - /* All other attributes. Make a another copy first */ - temp = estrdup(objrec); - attrname = php_strtok_r(temp, "\n", &strtok_buf); - while(attrname != NULL) { - str = attrname; - /* We don't want to insert titles, descr., keywords a second time */ - if((0 != strncmp(attrname, "Title=", 6)) && - (0 != strncmp(attrname, "Description=", 12)) && - (0 != strncmp(attrname, "Group=", 6)) && - (0 != strncmp(attrname, "Keyword=", 8))) { - while((*str != '=') && (*str != '\0')) - str++; - *str = '\0'; - str++; - add_assoc_string(*return_value, attrname, str, 1); - } - attrname = php_strtok_r(NULL, "\n", &strtok_buf); - } - efree(temp); - - return(0); -} -/* }}} */ - -#define BUFFERLEN 1024 -/* {{{ make_objrec_from_array - */ -static char * make_objrec_from_array(HashTable *lht, char delim) { - int i, count, keytype; - ulong idx; - uint length; - char *key, str[BUFFERLEN], *objrec = NULL; - zval *keydata, **keydataptr; - - if(NULL == lht) - return NULL; - - if(0 == (count = zend_hash_num_elements(lht))) - return NULL; - - if(delim == 0) - delim = '='; - - zend_hash_internal_pointer_reset(lht); - objrec = malloc(1); - *objrec = '\0'; - for(i=0; i<count; i++) { - keytype = zend_hash_get_current_key_ex(lht, &key, &length, &idx, 0, NULL); -/* if(HASH_KEY_IS_STRING == keytype) { */ - zend_hash_get_current_data(lht, (void **) &keydataptr); - keydata = *keydataptr; - switch(Z_TYPE_P(keydata)) { - case IS_STRING: - if(HASH_KEY_IS_STRING == keytype) - snprintf(str, BUFFERLEN, "%s%c%s\n", key, delim, Z_STRVAL_P(keydata)); - else if(HASH_KEY_IS_LONG == keytype) - snprintf(str, BUFFERLEN, "%ld%c%s\n", idx, delim, Z_STRVAL_P(keydata)); - else - snprintf(str, BUFFERLEN, "%s\n", Z_STRVAL_P(keydata)); - break; - case IS_LONG: - if(HASH_KEY_IS_STRING == keytype) - snprintf(str, BUFFERLEN, "%s%c0x%lX\n", key, delim, Z_LVAL_P(keydata)); - else if(HASH_KEY_IS_LONG == keytype) - snprintf(str, BUFFERLEN, "%ld%c%s\n", idx, delim, Z_STRVAL_P(keydata)); - else - snprintf(str, BUFFERLEN, "0x%lX\n", Z_LVAL_P(keydata)); - break; - case IS_ARRAY: { - int i, len, keylen, count; - char *strarr, *ptr, *ptr1; - count = zend_hash_num_elements(Z_ARRVAL_P(keydata)); - if(count > 0) { - strarr = make_objrec_from_array(Z_ARRVAL_P(keydata), ':'); - len = strlen(strarr) - 1; - keylen = strlen(key); - if(NULL == (ptr = malloc(len + 1 + count*(keylen+1)))) { - free(objrec); - return(NULL); - } - ptr1 = ptr; - *ptr1 = '\0'; - strcpy(ptr1, key); - ptr1 += keylen; - *ptr1++ = '='; - for(i=0; i<len; i++) { - *ptr1++ = strarr[i]; - if(strarr[i] == '\n') { - strcpy(ptr1, key); - ptr1 += keylen; - *ptr1++ = '='; - }/* else if(strarr[i] == '=') - ptr1[-1] = ':'; */ - } - *ptr1++ = '\n'; - *ptr1 = '\0'; - strlcpy(str, ptr, sizeof(str)); - } - break; - } - } - objrec = realloc(objrec, strlen(objrec)+strlen(str)+1); - strcat(objrec, str); -/* } */ - zend_hash_move_forward(lht); - } - return objrec; -} -/* }}} */ -#undef BUFFERLEN - -/* {{{ make_ints_from_array - */ -static int * make_ints_from_array(HashTable *lht) { - int i, count; - int *objids = NULL; - zval **keydata; - - if(NULL == lht) - return NULL; - - if(0 == (count = zend_hash_num_elements(lht))) - return NULL; - - zend_hash_internal_pointer_reset(lht); - if(NULL == (objids = emalloc(count*sizeof(int)))) - return NULL; - for(i=0; i<count; i++) { - zend_hash_get_current_data(lht, (void **) &keydata); - switch(Z_TYPE_PP(keydata)) { - case IS_LONG: - objids[i] = Z_LVAL_PP(keydata); - break; - default: - objids[i] = 0; - } - zend_hash_move_forward(lht); - } - return objids; -} -/* }}} */ - -/* {{{ make_strs_from_array - */ -static char **make_strs_from_array(HashTable *arrht) { - char **carr = NULL; - char **ptr; - zval *data, **dataptr; - - zend_hash_internal_pointer_reset(arrht); - if(NULL == (carr = emalloc(zend_hash_num_elements(arrht) * sizeof(char *)))) - return(NULL); - ptr = carr; - - /* Iterate through hash */ - while(zend_hash_get_current_data(arrht, (void **) &dataptr) == SUCCESS) { - data = *dataptr; - switch(Z_TYPE_P(data)) { - case IS_STRING: - *ptr = estrdup(Z_STRVAL_P(data)); -/*fprintf(stderr, "carr[] = %s\n", *ptr); */ - break; - default: - *ptr = NULL; - } - ptr++; - - zend_hash_move_forward(arrht); - } - return(carr); -} -/* }}} */ - -#define BUFFERLEN 30 -/* {{{ php_hw_do_connect - */ -static void php_hw_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) -{ - zval **argv[4]; - int argc; - int sockfd; - int port = 0; - char *host = NULL; - char *userdata = NULL; - char *server_string = NULL; - char *username = NULL; - char *password = NULL; - char *hashed_details; - char *str = NULL; - char buffer[BUFFERLEN]; - int hashed_details_length; - hw_connection *ptr; - int do_swap; - int version = 0; - - argc = ZEND_NUM_ARGS(); - switch(argc) { - case 2: - case 4: - if (zend_get_parameters_array_ex(argc, argv) == FAILURE) { - WRONG_PARAM_COUNT; - } - break; - default: - WRONG_PARAM_COUNT; - } - - /* Host: */ - convert_to_string_ex(argv[0]); - host = (char *) estrndup(Z_STRVAL_PP(argv[0]), Z_STRLEN_PP(argv[0])); - - /* Port: */ - convert_to_long_ex(argv[1]); - port = Z_LVAL_PP(argv[1]); - - /* Username and Password */ - if(argc > 2) { - /* Username */ - convert_to_string_ex(argv[2]); - username = (char *) estrndup(Z_STRVAL_PP(argv[2]), Z_STRLEN_PP(argv[2])); - /* Password */ - convert_to_string_ex(argv[3]); - password = (char *) estrndup(Z_STRVAL_PP(argv[3]), Z_STRLEN_PP(argv[3])); - } - - /* Create identifier string for connection */ - snprintf(buffer, BUFFERLEN, "%d", port); - hashed_details_length = strlen(host)+strlen(buffer)+8; - if(NULL == (hashed_details = (char *) emalloc(hashed_details_length+1))) { - if(host) efree(host); - if(password) efree(password); - if(username) efree(username); - php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not get memory for connection details"); - RETURN_FALSE; - } - sprintf(hashed_details, "hw_%s_%d", host, port); - - if (persistent) { - list_entry *le; - - /* try to find if we already have this link in our persistent list */ - if (zend_hash_find(&EG(persistent_list), hashed_details, hashed_details_length+1, (void **) &le)==FAILURE) { - list_entry new_le; - - if (HwSG(max_links)!=-1 && HwSG(num_links)>=HwSG(max_links)) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "Too many open links (%d)", HwSG(num_links)); - if(host) efree(host); - if(username) efree(username); - if(password) efree(password); - efree(hashed_details); - RETURN_FALSE; - } - if (HwSG(max_persistent!=-1) && HwSG(num_persistent)>=HwSG(max_persistent)) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "Too many open persistent links (%d)", HwSG(num_persistent)); - if(host) efree(host); - if(username) efree(username); - if(password) efree(password); - efree(hashed_details); - RETURN_FALSE; - } - - if ( (sockfd = open_hg_connection(host, port)) < 0 ) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not open connection to %s, Port: %d (retval=%d, errno=%d)", host, port, sockfd, errno); - if(host) efree(host); - if(username) efree(username); - if(password) efree(password); - efree(hashed_details); - RETURN_FALSE; - } - - if(NULL == (ptr = malloc(sizeof(hw_connection)))) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not get memory for connection structure"); - if(host) efree(host); - if(username) efree(username); - if(password) efree(password); - efree(hashed_details); - RETURN_FALSE; - } - - if(0 != (ptr->lasterror = initialize_hg_connection(sockfd, &do_swap, &version, &userdata, &server_string, username, password))) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not initalize hyperwave connection"); - if(host) efree(host); - if(username) efree(username); - if(password) efree(password); - if(userdata) efree(userdata); - if(server_string) free(server_string); - efree(hashed_details); - RETURN_FALSE; - } - - if(username) efree(username); - if(password) efree(password); - - ptr->version = version; - ptr->server_string = server_string; - ptr->socket = sockfd; - ptr->swap_on = do_swap; - ptr->linkroot = 0; - ptr->hostname = strdup(host); - ptr->username = strdup("anonymous"); - - new_le.ptr = (void *) ptr; - Z_TYPE(new_le) = le_psocketp; - - if (zend_hash_update(&EG(persistent_list), hashed_details, hashed_details_length+1, (void *) &new_le, sizeof(list_entry), NULL)==FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not hash table with connection details"); - if(host) efree(host); - if(username) efree(username); - if(password) efree(password); - if(server_string) free(server_string); - efree(hashed_details); - RETURN_FALSE; - } - - HwSG(num_links)++; - HwSG(num_persistent)++; - } else { - /*php_printf("Found already open connection\n"); */ - if (Z_TYPE_P(le) != le_psocketp) { - RETURN_FALSE; - } - ptr = le->ptr; - } - - Z_LVAL_P(return_value) = zend_list_insert(ptr, le_psocketp); - Z_TYPE_P(return_value) = IS_RESOURCE; - - } else { - list_entry *index_ptr, new_index_ptr; - - /* first we check the hash for the hashed_details key. if it exists, - * it should point us to the right offset where the actual hyperwave link sits. - * if it doesn't, open a new hyperwave link, add it to the resource list, - * and add a pointer to it with hashed_details as the key. - */ - if (zend_hash_find(&EG(regular_list), hashed_details, hashed_details_length+1, (void **) &index_ptr)==SUCCESS) { - int type, link; - void *ptr; - - if (Z_TYPE_P(index_ptr) != le_index_ptr) { - RETURN_FALSE; - } - link = (int) index_ptr->ptr; - ptr = (hw_connection *) zend_list_find(link, &type); /* check if the link is still there */ - if(!ptr || (type!=le_socketp && type!=le_psocketp)) { - Z_LVAL_P(return_value) = HwSG(default_link) = link; - Z_TYPE_P(return_value) = IS_LONG; - efree(hashed_details); - if(username) efree(username); - if(password) efree(password); - if(host) efree(host); - return; - } else { - zend_hash_del(&EG(regular_list), hashed_details, hashed_details_length+1); - } - } - - if ( (sockfd = open_hg_connection(host, port)) < 0 ) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not open connection to %s, Port: %d (retval=%d", host, port, sockfd); - if(host) efree(host); - if(username) efree(username); - if(password) efree(password); - efree(hashed_details); - RETURN_FALSE; - } - - if(NULL == (ptr = malloc(sizeof(hw_connection)))) { - if(host) efree(host); - if(username) efree(username); - if(password) efree(password); - efree(hashed_details); - RETURN_FALSE; - } - - if(0 != (ptr->lasterror = initialize_hg_connection(sockfd, &do_swap, &version, &userdata, &server_string, username, password))) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not initalize hyperwave connection"); - if(host) efree(host); - if(username) efree(username); - if(password) efree(password); - if(userdata) efree(userdata); - if(server_string) free(server_string); - efree(hashed_details); - RETURN_FALSE; - } - - if(username) efree(username); - if(password) efree(password); - - ptr->version = version; - ptr->server_string = server_string; - ptr->socket = sockfd; - ptr->swap_on = do_swap; - ptr->linkroot = 0; - ptr->hostname = strdup(host); - ptr->username = strdup("anonymous"); - - Z_LVAL_P(return_value) = zend_list_insert(ptr, le_socketp); - Z_TYPE_P(return_value) = IS_RESOURCE; - - new_index_ptr.ptr = (void *) Z_LVAL_P(return_value); - Z_TYPE(new_index_ptr) = le_index_ptr; - if (zend_hash_update(&EG(regular_list), hashed_details, hashed_details_length+1, (void *) &new_index_ptr, sizeof(list_entry), NULL)==FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not update connection details in hash table"); - if(host) efree(host); - efree(hashed_details); - RETURN_FALSE; - } - - } - - efree(hashed_details); - if(host) efree(host); - HwSG(default_link)=Z_LVAL_P(return_value); - - /* At this point we have a working connection. If userdata was given - we are also indentified. - If there is no userdata because hw_connect was called without username - and password, we don't evaluate userdata. - */ - if(NULL == userdata) - return; - - if(ptr->username) free(ptr->username); - str = userdata; - while((*str != 0) && (*str != ' ')) - str++; - if(*str != '\0') - ptr->username = strdup(++str); - else - ptr->username = NULL; - efree(userdata); -} -/* }}} */ -#undef BUFFERLEN - -/* Start of user level functions */ -/* ***************************** */ -/* {{{ proto int hw_connect(string host, int port [string username [, string password]]) - Connect to the Hyperwave server */ -PHP_FUNCTION(hw_connect) -{ - php_hw_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); -} -/* }}} */ - -/* {{{ proto int hw_pconnect(string host, int port [, string username [, string password]]) - Connect to the Hyperwave server persistent */ -PHP_FUNCTION(hw_pconnect) -{ - php_hw_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); -} -/* }}} */ - -/* {{{ proto void hw_close(int link) - Close connection to Hyperwave server */ -PHP_FUNCTION(hw_close) -{ - zval **arg1; - int link, type; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - zend_list_delete(link); - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto void hw_info(int link) - Outputs info string */ -PHP_FUNCTION(hw_info) -{ - pval **arg1; - int link, type; - hw_connection *ptr; - char *str; - - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - if(NULL != (str = get_hw_info(ptr))) { - /* - php_printf("%s\n", str); - efree(str); - */ - Z_STRLEN_P(return_value) = strlen(str); - Z_STRVAL_P(return_value) = str; - Z_TYPE_P(return_value) = IS_STRING; - return; - } - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto int hw_error(int link) - Returns last error number */ -PHP_FUNCTION(hw_error) -{ - pval **arg1; - int link, type; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - RETURN_LONG(ptr->lasterror); -} -/* }}} */ - -/* {{{ proto string hw_errormsg(int link) - Returns last error message */ -PHP_FUNCTION(hw_errormsg) -{ - pval **arg1; - int link, type; - hw_connection *ptr; - char errstr[100]; - - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - - switch (ptr->lasterror) { - case 0: - sprintf(errstr, "No error"); - break; - case NOACCESS: - sprintf(errstr, "Access denied"); - break; - case NODOCS: - sprintf(errstr, "No documents"); - break; - case NONAME: - sprintf(errstr, "No collection name"); - break; - case NODOC: - sprintf(errstr, "Object is not a document"); - break; - case NOOBJ: - sprintf(errstr, "No object received"); - break; - case NOCOLLS: - sprintf(errstr, "No collections received"); - break; - case DBSTUBNG: - sprintf(errstr, "Connection to low-level database failed"); - break; - case NOTFOUND: - sprintf(errstr, "Object not found"); - break; - case EXIST: - sprintf(errstr, "Collection already exists"); - break; - case FATHERDEL: - sprintf(errstr, "parent collection disappeared"); - break; - case FATHNOCOLL: - sprintf(errstr, "parent collection not a collection"); - break; - case NOTEMPTY: - sprintf(errstr, "Collection not empty"); - break; - case DESTNOCOLL: - sprintf(errstr, "Destination not a collection"); - break; - case SRCEQDEST: - sprintf(errstr, "Source equals destination"); - break; - case REQPEND: - sprintf(errstr, "Request pending"); - break; - case TIMEOUT: - sprintf(errstr, "Timeout"); - break; - case NAMENOTUNIQUE: - sprintf(errstr, "Name not unique"); - break; - case WRITESTOPPED: - sprintf(errstr, "Database now read-only; try again later"); - break; - case LOCKED: - sprintf(errstr, "Object locked; try again later"); - break; - case CHANGEBASEFLD: - sprintf(errstr, "Change of base-attribute"); - break; - case NOTREMOVED: - sprintf(errstr, "Attribute not removed"); - break; - case FLDEXISTS: - sprintf(errstr, "Attribute exists"); - break; - case CMDSYNTAX: - sprintf(errstr, "Syntax error in command"); - break; - case NOLANGUAGE: - sprintf(errstr, "No or unknown language specified"); - break; - case WRGTYPE: - sprintf(errstr, "Wrong type in object"); - break; - case WRGVERSION: - sprintf(errstr, "Client version too old"); - break; - case CONNECTION: - sprintf(errstr, "No connection to other server"); - break; - case SYNC: - sprintf(errstr, "Synchronization error"); - break; - case NOPATH: - sprintf(errstr, "No path entry"); - break; - case WRGPATH: - sprintf(errstr, "Wrong path entry"); - break; - case PASSWD: - sprintf(errstr, "Wrong password (server-to-server server authentication)"); - break; - case LC_NO_MORE_USERS: - sprintf(errstr, "No more users for license"); - break; - case LC_NO_MORE_DOCS: - sprintf(errstr, "No more documents for this session and license"); - break; - case RSERV_NRESP: - sprintf(errstr, "Remote server not responding"); - break; - case Q_OVERFLOW: - sprintf(errstr, "Query overflow"); - break; - case USR_BREAK: - sprintf(errstr, "Break by user"); - break; - case N_IMPL: - sprintf(errstr, "Not implemented"); - break; - case WRG_VALUE: - sprintf(errstr, "Wrong value"); - break; - case INSUFF_FUNDS: - sprintf(errstr, "Insufficient funds"); - break; - case REORG: - sprintf(errstr, "Reorganization in progress"); - break; - case USER_LIMIT: - sprintf(errstr, "Limit of simultaneous users reached"); - break; - case FTCONNECT: - sprintf(errstr, "No connection to fulltext server"); - break; - case FTTIMEOUT: - sprintf(errstr, "Connection timed out"); - break; - case FTINDEX: - sprintf(errstr, "Something wrong with fulltext index"); - break; - case FTSYNTAX: - sprintf(errstr, "Query syntax error"); - break; - case REQUESTPENDING: - sprintf(errstr, "Request pending"); - break; - case NOCONNECTION: - sprintf(errstr, "No connection to document server"); - break; - case WRONGVERSION: - sprintf(errstr, "Wrong protocol version"); - break; - case NOTINITIALIZED: - sprintf(errstr, "Not initialized"); - break; - case BADREQUEST: - sprintf(errstr, "Bad request"); - break; - case BADLRN: - sprintf(errstr, "Bad document number"); - break; - case OPENSTORE_WRITE: - sprintf(errstr, "Cannot write to local store"); - break; - case OPENSTORE_READ: - sprintf(errstr, "Cannot read from local store"); - break; - case READSTORE: - sprintf(errstr, "Store read error"); - break; - case WRITESTORE: - sprintf(errstr, "Write error"); - break; - case CLOSESTORE: - sprintf(errstr, "Close error"); - break; - case BADPATH: - sprintf(errstr, "Bad path"); - break; - case NOPATHDC: - sprintf(errstr, "No path"); - break; - case OPENFILE: - sprintf(errstr, "Cannot open file"); - break; - case READFILE: - sprintf(errstr, "Cannot read from file // same"); - break; - case WRITEFILE: - sprintf(errstr, "Cannot write to file"); - break; - case CONNECTCLIENT: - sprintf(errstr, "Could not connect to client"); - break; - case ACCEPT: - sprintf(errstr, "Could not accept connection"); - break; - case READSOCKET: - sprintf(errstr, "Could not read from socket"); - break; - case WRITESOCKET: - sprintf(errstr, "Could not write to socket"); - break; - case TOOMUCHDATA: - sprintf(errstr, "Received too much data"); - break; - case TOOFEWDATA: - sprintf(errstr, "Received too few data // ..."); - break; - case NOTIMPLEMENTED: - sprintf(errstr, "Not implemented"); - break; - case USERBREAK: - sprintf(errstr, "User break"); - break; - case INTERNAL: - sprintf(errstr, "Internal error"); - break; - case INVALIDOBJECT: - sprintf(errstr, "Invalid object"); - break; - case JOBTIMEOUT: - sprintf(errstr, "Job timed out"); - break; - case OPENPORT: - sprintf(errstr, "Cannot open port // ... for several resons"); - break; - case NODATA: - sprintf(errstr, "Received no data"); - break; - case NOPORT: - sprintf(errstr, "No port to handle this request"); - break; - case NOTCACHED: - sprintf(errstr, "Document not cached"); - break; - case BADCACHETYPE: - sprintf(errstr, "Bad cache type"); - break; - case OPENCACHE_WRITE: - sprintf(errstr, "Cannot write to cache"); - break; - case OPENCACHE_READ: - sprintf(errstr, "Cannot read from cache // same"); - break; - case NOSOURCE: - sprintf(errstr, "Do not know what to read"); - break; - case CLOSECACHE: - sprintf(errstr, "Could not insert into cache"); - break; - case CONNECTREMOTE: - sprintf(errstr, "Could not connect to remote server"); - break; - case LOCKREFUSED: - sprintf(errstr, "Lock refused // could not lock the stores"); - break; - default: - sprintf(errstr, "Unknown error: %d", ptr->lasterror); - } - RETURN_STRING(errstr, 1); -} -/* }}} */ - -/* {{{ proto int hw_root(void) - Returns object id of root collection */ -PHP_FUNCTION(hw_root) -{ - if (ZEND_NUM_ARGS() != 0) { - WRONG_PARAM_COUNT; - } - - Z_LVAL_P(return_value) = 0; - Z_TYPE_P(return_value) = IS_LONG; -} -/* }}} */ - -/* {{{ php_hw_command - */ -char *php_hw_command(INTERNAL_FUNCTION_PARAMETERS, int comm) { - pval **arg1; - int link, type; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { - return NULL; - } - convert_to_long_ex(arg1); - link = Z_LVAL_PP(arg1); - ptr = (hw_connection *) zend_list_find(link, &type); - if(!ptr || (type != le_socketp && type != le_psocketp)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find file identifier %d", link); - return NULL; - } - - set_swap(ptr->swap_on); - { - char *object = NULL; - if (0 != (ptr->lasterror = send_command(ptr->socket, comm, &object))) { - return NULL; - } - return object; - } - return NULL; -} -/* }}} */ - -/* {{{ proto string hw_stat(int link) - Returns status string */ -PHP_FUNCTION(hw_stat) -{ - char *object; - - object = php_hw_command(INTERNAL_FUNCTION_PARAM_PASSTHRU, STAT_COMMAND); - if(object == NULL) - RETURN_FALSE; - - Z_STRVAL_P(return_value) = object; - Z_STRLEN_P(return_value) = strlen(object); - Z_TYPE_P(return_value) = IS_STRING; -} -/* }}} */ - -/* {{{ proto array hw_who(int link) - Returns names and info of users loged in */ -PHP_FUNCTION(hw_who) -{ - zval *user_arr; - char *object, *ptr, *temp, *attrname; - int i; - char *strtok_buf; - - object = php_hw_command(INTERNAL_FUNCTION_PARAM_PASSTHRU, WHO_COMMAND); - if(object == NULL) - RETURN_FALSE; - - ptr = object; - -php_printf("%s\n", ptr); - /* Skip first two lines, they just contain: - Users in Database - - */ - while((*ptr != '\0') && (*ptr != '\n')) - ptr++; - while((*ptr != '\0') && (*ptr != '\n')) - ptr++; - if(*ptr == '\0') { - efree(object); - RETURN_FALSE; - } - - array_init(return_value); - - temp = estrdup(ptr); - attrname = php_strtok_r(temp, "\n", &strtok_buf); - i = 0; - while(attrname != NULL) { - char *name; - - ALLOC_ZVAL(user_arr); - array_init(user_arr); - - ptr = attrname; - if(*ptr++ == '*') - add_assoc_long(user_arr, "self", 1); - else - add_assoc_long(user_arr, "self", 0); - - ptr++; - name = ptr; - while((*ptr != '\0') && (*ptr != ' ')) - ptr++; - *ptr = '\0'; - add_assoc_string(user_arr, "id", name, 1); - - ptr++; - name = ptr; - while((*ptr != '\0') && (*ptr != ' ')) - ptr++; - *ptr = '\0'; - add_assoc_string(user_arr, "name", name, 1); - - ptr++; - while((*ptr != '\0') && (*ptr == ' ')) - ptr++; - - name = ptr; - while((*ptr != '\0') && (*ptr != ' ')) - ptr++; - *ptr = '\0'; - add_assoc_string(user_arr, "system", name, 1); - - ptr++; - while((*ptr != '\0') && (*ptr == ' ')) - ptr++; - - name = ptr; - while((*ptr != '\0') && (*ptr != ' ')) - ptr++; - *ptr = '\0'; - add_assoc_string(user_arr, "onSinceDate", name, 1); - - ptr++; - while((*ptr != '\0') && (*ptr == ' ')) - ptr++; - - name = ptr; - while((*ptr != '\0') && (*ptr != ' ')) - ptr++; - *ptr = '\0'; - add_assoc_string(user_arr, "onSinceTime", name, 1); - - ptr++; - while((*ptr != '\0') && (*ptr == ' ')) - ptr++; - - name = ptr; - while((*ptr != '\0') && (*ptr != ' ')) - ptr++; - *ptr = '\0'; - add_assoc_string(user_arr, "TotalTime", name, 1); - - /* Add the user array */ - zend_hash_index_update(Z_ARRVAL_P(return_value), i++, &user_arr, sizeof(pval), NULL); - - attrname = php_strtok_r(NULL, "\n", &strtok_buf); - } - efree(temp); - efree(object); - -} -/* }}} */ - -/* {{{ proto string hw_dummy(int link, int id, int msgid) - Hyperwave dummy function */ -PHP_FUNCTION(hw_dummy) -{ - pval **arg1, **arg2, **arg3; - int link, id, type, msgid; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long_ex(arg2); - convert_to_long_ex(arg3); - id=Z_LVAL_PP(arg2); - msgid=Z_LVAL_PP(arg3); - HW_FETCH_LINK(arg1); - - set_swap(ptr->swap_on); - { - char *object = NULL; - if (0 != (ptr->lasterror = send_dummy(ptr->socket, id, msgid, &object))) - RETURN_FALSE; - -php_printf("%s", object); - Z_STRVAL_P(return_value) = object; - Z_STRLEN_P(return_value) = strlen(object); - Z_TYPE_P(return_value) = IS_STRING; - } -} -/* }}} */ - -/* {{{ proto string hw_getobject(int link, int objid [, string query]) - Returns object record */ -PHP_FUNCTION(hw_getobject) -{ - pval **argv[3]; - int argc, link, id, type, multi; - char *query; - hw_connection *ptr; - - argc = ZEND_NUM_ARGS(); - if(argc < 2 || argc > 3) - WRONG_PARAM_COUNT; - if (zend_get_parameters_array_ex(argc, argv) == FAILURE) - WRONG_PARAM_COUNT; - - HW_FETCH_LINK(argv[0]); - if(Z_TYPE_PP(argv[1]) == IS_ARRAY) { - multi = 1; - convert_to_array_ex(argv[1]); - } else { - multi = 0; - convert_to_long_ex(argv[1]); - } - - if(argc == 3) { - convert_to_string_ex(argv[2]); - query = Z_STRVAL_PP(argv[2]); - } else - query = NULL; - - set_swap(ptr->swap_on); - if(multi) { - char **objects = NULL; - int count, *ids, i; - HashTable *lht; - zval **keydata; - - lht = Z_ARRVAL_PP(argv[1]); - if(0 == (count = zend_hash_num_elements(lht))) { - RETURN_FALSE; - } - ids = emalloc(count * sizeof(hw_objectID)); - - zend_hash_internal_pointer_reset(lht); - for(i=0; i<count; i++) { - zend_hash_get_current_data(lht, (void **) &keydata); - switch(Z_TYPE_PP(keydata)) { - case IS_LONG: - ids[i] = Z_LVAL_PP(keydata); - break; - default: - ids[i] = Z_LVAL_PP(keydata); - } - zend_hash_move_forward(lht); - } - - if (0 != (ptr->lasterror = send_objectbyidquery(ptr->socket, ids, &count, query, &objects))) { - efree(ids); - RETURN_FALSE; - } - efree(ids); - array_init(return_value); - - for(i=0; i<count; i++) { - add_index_string(return_value, i, objects[i], 0); - } - efree(objects); - - } else { - char *object = NULL; - id=Z_LVAL_PP(argv[1]); - if (0 != (ptr->lasterror = send_getobject(ptr->socket, id, &object))) - RETURN_FALSE; - - RETURN_STRING(object, 0); - } -} -/* }}} */ - -/* {{{ proto int hw_insertobject(int link, string objrec, string parms) - Inserts an object */ -PHP_FUNCTION(hw_insertobject) -{ - zval **arg1, **arg2, **arg3; - int link, type; - char *objrec, *parms; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_string_ex(arg2); - convert_to_string_ex(arg3); - objrec=Z_STRVAL_PP(arg2); - parms=Z_STRVAL_PP(arg3); - - set_swap(ptr->swap_on); - { - int objid; - if (0 != (ptr->lasterror = send_insertobject(ptr->socket, objrec, parms, &objid))) - RETURN_FALSE; - - RETURN_LONG(objid); - } -} -/* }}} */ - -/* {{{ proto string hw_getandlock(int link, int objid) - Returns object record and locks object */ -PHP_FUNCTION(hw_getandlock) -{ - zval **arg1, **arg2; - int link, id, type; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - id=Z_LVAL_PP(arg2); - - set_swap(ptr->swap_on); - { - char *object = NULL; - if (0 != (ptr->lasterror = send_getandlock(ptr->socket, id, &object))) - RETURN_FALSE; - - RETURN_STRING(object, 0); - } -} -/* }}} */ - -/* {{{ proto void hw_unlock(int link, int objid) - Unlocks object */ -PHP_FUNCTION(hw_unlock) -{ - zval **arg1, **arg2; - int link, id, type; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - id=Z_LVAL_PP(arg2); - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_unlock(ptr->socket, id))) - RETURN_FALSE; - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto void hw_deleteobject(int link, int objid) - Deletes object */ -PHP_FUNCTION(hw_deleteobject) -{ - zval **arg1, **arg2; - int link, id, type; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - id=Z_LVAL_PP(arg2); - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_deleteobject(ptr->socket, id))) - RETURN_FALSE; - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto void hw_changeobject(int link, int objid, array attributes) - Changes attributes of an object (obsolete) */ -#define BUFFERLEN 200 -PHP_FUNCTION(hw_changeobject) -{ - zval **arg1, **arg2, **arg3; - int link, id, type, i; - hw_connection *ptr; - char *modification, *oldobjrec, buf[BUFFERLEN]; - HashTable *newobjarr; - - if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); /* object ID */ - convert_to_array_ex(arg3); /* Array with new attributes */ - id=Z_LVAL_PP(arg2); - newobjarr=Z_ARRVAL_PP(arg3); - - /* get the old object record */ - if(0 != (ptr->lasterror = send_getandlock(ptr->socket, id, &oldobjrec))) - RETURN_FALSE; - - zend_hash_internal_pointer_reset(newobjarr); - modification = strdup(""); - for(i=0; i<zend_hash_num_elements(newobjarr); i++) { - char *key, *str, *str1, newattribute[BUFFERLEN]; - pval *data, **dataptr; - int j, noinsert=1; - ulong ind; - - zend_hash_get_current_key(newobjarr, &key, &ind, 0); - zend_hash_get_current_data(newobjarr, (void *) &dataptr); - data = *dataptr; - switch(Z_TYPE_P(data)) { - case IS_STRING: - if(strlen(Z_STRVAL_P(data)) == 0) - snprintf(newattribute, BUFFERLEN, "rem %s", key); - else - snprintf(newattribute, BUFFERLEN, "add %s=%s", key, Z_STRVAL_P(data)); - noinsert = 0; - break; - default: - newattribute[0] = '\0'; - } - if(!noinsert) { - modification = fnInsStr(modification, 0, "\\"); - modification = fnInsStr(modification, 0, newattribute); -/* modification = fnInsStr(modification, 0, "add "); */ - - /* Retrieve the old attribute from object record */ - if(NULL != (str = strstr(oldobjrec, key))) { - str1 = str; - j = 0; - while((str1 != NULL) && (*str1 != '\n') && (j < BUFFERLEN-1)) { - buf[j++] = *str1++; - } - buf[j] = '\0'; - modification = fnInsStr(modification, 0, "\\"); - modification = fnInsStr(modification, 0, buf); - modification = fnInsStr(modification, 0, "rem "); - } - } - zend_hash_move_forward(newobjarr); - } - efree(oldobjrec); - - set_swap(ptr->swap_on); - modification[strlen(modification)-1] = '\0'; - if (0 != (ptr->lasterror = send_changeobject(ptr->socket, id, modification))) { - free(modification); - send_unlock(ptr->socket, id); - RETURN_FALSE; - } - free(modification); - if (0 != (ptr->lasterror = send_unlock(ptr->socket, id))) { - RETURN_FALSE; - } - RETURN_TRUE; -} -#undef BUFFERLEN -/* }}} */ - -/* {{{ proto void hw_modifyobject(int link, int objid, array remattributes, array addattributes [, int mode]) - Modifies attributes of an object */ -#define BUFFERLEN 200 -PHP_FUNCTION(hw_modifyobject) -{ - zval **argv[5]; - int argc; - int link, id, type, i, mode; - hw_connection *ptr; - char *modification; - HashTable *remobjarr, *addobjarr; - - argc = ZEND_NUM_ARGS(); - if((argc > 5) || (argc < 4)) - WRONG_PARAM_COUNT; - - if (zend_get_parameters_array_ex(argc, argv) == FAILURE) - if(argc < 4) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(argv[0]); - convert_to_long_ex(argv[1]); /* object ID */ - convert_to_array_ex(argv[2]); /* Array with attributes to remove */ - convert_to_array_ex(argv[3]); /* Array with attributes to add */ - if(argc == 5) { - convert_to_long_ex(argv[4]); - mode = Z_LVAL_PP(argv[4]); - } else - mode = 0; - id=Z_LVAL_PP(argv[1]); - remobjarr=Z_ARRVAL_PP(argv[2]); - addobjarr=Z_ARRVAL_PP(argv[3]); - - modification = strdup(""); - if(addobjarr != NULL) { - zend_hash_internal_pointer_reset(addobjarr); - for(i=0; i<zend_hash_num_elements(addobjarr); i++) { - char *key, addattribute[BUFFERLEN]; - zval *data, **dataptr; - int noinsert=1; - ulong ind; - - zend_hash_get_current_key(addobjarr, &key, &ind, 0); - zend_hash_get_current_data(addobjarr, (void *) &dataptr); - data = *dataptr; - switch(Z_TYPE_P(data)) { - case IS_STRING: - if(strlen(Z_STRVAL_P(data)) > 0) { - snprintf(addattribute, BUFFERLEN, "add %s=%s", key, Z_STRVAL_P(data)); -/* fprintf(stderr, "add: %s\n", addattribute); */ - noinsert = 0; - } - break; - case IS_ARRAY: { - int i, len, keylen, count; - char *strarr, *ptr, *ptr1; - count = zend_hash_num_elements(Z_ARRVAL_P(data)); - if(count > 0) { - strarr = make_objrec_from_array(Z_ARRVAL_P(data), ':'); - len = strlen(strarr) - 1; - keylen = strlen(key); - if(NULL == (ptr = malloc(len + 1 + count*(keylen+1+4)))) { - if(modification) - free(modification); - RETURN_FALSE; - } - ptr1 = ptr; - *ptr1 = '\0'; - strcpy(ptr1, "add "); - ptr1 += 4; - strcpy(ptr1, key); - ptr1 += keylen; - *ptr1++ = '='; - for(i=0; i<len; i++) { - *ptr1++ = strarr[i]; - if(strarr[i] == '\n') { - ptr1[-1] = '\\'; - strcpy(ptr1, "add "); - ptr1 += 4; - strcpy(ptr1, key); - ptr1 += keylen; - *ptr1++ = '='; - } /* else if(strarr[i] == '=') - ptr1[-1] = ':'; */ - } - *ptr1 = '\0'; - strlcpy(addattribute, ptr, sizeof(addattribute)); - noinsert = 0; - } - break; - } - } - if(!noinsert) { - modification = fnInsStr(modification, 0, "\\"); - modification = fnInsStr(modification, 0, addattribute); - } - zend_hash_move_forward(addobjarr); - } - } - - if(remobjarr != NULL) { - int nr; - zend_hash_internal_pointer_reset(remobjarr); - nr = zend_hash_num_elements(remobjarr); - for(i=0; i<nr; i++) { - char *key, remattribute[BUFFERLEN]; - zval *data, **dataptr; - int noinsert=1; - ulong ind; - - zend_hash_get_current_key(remobjarr, &key, &ind, 0); - zend_hash_get_current_data(remobjarr, (void *) &dataptr); - data = *dataptr; - switch(Z_TYPE_P(data)) { - case IS_STRING: - if(strlen(Z_STRVAL_P(data)) > 0) { - snprintf(remattribute, BUFFERLEN, "rem %s=%s", key, Z_STRVAL_P(data)); - noinsert = 0; - } else { - snprintf(remattribute, BUFFERLEN, "rem %s", key); - noinsert = 0; - } - break; - case IS_ARRAY: { - int i, len, keylen, count; - char *strarr, *ptr, *ptr1; - count = zend_hash_num_elements(Z_ARRVAL_P(data)); - if(count > 0) { - strarr = make_objrec_from_array(Z_ARRVAL_P(data), ':'); - len = strlen(strarr) - 1; - keylen = strlen(key); - if(NULL == (ptr = malloc(len + 1 + count*(keylen+1+4)))) { - if(modification) - free(modification); - RETURN_FALSE; - } - ptr1 = ptr; - *ptr1 = '\0'; - strcpy(ptr1, "rem "); - ptr1 += 4; - strcpy(ptr1, key); - ptr1 += keylen; - *ptr1++ = '='; - for(i=0; i<len; i++) { - *ptr1++ = strarr[i]; - if(strarr[i] == '\n') { - ptr1[-1] = '\\'; - strcpy(ptr1, "rem "); - ptr1 += 4; - strcpy(ptr1, key); - ptr1 += keylen; - *ptr1++ = '='; - } /* else if(strarr[i] == '=') - ptr1[-1] = ':'; */ - } - *ptr1++ = '\n'; - *ptr1 = '\0'; - strlcpy(remattribute, ptr, sizeof(remattribute)); - noinsert = 0; - } - break; - } - } - if(!noinsert) { - modification = fnInsStr(modification, 0, "\\"); - modification = fnInsStr(modification, 0, remattribute); - } - zend_hash_move_forward(remobjarr); - } - } - - set_swap(ptr->swap_on); - modification[strlen(modification)-1] = '\0'; - if(strlen(modification) == 0) { - ptr->lasterror = 0; - free(modification); - RETURN_TRUE; - } -/* fprintf(stderr, "modifyobject: %s\n", modification); */ - switch(mode) { - case 0: - if (0 == (ptr->lasterror = send_lock(ptr->socket, id))) { - if (0 == (ptr->lasterror = send_changeobject(ptr->socket, id, modification))) { - if (0 != (ptr->lasterror = send_unlock(ptr->socket, id))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Aiii, Changeobject failed and couldn't unlock object (id = 0x%X)", id); - free(modification); - RETURN_FALSE; - } - free(modification); - RETURN_FALSE; - } else { - send_unlock(ptr->socket, id); - free(modification); - RETURN_FALSE; - } - } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not lock object (id = 0x%X)", id); - free(modification); - RETURN_FALSE; - } - break; - case 1: -/* WARNING: send_groupchangobject() only works right, if each attribute - can be modified. Doing a changeobject recursively often tries to - modify objects which cannot be modified e.g. because an attribute cannot - be removed. In such a case no further modification on that object is done. - Doing a 'rem Rights\add Rights=R:a' will fail completely if the attribute - Rights is not there already. The object locking is done in send_groupchangeobject(); -*/ - if (0 != (ptr->lasterror = send_groupchangeobject(ptr->socket, id, modification))) { - free(modification); - RETURN_FALSE; - } - break; - default: - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Mode must be 0 or 1 (recursive)"); - } - free(modification); - RETURN_TRUE; -} -#undef BUFFERLEN -/* }}} */ - -/* {{{ php_hw_mvcp - */ -void php_hw_mvcp(INTERNAL_FUNCTION_PARAMETERS, int mvcp) { - zval **arg1, **arg2, **arg3, **arg4; - int link, type, dest=0, from=0, count; - HashTable *src_arr; - hw_connection *ptr; - int collIDcount, docIDcount, i, *docIDs, *collIDs; - - switch(mvcp) { - case MOVE: /* Move also has fromID */ - if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) - WRONG_PARAM_COUNT; - break; - case COPY: - if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) - WRONG_PARAM_COUNT; - break; - } - HW_FETCH_LINK(arg1); - convert_to_array_ex(arg2); - convert_to_long_ex(arg3); - link=Z_LVAL_PP(arg1); - src_arr=Z_ARRVAL_PP(arg2); - switch(mvcp) { - case MOVE: /* Move also has fromID, which is arg3 --> arg4 becomes destID */ - convert_to_long_ex(arg4); - from=Z_LVAL_PP(arg3); - dest=Z_LVAL_PP(arg4); - break; - case COPY: /* No fromID for Copy needed --> arg3 is destID */ - dest=Z_LVAL_PP(arg3); - from = 0; - break; - } - - set_swap(ptr->swap_on); - - count = zend_hash_num_elements(src_arr); - if(NULL == (collIDs = emalloc(count * sizeof(int)))) { - RETURN_FALSE; - } - - if(NULL == (docIDs = emalloc(count * sizeof(int)))) { - efree(collIDs); - RETURN_FALSE; - } - - collIDcount = docIDcount = 0; - zend_hash_internal_pointer_reset(src_arr); - for(i=0; i<count; i++) { - char *objrec; - zval *keydata, **keydataptr; - zend_hash_get_current_data(src_arr, (void **) &keydataptr); - keydata = *keydataptr; - if(Z_TYPE_P(keydata) == IS_LONG) { - if(0 != (ptr->lasterror = send_getobject(ptr->socket, Z_LVAL_P(keydata), &objrec))) { - efree(collIDs); - efree(docIDs); - RETURN_FALSE; - } - if(0 == fnAttributeCompare(objrec, "DocumentType", "collection")) - collIDs[collIDcount++] = Z_LVAL_P(keydata); - else - docIDs[docIDcount++] = Z_LVAL_P(keydata); - efree(objrec); - } - zend_hash_move_forward(src_arr); - } - - if (0 != (ptr->lasterror = send_mvcpdocscoll(ptr->socket, docIDs, docIDcount, from, dest, mvcp))) { - efree(collIDs); - efree(docIDs); - RETURN_FALSE; - } - - if (0 != (ptr->lasterror = send_mvcpcollscoll(ptr->socket, collIDs, collIDcount, from, dest, mvcp))) { - efree(collIDs); - efree(docIDs); - RETURN_FALSE; - } - - efree(collIDs); - efree(docIDs); - - RETURN_LONG(docIDcount + collIDcount); -} -/* }}} */ - -/* {{{ proto void hw_mv(int link, array objrec, int from, int dest) - Moves object */ -PHP_FUNCTION(hw_mv) -{ - php_hw_mvcp(INTERNAL_FUNCTION_PARAM_PASSTHRU, MOVE); -} -/* }}} */ - -/* {{{ proto void hw_cp(int link, array objrec, int dest) - Copies object */ -PHP_FUNCTION(hw_cp) -{ - php_hw_mvcp(INTERNAL_FUNCTION_PARAM_PASSTHRU, COPY); -} -/* }}} */ - -/* {{{ proto hwdoc hw_gettext(int link, int objid [, int rootid]) - Returns text document. Links are relative to rootid if given */ -PHP_FUNCTION(hw_gettext) -{ - zval **argv[3]; - int argc, link, id, type, mode; - int rootid = 0; - char *urlprefix; - hw_document *doc; - hw_connection *ptr; - - argc = ZEND_NUM_ARGS(); - if(argc > 3 || argc < 2 || (zend_get_parameters_array_ex(argc, argv) == FAILURE)) { - WRONG_PARAM_COUNT; - } - - HW_FETCH_LINK(argv[0]); - convert_to_long_ex(argv[1]); - mode = 0; - urlprefix = NULL; - if(argc == 3) { - switch(Z_TYPE_PP(argv[2])) { - case IS_LONG: - convert_to_long_ex(argv[2]); - rootid = Z_LVAL_PP(argv[2]); - mode = 1; - break; - case IS_STRING: - convert_to_string_ex(argv[2]); - urlprefix = Z_STRVAL_PP(argv[2]); - break; - } - } - id=Z_LVAL_PP(argv[1]); - - set_swap(ptr->swap_on); - { - char *object = NULL; - char *attributes = NULL; - char *bodytag = NULL; - int count; - /* !!!! memory for object and attributes is allocated with malloc !!!! */ - if (0 != (ptr->lasterror = send_gettext(ptr->socket, id, mode, rootid, &attributes, &bodytag, &object, &count, urlprefix))) - RETURN_FALSE; - doc = malloc(sizeof(hw_document)); - doc->data = object; - doc->attributes = attributes; - doc->bodytag = bodytag; - doc->size = count; - Z_LVAL_P(return_value) = zend_list_insert(doc, le_document); - Z_TYPE_P(return_value) = IS_LONG; - } -} -/* }}} */ - -/* {{{ proto void hw_edittext(int link, hwdoc doc) - Modifies text document */ -PHP_FUNCTION(hw_edittext) -{ - zval **arg1, **arg2; - int link, doc, type; - hw_connection *ptr; - hw_document *docptr; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - - doc=Z_LVAL_PP(arg2); - docptr = zend_list_find(doc, &type); - - if(!docptr || (type!=le_document)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find document identifier %d", doc); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - { - if (0 != (ptr->lasterror = send_edittext(ptr->socket, docptr->attributes, docptr->data))) { - RETURN_FALSE; - } - } - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto hwdoc hw_getcgi(int link, int objid) - Returns the output of a CGI script */ -#define BUFFERLEN 1000 -/* FIX ME: The buffer cgi_env_str should be allocated dynamically */ -PHP_FUNCTION(hw_getcgi) -{ - zval **arg1, **arg2; - int link, id, type; - hw_document *doc; - hw_connection *ptr; - char cgi_env_str[BUFFERLEN]; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - id=Z_LVAL_PP(arg2); - - set_swap(ptr->swap_on); - { - char *object = NULL; - char *attributes = NULL; - int count; - - /* Here is another undocument function of Hyperwave. - If you call a cgi script with getcgi-message, you will - have to provide the complete cgi enviroment, since it is - only known to the webserver (or wavemaster). This is done - by extending the object record with the following incomplete - string. It should contain any enviroment variable a cgi script - requires. - */ -#ifdef PHP_WIN32 - snprintf(cgi_env_str, BUFFERLEN, "CGI_REQUEST_METHOD=%s\nCGI_PATH_INFO=%s\nCGI_QUERY_STRING=%s", - getenv("REQUEST_METHOD"), - getenv("PATH_INFO"), - getenv("QUERY_STRING")); -#else - snprintf(cgi_env_str, BUFFERLEN, "CGI_REQUEST_METHOD=%s\nCGI_PATH_INFO=%s\nCGI_QUERY_STRING=%s", - SG(request_info).request_method, - SG(request_info).request_uri, - SG(request_info).query_string); -#endif - /* !!!! memory for object and attributes is allocated with malloc !!!! */ - if (0 != (ptr->lasterror = send_getcgi(ptr->socket, id, cgi_env_str, &attributes, &object, &count))) - RETURN_FALSE; - doc = malloc(sizeof(hw_document)); - doc->data = object; - doc->attributes = attributes; - doc->bodytag = NULL; - doc->size = count; - Z_LVAL_P(return_value) = zend_list_insert(doc, le_document); - Z_TYPE_P(return_value) = IS_LONG; - } -} -#undef BUFFERLEN -/* }}} */ - -/* {{{ proto int hw_getremote(int link, int objid) - Returns the content of a remote document */ -PHP_FUNCTION(hw_getremote) -{ - zval **arg1, **arg2; - int link, id, type; - hw_document *doc; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - id=Z_LVAL_PP(arg2); - - set_swap(ptr->swap_on); - { - char *object = NULL; - char *attributes = NULL; - int count; - /* !!!! memory for object and attributes is allocated with malloc !!!! */ - if (0 != (ptr->lasterror = send_getremote(ptr->socket, id, &attributes, &object, &count))) - RETURN_FALSE; - doc = malloc(sizeof(hw_document)); - doc->data = object; - doc->attributes = attributes; - doc->bodytag = NULL; - doc->size = count; - Z_LVAL_P(return_value) = zend_list_insert(doc, le_document); - Z_TYPE_P(return_value) = IS_LONG; - } -} -/* }}} */ - -/* {{{ proto [array|int] hw_getremotechildren(int link, string objrec) - Returns the remote document or an array of object records */ -PHP_FUNCTION(hw_getremotechildren) -{ - zval **arg1, **arg2; - int link, type, i; - hw_connection *ptr; - char *objrec; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_string_ex(arg2); - objrec=Z_STRVAL_PP(arg2); - - set_swap(ptr->swap_on); - { - int count, *offsets; - char *remainder, *ptr1; - if (0 != (ptr->lasterror = send_getremotechildren(ptr->socket, objrec, &remainder, &offsets, &count))) - RETURN_FALSE; - -/* -for(i=0;i<count;i++) - php_printf("offset[%d] = %d--\n", i, offsets[i]); -php_printf("count = %d, remainder = <HR>%s---<HR>", count, remainder); -*/ - /* The remainder depends on the number of returned objects and - whether the MimeType of the object to retrieve is set. If - the MimeType is set the result will start with the - HTTP header 'Content-type: mimetype', otherwise it will be - a list of object records and therefore starts with - 'ObjectID=0'. In the first case the offset and count are somewhat - strange. Quite often count had a value of 6 which appears to be - meaningless, but if you sum up the offsets you get the length - of the remainder which is the lenght of the document. - The document must have been chopped up into 6 pieces, each ending - with 'ServerId=0xYYYYYYYY'. - In the second case the offset contains the lenght of - each object record; count contains the number of object records. - Even if a remote object has children - (several sql statements) but the MimeType is set, it will - return a document in the format of MimeType. On the other - hand a remote object does not have any children but just - returns a docuement will not be shown unless the MimeType - is set. It returns the pure object record of the object without - the SQLStatement attribute. Quite senseless. - Though, this behavior depends on how the hgi gateway in Hyperwave - is implemented. - */ - if(strncmp(remainder, "ObjectID=0 ", 10)) { - hw_document *doc; - char *ptr; - int i, j, len; - /* For some reason there is always the string - 'SeverId=0xYYYYYYYY' at the end, so we cut it off. - The document may as well be divided into several pieces - and each of them has the ServerId at the end. - The following will put the pieces back together and - strip the ServerId. count contains the number of pieces. - */ - for(i=0, len=0; i<count; i++) - len += offsets[i]-18; -/*fprintf(stderr, "len = %d\n", len); */ - doc = malloc(sizeof(hw_document)); - doc->data = malloc(len+1); - ptr = doc->data; - for(i=0, j=0; i<count; i++) { - memcpy((char *)ptr, (char *)&remainder[j], offsets[i]-18); -/*fprintf(stderr, "rem = %s\n", &remainder[j]); */ - j += offsets[i]; - ptr += offsets[i] - 18; - } - *ptr = '\0'; - doc->attributes = strdup(objrec); - doc->bodytag = NULL; - doc->size = strlen(doc->data); - Z_LVAL_P(return_value) = zend_list_insert(doc, le_document); - Z_TYPE_P(return_value) = IS_LONG; - } else { - array_init(return_value); - - ptr1 = remainder; - for(i=0; i<count; i++) { - *(ptr1+offsets[i]-1) = '\0'; - add_index_string(return_value, i, ptr1, 1); - ptr1 += offsets[i]; - } - } - - efree(offsets); - efree(remainder); - } -} -/* }}} */ - -/* {{{ proto void hw_setlinkroot(int link, int rootid) - Set the id to which links are calculated */ -PHP_FUNCTION(hw_setlinkroot) -{ - zval **arg1, **arg2; - int link, type, rootid; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - rootid = Z_LVAL_PP(arg2); - - ptr->linkroot = rootid; - RETURN_LONG(rootid); -} -/* }}} */ - -/* {{{ proto hwdoc hw_pipedocument(int link, int objid [, array urlprefixes]) - Returns document with links inserted. Optionally a array with five urlprefixes may be passed, which will be inserted for the different types of anchors. This should be a named array with the following keys: HW_DEFAULT_LINK, HW_IMAGE_LINK, HW_BACKGROUND_LINK, HW_INTAG_LINK, and HW_APPLET_LINK */ -PHP_FUNCTION(hw_pipedocument) -{ - zval **arg1, **arg2, **arg3; - int i, link, id, type, argc, mode; - int rootid = 0; - HashTable *prefixarray; - char **urlprefix; - hw_connection *ptr; - hw_document *doc; -#if APACHE - server_rec *serv = ((request_rec *) SG(server_context))->server; -#endif - - argc = ZEND_NUM_ARGS(); - switch(argc) - { - case 2: - if (zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) - WRONG_PARAM_COUNT; - break; - case 3: - if (zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) - WRONG_PARAM_COUNT; - break; - default: - WRONG_PARAM_COUNT; - } - - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - - id=Z_LVAL_PP(arg2); - - /* check for the array with urlprefixes */ - if(argc == 3) { - convert_to_array_ex(arg3); - prefixarray =Z_ARRVAL_PP(arg3); - if((prefixarray == NULL) || (zend_hash_num_elements(prefixarray) != 5)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "You must provide 5 urlprefixes (you have provided %d)", zend_hash_num_elements(prefixarray)); - RETURN_FALSE; - } - - urlprefix = emalloc(5*sizeof(char *)); - zend_hash_internal_pointer_reset(prefixarray); - for(i=0; i<5; i++) { - char *key; - zval *data, **dataptr; - ulong ind; - - zend_hash_get_current_key(prefixarray, &key, &ind, 0); - zend_hash_get_current_data(prefixarray, (void *) &dataptr); - data = *dataptr; - if (Z_TYPE_P(data) != IS_STRING) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s must be a String", key); - RETURN_FALSE; - } else if ( strcmp(key, "HW_DEFAULT_LINK") == 0 ) { - urlprefix[HW_DEFAULT_LINK] = Z_STRVAL_P(data); - } else if ( strcmp(key, "HW_IMAGE_LINK") == 0 ) { - urlprefix[HW_IMAGE_LINK] = Z_STRVAL_P(data); - } else if ( strcmp(key, "HW_BACKGROUND_LINK") == 0 ) { - urlprefix[HW_BACKGROUND_LINK] = Z_STRVAL_P(data); - } else if ( strcmp(key, "HW_INTAG_LINK") == 0 ) { - urlprefix[HW_INTAG_LINK] = Z_STRVAL_P(data); - } else if ( strcmp(key, "HW_APPLET_LINK") == 0 ) { - urlprefix[HW_APPLET_LINK] = Z_STRVAL_P(data); - } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s is not a valid urlprefix", key); - RETURN_FALSE; - } - zend_hash_move_forward(prefixarray); - } - } else { - urlprefix = NULL; - } - - mode = 0; - if(ptr->linkroot > 0) - mode = 1; - rootid = ptr->linkroot; - - set_swap(ptr->swap_on); - { - char *object = NULL; - char *attributes = NULL; - char *bodytag = NULL; - int count; - /* !!!! memory for object, bodytag and attributes is allocated with malloc !!!! */ - if (0 != (ptr->lasterror = send_pipedocument(ptr->socket, -#if APACHE - serv->server_hostname, -#else - getenv("HOSTNAME"), -#endif - id, mode, rootid, &attributes, &bodytag, &object, &count, urlprefix))) - RETURN_FALSE; - - if(urlprefix) efree(urlprefix); - - doc = malloc(sizeof(hw_document)); - doc->data = object; - doc->attributes = attributes; - doc->bodytag = bodytag; - doc->size = count; -/* fprintf(stderr, "size = %d\n", count); */ - Z_LVAL_P(return_value) = zend_list_insert(doc, le_document); - Z_TYPE_P(return_value) = IS_LONG; - } -} -/* }}} */ - -/* {{{ proto hwdoc hw_pipedocument(int link, int objid) - Returns document */ -PHP_FUNCTION(hw_oldpipedocument) -{ - zval **argv[3]; - int link, id, type, argc, mode; - int rootid = 0; - hw_connection *ptr; - hw_document *doc; -#if APACHE - server_rec *serv = ((request_rec *) SG(server_context))->server; -#endif - - argc = ZEND_NUM_ARGS(); - if(argc != 2 || (zend_get_parameters_array_ex(argc, argv) == FAILURE)) { - WRONG_PARAM_COUNT; - } - - HW_FETCH_LINK(argv[0]); - convert_to_long_ex(argv[1]); -/* if(argc == 3) { - convert_to_long_ex(argv[2]); - rootid = Z_LVAL_PP(argv[2]); - if(rootid != 0) - mode = 1; - } -*/ - id=Z_LVAL_PP(argv[1]); - - mode = 0; - if(ptr->linkroot > 0) - mode = 1; - rootid = ptr->linkroot; - - set_swap(ptr->swap_on); - { - char *object = NULL; - char *attributes = NULL; - char *bodytag = NULL; - int count; - /* !!!! memory for object, bodytag and attributes is allocated with malloc !!!! */ - if (0 != (ptr->lasterror = send_pipedocument(ptr->socket, -#if APACHE - serv->server_hostname, -#else - getenv("HOSTNAME"), -#endif - id, mode, rootid, &attributes, &bodytag, &object, &count, NULL))) - RETURN_FALSE; - - doc = malloc(sizeof(hw_document)); - doc->data = object; - doc->attributes = attributes; - doc->bodytag = bodytag; - doc->size = count; -/* fprintf(stderr, "size = %d\n", count); */ - Z_LVAL_P(return_value) = zend_list_insert(doc, le_document); - Z_TYPE_P(return_value) = IS_LONG; - } -} -/* }}} */ - -/* {{{ proto hwdoc hw_pipecgi(int link, int objid) - Returns output of CGI script */ -#define BUFFERLEN 1000 -/* FIX ME: The buffer cgi_env_str should be allocated dynamically */ -PHP_FUNCTION(hw_pipecgi) -{ - zval **arg1, **arg2; - int link, id, type; - hw_connection *ptr; - hw_document *doc; - char cgi_env_str[1000]; -#if APACHE - server_rec *serv = ((request_rec *) SG(server_context))->server; -#endif - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - id=Z_LVAL_PP(arg2); - - set_swap(ptr->swap_on); - { - char *object = NULL; - char *attributes = NULL; - int count; - -#ifdef PHP_WIN32 - snprintf(cgi_env_str, BUFFERLEN, "CGI_REQUEST_METHOD=%s\nCGI_PATH_INFO=%s\nCGI_QUERY_STRING=%s", - getenv("REQUEST_METHOD"), - getenv("PATH_INFO"), - getenv("QUERY_STRING")); -#else - snprintf(cgi_env_str, BUFFERLEN, "CGI_REQUEST_METHOD=%s\nCGI_PATH_INFO=%s\nCGI_QUERY_STRING=%s", - SG(request_info).request_method, - SG(request_info).request_uri, - SG(request_info).query_string); -#endif - /* !!!! memory for object, bodytag and attributes is allocated with malloc !!!! */ - if (0 != (ptr->lasterror = send_pipecgi(ptr->socket, -#if APACHE - serv->server_hostname, -#else - getenv("HOSTNAME"), -#endif - id, cgi_env_str, &attributes, &object, &count))) - RETURN_FALSE; - - doc = malloc(sizeof(hw_document)); - doc->data = object; - doc->attributes = attributes; - doc->bodytag = NULL; - doc->size = count; - Z_LVAL_P(return_value) = zend_list_insert(doc, le_document); - Z_TYPE_P(return_value) = IS_LONG; - } -} -#undef BUFFERLEN -/* }}} */ - -/* {{{ proto void hw_insertdocument(int link, int parentid, hwdoc doc) - Insert new document */ -PHP_FUNCTION(hw_insertdocument) -{ - zval **arg1, **arg2, **arg3; - int link, id, doc, type; - hw_connection *ptr; - hw_document *docptr; - hw_objectID objid; -#if APACHE - server_rec *serv = ((request_rec *) SG(server_context))->server; -#endif - - if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - convert_to_long_ex(arg3); - id=Z_LVAL_PP(arg2); - - doc=Z_LVAL_PP(arg3); - docptr = zend_list_find(doc, &type); - if(!docptr || (type!=le_document)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find document identifier %d", doc); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - { - if (0 != (ptr->lasterror = send_putdocument(ptr->socket, -#if APACHE - serv->server_hostname, -#else - getenv("HOSTNAME"), -#endif - id, docptr->attributes, docptr->data, docptr->size, &objid))) { - RETURN_FALSE; - } - } - RETURN_LONG(objid); -} -/* }}} */ - -/* {{{ proto hwdoc hw_new_document(string objrec, string data, int size) - Create a new document */ -PHP_FUNCTION(hw_new_document) -{ - zval **arg1, **arg2, **arg3; - char *ptr; - hw_document *doc; - - if (ZEND_NUM_ARGS() != 3 || (zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE)) { - WRONG_PARAM_COUNT; - } - convert_to_string_ex(arg1); - convert_to_string_ex(arg2); - convert_to_long_ex(arg3); - - doc = malloc(sizeof(hw_document)); - if(NULL == doc) - RETURN_FALSE; - doc->data = malloc(Z_LVAL_PP(arg3)+1); - if(NULL == doc->data) { - free(doc); - RETURN_FALSE; - } - memcpy(doc->data, Z_STRVAL_PP(arg2), Z_LVAL_PP(arg3)); - ptr = doc->data; - ptr[Z_LVAL_PP(arg3)] = '\0'; - doc->attributes = strdup(Z_STRVAL_PP(arg1)); - doc->bodytag = NULL; - doc->size = Z_LVAL_PP(arg3); - Z_LVAL_P(return_value) = zend_list_insert(doc, le_document); - Z_TYPE_P(return_value) = IS_LONG; -} -/* }}} */ - -/* {{{ proto hwdoc hw_new_document_from_file(string objrec, string filename) - Create a new document from a file */ -PHP_FUNCTION(hw_new_document_from_file) -{ - pval **arg1, **arg2; - char *ptr; - php_stream *stream; - int use_include_path=0; - hw_document *doc; - - if (ZEND_NUM_ARGS() != 2 || (zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE)) { - WRONG_PARAM_COUNT; - } - - convert_to_string_ex(arg1); - convert_to_string_ex(arg2); - - stream = php_stream_open_wrapper(Z_STRVAL_PP(arg2), "r", use_include_path|ENFORCE_SAFE_MODE|REPORT_ERRORS, NULL); - - if (stream == NULL) { - RETURN_FALSE; - } - - doc = malloc(sizeof(hw_document)); - if(NULL == doc) - RETURN_FALSE; - - doc->size = php_stream_copy_to_mem(stream, &doc->data, PHP_STREAM_COPY_ALL, 1); - - php_stream_close(stream); - - /* I'm not sure if it is necessary to add a '\0'. It depends on whether - * PHP-Strings has to be null terminated. doc->size doesn't count the - * '\0'. - */ - doc->data = realloc(doc->data, doc->size+1); - ptr = doc->data; - ptr[doc->size] = '\0'; - doc->attributes = strdup(Z_STRVAL_PP(arg1)); - doc->bodytag = NULL; - Z_LVAL_P(return_value) = zend_list_insert(doc, le_document); - Z_TYPE_P(return_value) = IS_LONG; -} -/* }}} */ - -/* {{{ proto void hw_free_document(hwdoc doc) - Frees memory of document */ -PHP_FUNCTION(hw_free_document) -{ - zval **arg1; - int id, type; - hw_document *ptr; - - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_ID(arg1); - zend_list_delete(id); - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto void hw_outputdocument(hwdoc doc) - An alias for hw_output_document */ -/* }}} */ - -/* {{{ proto void hw_output_document(hwdoc doc) - Prints document */ -PHP_FUNCTION(hw_output_document) -{ - zval **arg1; - int id, type; - hw_document *ptr; - - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_ID(arg1); - - php_write(ptr->data, ptr->size TSRMLS_CC); - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto string hw_documentbodytag(hwdoc doc [, string prefix]) - An alias for hw_document_bodytag */ -/* }}} */ - -/* {{{ proto string hw_document_bodytag(hwdoc doc [, string prefix]) - Return bodytag prefixed by prefix */ -PHP_FUNCTION(hw_document_bodytag) -{ - zval **argv[2]; - int id, type, argc; - hw_document *ptr; - char *temp, *str = NULL; - - argc = ZEND_NUM_ARGS(); - if(argc > 2 || argc < 1 || (zend_get_parameters_array_ex(argc, argv) == FAILURE)) { - WRONG_PARAM_COUNT; - } - - HW_FETCH_ID(argv[0]); - - if(argc == 2) { - convert_to_string_ex(argv[1]); - str=Z_STRVAL_PP(argv[1]); - } - - if(str != NULL) { - temp = emalloc(Z_STRLEN_PP(argv[1]) + strlen(ptr->bodytag) + 2); - strcpy(temp, ptr->bodytag); - strcpy(temp+strlen(ptr->bodytag)-1, str); - strcpy(temp+strlen(ptr->bodytag)-1+Z_STRLEN_PP(argv[1]), ">\n"); - RETURN_STRING(temp, 0); - } else { -/* fprintf(stderr, "hw_document_bodytag: %s (%s)\n", ptr->bodytag, ptr->attributes); */ - if(ptr->bodytag) { - RETURN_STRING(ptr->bodytag, 1); - } else { - RETURN_EMPTY_STRING(); - } - } -} -/* }}} */ - -/* {{{ proto string hw_document_content(hwdoc doc) - Returns content of document */ -PHP_FUNCTION(hw_document_content) -{ - zval **arg1; - int id, type; - hw_document *ptr; - - if (ZEND_NUM_ARGS() != 1 || (zend_get_parameters_ex(1, &arg1) == FAILURE)) { - RETURN_FALSE; - } - - HW_FETCH_ID(arg1); - - RETURN_STRINGL(ptr->data, ptr->size, 1); -} -/* }}} */ - -/* {{{ proto int hw_document_setcontent(hwdoc doc, string content) - Sets/replaces content of document */ -PHP_FUNCTION(hw_document_setcontent) -{ - zval **arg1, **arg2; - int id, type; - hw_document *ptr; - char *str; - - if (ZEND_NUM_ARGS() != 2 || (zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE)) { - WRONG_PARAM_COUNT; - } - - HW_FETCH_ID(arg1); - convert_to_string_ex(arg2); - - str = ptr->data; - if(NULL != (ptr->data = strdup(Z_STRVAL_PP(arg2)))) { - ptr->size = strlen(ptr->data); - free(str); - RETURN_TRUE; - } else { - ptr->data = str; - RETURN_FALSE; - } -} -/* }}} */ - -/* {{{ proto int hw_documentsize(hwdoc doc) - An alias for hw_document_size */ -/* }}} */ - -/* {{{ proto int hw_document_size(hwdoc doc) - Returns size of document */ -PHP_FUNCTION(hw_document_size) -{ - zval **arg1; - int id, type; - hw_document *ptr; - - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_ID(arg1); - - RETURN_LONG(ptr->size); -} -/* }}} */ - -/* {{{ proto string hw_documentattributes(hwdoc doc) - An alias for hw_document_attributes */ -/* }}} */ - -/* {{{ proto string hw_document_attributes(hwdoc doc) - Returns object record of document */ -PHP_FUNCTION(hw_document_attributes) -{ - zval **arg1; - int id, type; - hw_document *ptr; - - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_ID(arg1); - - RETURN_STRING(ptr->attributes, 1); -/* make_return_array_from_objrec(&return_value, ptr->attributes); */ -} -/* }}} */ - -/* {{{ proto array hw_getparentsobj(int link, int objid) - Returns array of parent object records */ -PHP_FUNCTION(hw_getparentsobj) -{ - zval **arg1, **arg2; - int link, id, type; - int count; - char **childObjRecs = NULL; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - id=Z_LVAL_PP(arg2); - - set_swap(ptr->swap_on); - - if (0 != (ptr->lasterror = send_getparentsobj(ptr->socket, id, &childObjRecs, &count))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - /* create return value and free all memory */ - if( 0 > make_return_objrec(&return_value, childObjRecs, count)) - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto array hw_getparents(int link, int objid) - Returns array of parent object ids */ -PHP_FUNCTION(hw_getparents) -{ - zval **arg1, **arg2; - int link, id, type; - int count; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - id=Z_LVAL_PP(arg2); - - set_swap(ptr->swap_on); - { - int *childIDs = NULL; - int i; - - if (0 != (ptr->lasterror = send_getparents(ptr->socket, id, &childIDs, &count))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - array_init(return_value); - - for(i=0; i<count; i++) { - add_index_long(return_value, i, childIDs[i]); - } - efree(childIDs); - } - -} -/* }}} */ - -/* {{{ proto array hw_children(int link, int objid) - Returns array of children object ids */ -PHP_FUNCTION(hw_children) -{ - zval **arg1, **arg2; - int link, id, type; - int count; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - id=Z_LVAL_PP(arg2); - - set_swap(ptr->swap_on); - { - int *childIDs = NULL; - int i; - - if (0 != (ptr->lasterror = send_children(ptr->socket, id, &childIDs, &count))){ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - array_init(return_value); - - for(i=0; i<count; i++) { - add_index_long(return_value, i, childIDs[i]); - } - efree(childIDs); - } - -} -/* }}} */ - -/* {{{ proto array hw_childrenobj(int link, int objid) - Returns array of children object records */ -PHP_FUNCTION(hw_childrenobj) -{ - pval **arg1, **arg2; - int link, id, type; - int count; - char **childObjRecs = NULL; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - id=Z_LVAL_PP(arg2); - - set_swap(ptr->swap_on); - - if (0 != (ptr->lasterror = send_childrenobj(ptr->socket, id, &childObjRecs, &count))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - /* create return value and free all memory */ - if( 0 > make_return_objrec(&return_value, childObjRecs, count)) - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto array hw_getchildcoll(int link, int objid) - Returns array of child collection object ids */ -PHP_FUNCTION(hw_getchildcoll) -{ - pval **arg1, **arg2; - int link, id, type; - int count; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - id=Z_LVAL_PP(arg2); - - set_swap(ptr->swap_on); - { - int *childIDs = NULL; - int i; - - if (0 != (ptr->lasterror = send_getchildcoll(ptr->socket, id, &childIDs, &count))){ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - array_init(return_value); - - for(i=0; i<count; i++) { - add_index_long(return_value, i, childIDs[i]); - } - efree(childIDs); - } - -} -/* }}} */ - -/* {{{ proto array hw_getchildcollobj(int link, int objid) - Returns array of child collection object records */ -PHP_FUNCTION(hw_getchildcollobj) -{ - pval **arg1, **arg2; - int link, id, type; - int count; - char **childObjRecs = NULL; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - id=Z_LVAL_PP(arg2); - - set_swap(ptr->swap_on); - - if (0 != (ptr->lasterror = send_getchildcollobj(ptr->socket, id, &childObjRecs, &count))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - /* create return value and free all memory */ - if( 0 > make_return_objrec(&return_value, childObjRecs, count)) - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto int hw_docbyanchor(int link, int anchorid) - Returns objid of document belonging to anchorid */ -PHP_FUNCTION(hw_docbyanchor) -{ - pval **arg1, **arg2; - int link, id, type; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(ht, 2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - id=Z_LVAL_PP(arg2); - - set_swap(ptr->swap_on); - { - int objectID; - if (0 != (ptr->lasterror = send_docbyanchor(ptr->socket, id, &objectID))) - RETURN_FALSE; - - RETURN_LONG(objectID); - } -} -/* }}} */ - -/* {{{ proto array hw_docbyanchorobj(int link, int anchorid) - Returns object record of document belonging to anchorid */ -PHP_FUNCTION(hw_docbyanchorobj) -{ - pval **arg1, **arg2; - int link, id, type; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - id=Z_LVAL_PP(arg2); - - set_swap(ptr->swap_on); - { - char *object = NULL; - if (0 != (ptr->lasterror = send_docbyanchorobj(ptr->socket, id, &object))) - RETURN_FALSE; - - RETURN_STRING(object, 0); - /* - make_return_array_from_objrec(&return_value, object); - efree(object); - */ - } -} -/* }}} */ - -/* {{{ proto array hw_getobjectbyquery(int link, string query, int maxhits) - Search for query and return maxhits objids */ -PHP_FUNCTION(hw_getobjectbyquery) -{ - pval **arg1, **arg2, **arg3; - int link, type, maxhits; - char *query; - int count, i; - int *childIDs = NULL; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_string_ex(arg2); - convert_to_long_ex(arg3); - query=Z_STRVAL_PP(arg2); - maxhits=Z_LVAL_PP(arg3); - if (maxhits < 0) maxhits=0x7FFFFFFF; - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getobjbyquery(ptr->socket, query, maxhits, &childIDs, &count))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - array_init(return_value); - - for(i=0; i<count; i++) - add_index_long(return_value, i, childIDs[i]); - efree(childIDs); -} -/* }}} */ - -/* {{{ proto array hw_getobjectbyqueryobj(int link, string query, int maxhits) - Search for query and return maxhits object records */ -PHP_FUNCTION(hw_getobjectbyqueryobj) -{ - pval **arg1, **arg2, **arg3; - int link, type, maxhits; - char *query; - int count; - char **childObjRecs = NULL; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_string_ex(arg2); - convert_to_long_ex(arg3); - query=Z_STRVAL_PP(arg2); - maxhits=Z_LVAL_PP(arg3); - if (maxhits < 0) maxhits=0x7FFFFFFF; - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getobjbyqueryobj(ptr->socket, query, maxhits, &childObjRecs, &count))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - /* create return value and free all memory */ - if( 0 > make_return_objrec(&return_value, childObjRecs, count)) - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto array hw_getobjectbyquerycoll(int link, int collid, string query, int maxhits) - Search for query in collection and return maxhits objids */ -PHP_FUNCTION(hw_getobjectbyquerycoll) -{ - pval **arg1, **arg2, **arg3, **arg4; - int link, id, type, maxhits; - char *query; - int count, i; - hw_connection *ptr; - int *childIDs = NULL; - - if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - convert_to_string_ex(arg3); - convert_to_long_ex(arg4); - id=Z_LVAL_PP(arg2); - query=Z_STRVAL_PP(arg3); - maxhits=Z_LVAL_PP(arg4); - if (maxhits < 0) maxhits=0x7FFFFFFF; - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getobjbyquerycoll(ptr->socket, id, query, maxhits, &childIDs, &count))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - array_init(return_value); - - for(i=0; i<count; i++) - add_index_long(return_value, i, childIDs[i]); - efree(childIDs); -} -/* }}} */ - -/* {{{ proto array hw_getobjectbyquerycollobj(int link, int collid, string query, int maxhits) - Search for query in collection and return maxhits object records */ -PHP_FUNCTION(hw_getobjectbyquerycollobj) -{ - pval **arg1, **arg2, **arg3, **arg4; - int link, id, type, maxhits; - char *query; - int count; - hw_connection *ptr; - char **childObjRecs = NULL; - - if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - convert_to_string_ex(arg3); - convert_to_long_ex(arg4); - id=Z_LVAL_PP(arg2); - query=Z_STRVAL_PP(arg3); - maxhits=Z_LVAL_PP(arg4); - if (maxhits < 0) maxhits=0x7FFFFFFF; - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getobjbyquerycollobj(ptr->socket, id, query, maxhits, &childObjRecs, &count))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - /* create return value and free all memory */ - if( 0 > make_return_objrec(&return_value, childObjRecs, count)) - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto array hw_getobjectbyftquery(int link, string query, int maxhits) - Search for query as fulltext and return maxhits objids */ -PHP_FUNCTION(hw_getobjectbyftquery) -{ - pval **arg1, **arg2, **arg3; - int link, type, maxhits; - char *query; - int count, i; - int *childIDs = NULL; - float *weights; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_string_ex(arg2); - convert_to_long_ex(arg3); - query=Z_STRVAL_PP(arg2); - maxhits=Z_LVAL_PP(arg3); - if (maxhits < 0) maxhits=0x7FFFFFFF; - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getobjbyftquery(ptr->socket, query, maxhits, &childIDs, &weights, &count))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - array_init(return_value) ; - - for(i=0; i<count; i++) - add_index_long(return_value, i, childIDs[i]); - efree(childIDs); -} -/* }}} */ - -/* {{{ proto array hw_getobjectbyftqueryobj(int link, string query, int maxhits) - Search for query as fulltext and return maxhits object records */ -PHP_FUNCTION(hw_getobjectbyftqueryobj) -{ - pval **arg1, **arg2, **arg3; - int link, type, maxhits; - char *query; - int count; - char **childObjRecs = NULL; - float *weights; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_string_ex(arg2); - convert_to_long_ex(arg3); - query=Z_STRVAL_PP(arg2); - maxhits=Z_LVAL_PP(arg3); - if (maxhits < 0) maxhits=0x7FFFFFFF; - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getobjbyftqueryobj(ptr->socket, query, maxhits, &childObjRecs, &weights, &count))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - /* create return value and free all memory */ - if( 0 > make_return_objrec(&return_value, childObjRecs, count)) - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto array hw_getobjectbyftquerycoll(int link, int collid, string query, int maxhits) - Search for fulltext query in collection and return maxhits objids */ -PHP_FUNCTION(hw_getobjectbyftquerycoll) -{ - pval **arg1, **arg2, **arg3, **arg4; - int link, id, type, maxhits; - char *query; - int count, i; - hw_connection *ptr; - int *childIDs = NULL; - float *weights; - - if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - convert_to_string_ex(arg3); - convert_to_long_ex(arg4); - id=Z_LVAL_PP(arg2); - query=Z_STRVAL_PP(arg3); - maxhits=Z_LVAL_PP(arg4); - if (maxhits < 0) maxhits=0x7FFFFFFF; - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getobjbyftquerycoll(ptr->socket, id, query, maxhits, &childIDs, &weights, &count))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - array_init(return_value); - - for(i=0; i<count; i++) - add_index_long(return_value, i, childIDs[i]); - efree(childIDs); -} -/* }}} */ - -/* {{{ proto array hw_getobjectbyftquerycollobj(int link, int collid, string query, int maxhits) - Search for fulltext query in collection and return maxhits object records */ -PHP_FUNCTION(hw_getobjectbyftquerycollobj) -{ - pval **arg1, **arg2, **arg3, **arg4; - int link, id, type, maxhits; - char *query; - int count; - hw_connection *ptr; - char **childObjRecs = NULL; - float *weights; - - if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - convert_to_string_ex(arg3); - convert_to_long_ex(arg4); - id=Z_LVAL_PP(arg2); - query=Z_STRVAL_PP(arg3); - maxhits=Z_LVAL_PP(arg4); - if (maxhits < 0) maxhits=0x7FFFFFFF; - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getobjbyftquerycollobj(ptr->socket, id, query, maxhits, &childObjRecs, &weights, &count))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - /* create return value and free all memory */ - if( 0 > make_return_objrec(&return_value, childObjRecs, count)) - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto array hw_getchilddoccoll(int link, int objid) - Returns all children ids which are documents */ -PHP_FUNCTION(hw_getchilddoccoll) -{ - pval **arg1, **arg2; - int link, id, type; - int count, i; - int *childIDs = NULL; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - id=Z_LVAL_PP(arg2); - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getchilddoccoll(ptr->socket, id, &childIDs, &count))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - array_init(return_value); - - for(i=0; i<count; i++) - add_index_long(return_value, i, childIDs[i]); - efree(childIDs); -} -/* }}} */ - -/* {{{ proto array hw_getchilddoccollobj(int link, int objid) - Returns all children object records which are documents */ -PHP_FUNCTION(hw_getchilddoccollobj) -{ - pval **arg1, **arg2; - int link, id, type; - int count; - char **childObjRecs = NULL; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - id=Z_LVAL_PP(arg2); - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getchilddoccollobj(ptr->socket, id, &childObjRecs, &count))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - /* create return value and free all memory */ - if( 0 > make_return_objrec(&return_value, childObjRecs, count)) - RETURN_FALSE; - -} -/* }}} */ - -/* {{{ proto array hw_getanchors(int link, int objid) - Return all anchors of object */ -PHP_FUNCTION(hw_getanchors) -{ - pval **arg1, **arg2; - int link, id, type; - int count, i; - int *anchorIDs = NULL; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - id=Z_LVAL_PP(arg2); - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getanchors(ptr->socket, id, &anchorIDs, &count))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - array_init(return_value); - - for(i=0; i<count; i++) - add_index_long(return_value, i, anchorIDs[i]); - efree(anchorIDs); -} -/* }}} */ - -/* {{{ proto array hw_getanchorsobj(int link, int objid) - Return all object records of anchors of object */ -PHP_FUNCTION(hw_getanchorsobj) -{ - pval **arg1, **arg2; - int link, id, type; - int count; - char **anchorObjRecs = NULL; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - id=Z_LVAL_PP(arg2); - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getanchorsobj(ptr->socket, id, &anchorObjRecs, &count))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror); - RETURN_FALSE; - } - - /* create return value and free all memory */ - if( 0 > make_return_objrec(&return_value, anchorObjRecs, count)) - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto string hw_getusername(int link) - Returns the current user name */ -PHP_FUNCTION(hw_getusername) -{ - pval **arg1; - int link, type; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - - Z_STRVAL_P(return_value) = estrdup(ptr->username); - Z_STRLEN_P(return_value) = strlen(ptr->username); - Z_TYPE_P(return_value) = IS_STRING; -} -/* }}} */ - -/* {{{ proto void hw_identify(int link, string username, string password) - Identifies at Hyperwave server */ -PHP_FUNCTION(hw_identify) -{ - pval **arg1, **arg2, **arg3; - int link, type; - char *name, *passwd, *userdata; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_string_ex(arg2); - convert_to_string_ex(arg3); - name=Z_STRVAL_PP(arg2); - passwd=Z_STRVAL_PP(arg3); - - set_swap(ptr->swap_on); - { - char *str; - - if (0 != (ptr->lasterror = send_identify(ptr->socket, name, passwd, &userdata))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d\n", ptr->lasterror); - if(ptr->username) free(ptr->username); - ptr->username = NULL; - RETURN_FALSE; - } - - Z_STRVAL_P(return_value) = userdata; - Z_STRLEN_P(return_value) = strlen(userdata); - Z_TYPE_P(return_value) = IS_STRING; - if(ptr->username) free(ptr->username); - str = userdata; - while((*str != 0) && (*str != ' ')) - str++; - if(*str != '\0') - ptr->username = strdup(++str); - else - ptr->username = NULL; - } -} -/* }}} */ - -/* {{{ proto array hw_objrec2array(string objrec, [array format]) - Returns object array of object record */ -PHP_FUNCTION(hw_objrec2array) -{ - zval **arg1, **arg2; - - switch(ZEND_NUM_ARGS()) { - case 1: - if(zend_get_parameters_ex(1, &arg1) == FAILURE) - WRONG_PARAM_COUNT; - convert_to_string_ex(arg1); - make2_return_array_from_objrec(&return_value, Z_STRVAL_PP(arg1), NULL); - break; - case 2: - if(zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) - WRONG_PARAM_COUNT; - convert_to_array_ex(arg2); - convert_to_string_ex(arg1); - make2_return_array_from_objrec(&return_value, Z_STRVAL_PP(arg1), *arg2); - break; - default: - WRONG_PARAM_COUNT; - } -} -/* }}} */ - -/* {{{ proto string hw_array2objrec(array objarr) - Returns object record of object array */ -PHP_FUNCTION(hw_array2objrec) -{ - pval **arg1; - char *objrec, *retobj; - - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_array_ex(arg1); - objrec = make_objrec_from_array(Z_ARRVAL_PP(arg1), '='); - if(objrec) { - retobj = estrdup(objrec); - free(objrec); - RETURN_STRING(retobj, 0); - } else - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto array hw_incollections(int link, array objids, array collids, int para) - Returns object ids which are in collections */ -PHP_FUNCTION(hw_incollections) -{ - pval **arg1, **arg2, **arg3, **arg4; - int type, link, i; - hw_connection *ptr; - int cobjids, ccollids, *objectIDs, *collIDs, cretids, *retIDs, retcoll; - - if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_array_ex(arg2); - convert_to_array_ex(arg3); - convert_to_long_ex(arg4); - retcoll=Z_LVAL_PP(arg4); - - cobjids = zend_hash_num_elements(Z_ARRVAL_PP(arg2)); - if(NULL == (objectIDs = make_ints_from_array(Z_ARRVAL_PP(arg2)))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not create Int Array from Array"); - RETURN_FALSE; - } - - ccollids = zend_hash_num_elements(Z_ARRVAL_PP(arg3)); - if(NULL == (collIDs = make_ints_from_array(Z_ARRVAL_PP(arg3)))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not create Int Array from Array"); - efree(objectIDs); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_incollections(ptr->socket, retcoll, - cobjids, objectIDs, - ccollids, collIDs, - &cretids, &retIDs))) { - if(objectIDs) efree(objectIDs); - if(collIDs) efree(collIDs); - RETURN_FALSE; - } - - if(objectIDs) efree(objectIDs); - if(collIDs) efree(collIDs); - - array_init(return_value); - - for(i=0; i<cretids; i++) - add_index_long(return_value, i, retIDs[i]); - efree(retIDs); - -} -/* }}} */ - -/* {{{ proto void hw_inscoll(int link, int parentid, array objarr) - Inserts collection */ -PHP_FUNCTION(hw_inscoll) -{ - pval **arg1, **arg2, **arg3; - char *objrec; - int id, newid, type, link; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - convert_to_array_ex(arg3); - id=Z_LVAL_PP(arg2); - - if(NULL == (objrec = make_objrec_from_array(Z_ARRVAL_PP(arg3), '='))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not create Object Record from Array"); - RETURN_FALSE; - } - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_inscoll(ptr->socket, id, objrec, &newid))) { - if(objrec) free(objrec); - RETURN_FALSE; - } - - if(objrec) free(objrec); - RETURN_LONG(newid); -} -/* }}} */ - -/* {{{ proto void hw_insdoc(int link, int parentid, string objrec [, string text]) - Inserts document */ -PHP_FUNCTION(hw_insdoc) -{ - zval **argv[4]; - char *objrec, *text; - int id, newid, type, link, argc; - hw_connection *ptr; - - argc = ZEND_NUM_ARGS(); - if((argc < 3) || (argc > 4)) - WRONG_PARAM_COUNT; - - if (zend_get_parameters_array_ex(argc, argv) == FAILURE) - WRONG_PARAM_COUNT; - - HW_FETCH_LINK(argv[0]); - convert_to_long_ex(argv[1]); - convert_to_string_ex(argv[2]); - if(argc == 4) { - convert_to_string_ex(argv[3]); - text = Z_STRVAL_PP(argv[3]); - } else { - text = NULL; - } - id = Z_LVAL_PP(argv[1]); - - set_swap(ptr->swap_on); - objrec = Z_STRVAL_PP(argv[2]); - if (0 != (ptr->lasterror = send_insdoc(ptr->socket, id, objrec, text, &newid))) { - RETURN_FALSE; - } - - RETURN_LONG(newid); -} -/* }}} */ - -/* {{{ proto int hw_getsrcbydestobj(int link, int destid) - Returns object id of source docuent by destination anchor */ -PHP_FUNCTION(hw_getsrcbydestobj) -{ - pval **arg1, **arg2; - int link, type, id; - int count; - char **childObjRecs = NULL; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - id=Z_LVAL_PP(arg2); - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_getsrcbydest(ptr->socket, id, &childObjRecs, &count))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d", ptr->lasterror); - RETURN_FALSE; - } - - /* create return value and free all memory */ - if( 0 > make_return_objrec(&return_value, childObjRecs, count)) - RETURN_FALSE; -} -/* }}} */ - -/* {{{ proto int hw_mapid(int link, int serverid, int destid) - Returns virtual object id of document on remote Hyperwave server */ -PHP_FUNCTION(hw_mapid) -{ - pval **arg1, **arg2, **arg3; - int link, type, servid, id, virtid; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - convert_to_long_ex(arg3); - servid=Z_LVAL_PP(arg2); - id=Z_LVAL_PP(arg3); - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = send_mapid(ptr->socket, servid, id, &virtid))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d", ptr->lasterror); - RETURN_FALSE; - } - RETURN_LONG(virtid); -} -/* }}} */ - -/* {{{ proto string hw_getrellink(int link, int rootid, int sourceid, int destid) - Get link from source to dest relative to rootid */ -PHP_FUNCTION(hw_getrellink) -{ - pval **arg1, **arg2, **arg3, **arg4; - int link, type; - int rootid, destid, sourceid; - char *anchorstr; - hw_connection *ptr; - - if (ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - convert_to_long_ex(arg2); - convert_to_long_ex(arg3); - convert_to_long_ex(arg4); - rootid=Z_LVAL_PP(arg2); - sourceid=Z_LVAL_PP(arg3); - destid=Z_LVAL_PP(arg4); - - set_swap(ptr->swap_on); - if (0 != (ptr->lasterror = getrellink(ptr->socket, rootid, sourceid, destid, &anchorstr))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d", ptr->lasterror); - RETURN_FALSE; - } - - RETURN_STRING(anchorstr, 0); -} -/* }}} */ - -/* {{{ proto string hw_insertanchors(int hwdoc, array anchorecs, array dest [, array urlprefixes]) - Inserts only anchors into text */ -PHP_FUNCTION(hw_insertanchors) -{ - pval **arg1, **arg2, **arg3, **arg4; - hw_document *hwdoc; - int type, docid, error, argc, count; - char **anchorrecs; - char **dest; - char **urlprefix; - char *bodytag = NULL; - HashTable *arrht; - HashTable *prefixarray; - - argc = ZEND_NUM_ARGS(); - switch(argc) - { - case 3: - if (zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) - WRONG_PARAM_COUNT; - break; - case 4: - if (zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) - WRONG_PARAM_COUNT; - break; - default: - WRONG_PARAM_COUNT; - } - - convert_to_long_ex(arg1); - convert_to_array_ex(arg2); - convert_to_array_ex(arg3); - docid=Z_LVAL_PP(arg1); - hwdoc = zend_list_find(docid, &type); - if(!hwdoc || (type!=le_document)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to find file identifier %d", docid); - RETURN_FALSE; - } - - /* check for the array with urlprefixes */ - if(argc == 4) { - int i; - convert_to_array_ex(arg4); - prefixarray =Z_ARRVAL_PP(arg4); - if((prefixarray == NULL) || (zend_hash_num_elements(prefixarray) != 5)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "You must provide 5 urlprefixes (you have provided %d)", zend_hash_num_elements(prefixarray)); - RETURN_FALSE; - } - - urlprefix = emalloc(5*sizeof(char *)); - zend_hash_internal_pointer_reset(prefixarray); - for(i=0; i<5; i++) { - char *key; - zval *data, **dataptr; - ulong ind; - - zend_hash_get_current_key(prefixarray, &key, &ind, 0); - zend_hash_get_current_data(prefixarray, (void *) &dataptr); - data = *dataptr; - if (Z_TYPE_P(data) != IS_STRING) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s must be a String", key); - RETURN_FALSE; - } else if ( strcmp(key, "HW_DEFAULT_LINK") == 0 ) { - urlprefix[HW_DEFAULT_LINK] = Z_STRVAL_P(data); - } else if ( strcmp(key, "HW_IMAGE_LINK") == 0 ) { - urlprefix[HW_IMAGE_LINK] = Z_STRVAL_P(data); - } else if ( strcmp(key, "HW_BACKGROUND_LINK") == 0 ) { - urlprefix[HW_BACKGROUND_LINK] = Z_STRVAL_P(data); - } else if ( strcmp(key, "HW_INTAG_LINK") == 0 ) { - urlprefix[HW_INTAG_LINK] = Z_STRVAL_P(data); - } else if ( strcmp(key, "HW_APPLET_LINK") == 0 ) { - urlprefix[HW_APPLET_LINK] = Z_STRVAL_P(data); - } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s is not a valid urlprefix", key); - RETURN_FALSE; - } - zend_hash_move_forward(prefixarray); - } - } else { - urlprefix = NULL; - } - - if(zend_hash_num_elements(Z_ARRVAL_PP(arg2)) != zend_hash_num_elements(Z_ARRVAL_PP(arg3))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unequal number of elements in arrays"); - RETURN_FALSE; - } - - /* Turn PHP-Array of strings into C-Array of strings */ - arrht = Z_ARRVAL_PP(arg2); - anchorrecs = make_strs_from_array(arrht); - arrht = Z_ARRVAL_PP(arg3); - dest = make_strs_from_array(arrht); - - if (0 != (error = send_insertanchors(&(hwdoc->data), &count, anchorrecs, dest, zend_hash_num_elements(arrht), urlprefix, &bodytag))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Command returned %d", error); - RETURN_FALSE; - } -/*fprintf(stderr, "in hw_insertanchors: %s\n", hwdoc->attributes); */ - hwdoc->size = count; - if(hwdoc->bodytag) free (hwdoc->bodytag); - hwdoc->bodytag = bodytag; - - RETURN_TRUE; -} -/* }}} */ - - -PHP_MINFO_FUNCTION(hw) -{ - php_info_print_table_start(); - php_info_print_table_row(2, "Hyperwave Support", "enabled"); - php_info_print_table_row(2, "HG-CSP Version", "7.17"); - php_info_print_table_end(); - DISPLAY_INI_ENTRIES(); -} - -/* {{{ proto void hw_connection_info(int link) - Prints information about the connection to Hyperwave server */ -PHP_FUNCTION(hw_connection_info) -{ - pval **arg1; - hw_connection *ptr; - int link, type; - - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { - WRONG_PARAM_COUNT; - } - HW_FETCH_LINK(arg1); - - php_printf("Hyperwave Info:\nhost=%s,\nserver string=%s\nversion=%d\nswap=%d\n", ptr->hostname, ptr->server_string, ptr->version, ptr->swap_on); -} -/* }}} */ - -void print_msg(hg_msg *msg, char *str, int txt) -{ - char *ptr; - int i; - - fprintf(stdout, "\nprint_msg: >>%s<<\n", str); - fprintf(stdout, "print_msg: length = %d\n", msg->length); - fprintf(stdout, "print_msg: msgid = %d\n", msg->version_msgid); - fprintf(stdout, "print_msg: msg_type = %d\n", msg->msg_type); - if ( msg->length > HEADER_LENGTH ) { - ptr = msg->buf; - for ( i = 0; i < msg->length-HEADER_LENGTH; i++ ) { - if ( *ptr == '\n' ) - fprintf(stdout, "%c", *ptr++); - else if ( iscntrl(*ptr) ) - {fprintf(stdout, "."); ptr++;} - else - fprintf(stdout, "%c", *ptr++); - } - } - fprintf(stdout, "\n\n"); -} - -#endif - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - * vim600: sw=4 ts=4 fdm=marker - * vim<600: sw=4 ts=4 - */ diff --git a/ext/hyperwave/hw_error.h b/ext/hyperwave/hw_error.h deleted file mode 100644 index 41a9831084..0000000000 --- a/ext/hyperwave/hw_error.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP Version 4 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2003 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 2.02 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.php.net/license/2_02.txt. | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Rasmus Lerdorf <rasmus@php.net> | - +----------------------------------------------------------------------+ -*/ - -/* $Id$ */ - -#ifndef HW_ERROR_H -#define HW_ERROR_H - -#if HYPERWAVE - -#define NOACCESS 1 /* Access denied */ -#define NODOCS 2 /* No documents */ -#define NONAME 3 /* No collection name */ -#define NODOC 4 /* Object is not a document */ -#define NOOBJ 5 /* No object received */ -#define NOCOLLS 6 /* No collections received */ -#define DBSTUBNG 7 /* Connection to low-level database failed */ -#define NOTFOUND 8 /* Object not found */ -#define EXIST 9 /* Collection already exists */ -#define FATHERDEL 10 /* parent collection disappeared */ -#define FATHNOCOLL 11 /* parent collection not a collection */ -#define NOTEMPTY 12 /* Collection not empty */ -#define DESTNOCOLL 13 /* Destination not a collection */ -#define SRCEQDEST 14 /* Source equals destination */ -#define REQPEND 15 /* Request pending */ -#define TIMEOUT 16 /* Timeout */ -#define NAMENOTUNIQUE 17 /* Name not unique */ -#define WRITESTOPPED 18 /* Database now read-only; try again later */ -#define LOCKED 19 /* Object locked; try again later */ -#define CHANGEBASEFLD 20 /* Change of base-attribute */ -#define NOTREMOVED 21 /* Attribute not removed */ -#define FLDEXISTS 22 /* Attribute exists */ -#define CMDSYNTAX 23 /* Syntax error in command */ -#define NOLANGUAGE 24 /* No or unknown language specified */ -#define WRGTYPE 25 /* Wrong type in object */ -#define WRGVERSION 26 /* Client version too old */ -#define CONNECTION 27 /* No connection to other server */ -#define SYNC 28 /* Synchronization error */ -#define NOPATH 29 /* No path entry */ -#define WRGPATH 30 /* Wrong path entry */ -#define PASSWD 31 /* Wrong password (server-to-server server authentication) */ -#define LC_NO_MORE_USERS 32 /* No more users for license */ -#define LC_NO_MORE_DOCS 33 /* No more documents for this session and license */ -#define RSERV_NRESP 34 /* Remote server not responding */ -#define Q_OVERFLOW 35 /* Query overflow */ -#define USR_BREAK 36 /* Break by user */ -#define N_IMPL 37 /* Not implemented */ -#define WRG_VALUE 38 /* Wrong value */ -#define INSUFF_FUNDS 39 /* Insufficient funds */ -#define REORG 40 /* Reorganization in progress */ -#define USER_LIMIT 41 /* Limit of simultaneous users reached */ -#define FTCONNECT 513 /* No connection to fulltext server */ -#define FTTIMEOUT 514 /* Connection timed out */ -#define FTINDEX 515 /* Something wrong with fulltext index */ -#define FTSYNTAX 516 /* Query syntax error */ -#define REQUESTPENDING 1025 /* Request pending */ -#define NOCONNECTION 1026 /* No connection to document server */ -#define WRONGVERSION 1027 /* Wrong protocol version */ -#define NOTINITIALIZED 1028 /* Not initialized */ -#define BADREQUEST 1029 /* Bad request */ -#define BADLRN 1030 /* Bad document number */ -#define OPENSTORE_WRITE 1031 /* Cannot write to local store */ -#define OPENSTORE_READ 1032 /* Cannot read from local store */ -#define READSTORE 1033 /* Store read error */ -#define WRITESTORE 1034 /* Write error */ -#define CLOSESTORE 1035 /* Close error */ -#define BADPATH 1036 /* Bad path */ -#define NOPATHDC 1037 /* No path */ -#define OPENFILE 1038 /* Cannot open file */ -#define READFILE 1039 /* Cannot read from file // same */ -#define WRITEFILE 1040 /* Cannot write to file */ -#define CONNECTCLIENT 1041 /* Could not connect to client */ -#define ACCEPT 1042 /* Could not accept connection */ -#define READSOCKET 1043 /* Could not read from socket */ -#define WRITESOCKET 1044 /* Could not write to socket */ -#define TOOMUCHDATA 1046 /* Received too much data */ -#define TOOFEWDATA 1047 /* Received too few data // ... */ -#define NOTIMPLEMENTED 1049 /* Not implemented */ -#define USERBREAK 1050 /* User break */ -#define INTERNAL 1051 /* Internal error */ -#define INVALIDOBJECT 1052 /* Invalid object */ -#define JOBTIMEOUT 1053 /* Job timed out */ -#define OPENPORT 1054 /* Cannot open port // ... for several resons */ -#define NODATA 1055 /* Received no data */ -#define NOPORT 1056 /* No port to handle this request */ -#define NOTCACHED 1057 /* Document not cached */ -#define BADCACHETYPE 1058 /* Bad cache type */ -#define OPENCACHE_WRITE 1059 /* Cannot write to cache */ -#define OPENCACHE_READ 1060 /* Cannot read from cache // same */ -#define NOSOURCE 1061 /* Do not know what to read */ -#define CLOSECACHE 1062 /* Could not insert into cache */ -#define CONNECTREMOTE 1063 /* Could not connect to remote server */ -#define LOCKREFUSED 1064 /* Lock refused // could not lock the stores */ - -#endif -#endif diff --git a/ext/hyperwave/hyperwave.dsp b/ext/hyperwave/hyperwave.dsp deleted file mode 100644 index 1ca7e52439..0000000000 --- a/ext/hyperwave/hyperwave.dsp +++ /dev/null @@ -1,120 +0,0 @@ -# Microsoft Developer Studio Project File - Name="hyperwave" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=hyperwave - Win32 Debug_TS
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "hyperwave.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "hyperwave.mak" CFG="hyperwave - Win32 Debug_TS"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "hyperwave - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "hyperwave - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "hyperwave - Win32 Release_TS"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release_TS"
-# PROP BASE Intermediate_Dir "Release_TS"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release_TS"
-# PROP Intermediate_Dir "Release_TS"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "HYPERWAVE_EXPORTS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D "WIN32" /D "PHP_EXPORTS" /D "COMPILE_DL_HYPERWAVE" /D ZTS=1 /D HYPERWAVE=1 /D ZEND_DEBUG=0 /D "NDEBUG" /D "_WINDOWS" /D "ZEND_WIN32" /D "PHP_WIN32" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD BASE RSC /l 0x407 /d "NDEBUG"
-# ADD RSC /l 0x407 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
-# ADD LINK32 php4ts.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /dll /machine:I386 /out:"..\..\Release_TS/php_hyperwave.dll" /libpath:"..\..\Release_TS" /libpath:"..\..\Release_TS_Inline"
-
-!ELSEIF "$(CFG)" == "hyperwave - Win32 Debug_TS"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug_TS"
-# PROP BASE Intermediate_Dir "Debug_TS"
-# PROP BASE Ignore_Export_Lib 0
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug_TS"
-# PROP Intermediate_Dir "Debug_TS"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "HYPERWAVE_EXPORTS" /YX /FD /GZ /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D ZEND_DEBUG=1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "PHP_EXPORTS" /D "COMPILE_DL_HYPERWAVE" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HYPERWAVE=1 /YX /FD /GZ /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-# ADD BASE RSC /l 0x407 /d "_DEBUG"
-# ADD RSC /l 0x407 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 php4ts_debug.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /dll /debug /machine:I386 /out:"..\..\Debug_TS/php_hyperwave.dll" /pdbtype:sept /libpath:"..\..\Debug_TS"
-
-!ENDIF
-
-# Begin Target
-
-# Name "hyperwave - Win32 Release_TS"
-# Name "hyperwave - Win32 Debug_TS"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=.\hg_comm.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\hw.c
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Source File
-
-SOURCE=.\hg_comm.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\hw_error.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\php_hyperwave.h
-# End Source File
-# End Group
-# End Target
-# End Project
diff --git a/ext/hyperwave/php_hyperwave.h b/ext/hyperwave/php_hyperwave.h deleted file mode 100644 index 04602635bc..0000000000 --- a/ext/hyperwave/php_hyperwave.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP Version 4 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2003 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 2.02 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.php.net/license/2_02.txt. | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: Rasmus Lerdorf <rasmus@php.net> | - +----------------------------------------------------------------------+ -*/ - -/* $Id$ */ - -#ifndef PHP_HYPERWAVE_H -#define PHP_HYPERWAVE_H - -#ifdef PHP_WIN32 -#define PHP_HW_API __declspec(dllexport) -#else -#define PHP_HW_API -#endif - -#if HYPERWAVE -#ifndef DLEXPORT -#define DLEXPORT -#endif - -#ifdef ZTS -#include "TSRM.h" -#endif - -#include "hg_comm.h" - -extern zend_module_entry hw_module_entry; -#define hw_module_ptr &hw_module_entry - -typedef struct { - long default_link; - long default_port; - long num_links,num_persistent; - long max_links,max_persistent; - long allow_persistent; -} zend_hw_globals; - -#ifdef ZTS -# define HwSG(v) TSRMG(hw_globals_id, zend_hw_globals *, v) -#else -# define HwSG(v) (hw_globals.v) -extern PHP_HW_API zend_hw_globals hw_globals; -#endif - -/*extern hw_module php_hw_module;*/ - -typedef struct { - int size; - char *data; - char *attributes; - char *bodytag; -} hw_document; - -PHP_MINIT_FUNCTION(hw); -PHP_MSHUTDOWN_FUNCTION(hw); -PHP_MINFO_FUNCTION(hw); - -PHP_FUNCTION(hw_connect); -PHP_FUNCTION(hw_pconnect); -PHP_FUNCTION(hw_close); -PHP_FUNCTION(hw_root); -PHP_FUNCTION(hw_info); -PHP_FUNCTION(hw_error); -PHP_FUNCTION(hw_errormsg); -PHP_FUNCTION(hw_mv); -PHP_FUNCTION(hw_cp); -PHP_FUNCTION(hw_deleteobject); -PHP_FUNCTION(hw_changeobject); -PHP_FUNCTION(hw_modifyobject); -PHP_FUNCTION(hw_getparents); -PHP_FUNCTION(hw_getparentsobj); -PHP_FUNCTION(hw_children); -PHP_FUNCTION(hw_childrenobj); -PHP_FUNCTION(hw_getchildcoll); -PHP_FUNCTION(hw_getchildcollobj); -PHP_FUNCTION(hw_getobject); -PHP_FUNCTION(hw_getandlock); -PHP_FUNCTION(hw_unlock); -PHP_FUNCTION(hw_gettext); -PHP_FUNCTION(hw_edittext); -PHP_FUNCTION(hw_getcgi); -PHP_FUNCTION(hw_getremote); -PHP_FUNCTION(hw_getremotechildren); -PHP_FUNCTION(hw_pipedocument); -PHP_FUNCTION(hw_pipecgi); -PHP_FUNCTION(hw_insertdocument); -PHP_FUNCTION(hw_docbyanchorobj); -PHP_FUNCTION(hw_docbyanchor); -PHP_FUNCTION(hw_getobjectbyquery); -PHP_FUNCTION(hw_getobjectbyqueryobj); -PHP_FUNCTION(hw_getobjectbyquerycoll); -PHP_FUNCTION(hw_getobjectbyquerycollobj); -PHP_FUNCTION(hw_getobjectbyftquery); -PHP_FUNCTION(hw_getobjectbyftqueryobj); -PHP_FUNCTION(hw_getobjectbyftquerycoll); -PHP_FUNCTION(hw_getobjectbyftquerycollobj); -PHP_FUNCTION(hw_getchilddoccoll); -PHP_FUNCTION(hw_getchilddoccollobj); -PHP_FUNCTION(hw_getanchors); -PHP_FUNCTION(hw_getanchorsobj); -PHP_FUNCTION(hw_getusername); -PHP_FUNCTION(hw_setlinkroot); -PHP_FUNCTION(hw_inscoll); -PHP_FUNCTION(hw_incollections); -PHP_FUNCTION(hw_insertobject); -PHP_FUNCTION(hw_insdoc); -PHP_FUNCTION(hw_identify); -PHP_FUNCTION(hw_free_document); -PHP_FUNCTION(hw_new_document); -PHP_FUNCTION(hw_new_document_from_file); -PHP_FUNCTION(hw_output_document); -PHP_FUNCTION(hw_document_size); -PHP_FUNCTION(hw_document_attributes); -PHP_FUNCTION(hw_document_bodytag); -PHP_FUNCTION(hw_document_content); -PHP_FUNCTION(hw_document_setcontent); -PHP_FUNCTION(hw_objrec2array); -PHP_FUNCTION(hw_array2objrec); -PHP_FUNCTION(hw_connection_info); -PHP_FUNCTION(hw_getsrcbydestobj); -PHP_FUNCTION(hw_insertanchors); -PHP_FUNCTION(hw_getrellink); -PHP_FUNCTION(hw_dummy); -PHP_FUNCTION(hw_who); -PHP_FUNCTION(hw_stat); -PHP_FUNCTION(hw_mapid); - -#else -#define hw_module_ptr NULL -#endif /* HYPERWAVE */ -#define phpext_hyperwave_ptr hw_module_ptr -#endif /* PHP_HYPERWAVE_H */ - |