hg_comm.c
来自「php-4.4.7学习linux时下载的源代码」· C语言 代码 · 共 2,460 行 · 第 1/5 页
C
2,460 行
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)-size
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?