⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netbuf.c

📁 这是Linux环境下的openobex
💻 C
字号:
/********************************************************************* *                 * Filename:      netbuf.c * Version:       0.9 * Description:   Network buffer handling routines.  * Status:        Experimental. * Author:        Dag Brattli <dagb@cs.uit.no> * Created at:    Fri Mar 19 09:07:21 1999 * Modified at:   Sat Oct 16 14:53:39 1999 * Modified by:   Dag Brattli <dagb@cs.uit.no> * Sources:       skbuff.c by  Alan Cox <iiitac@pyr.swan.ac.uk> and *                             Florian La Roche <rzsfl@rz.uni-sb.de> *  *     Copyright (c) 1999 Dag Brattli, All Rights Reserved. *      *     This program is free software; you can redistribute it and/or  *     modify it under the terms of the GNU General Public License as  *     published by the Free Software Foundation; either version 2 of  *     the License, or (at your option) any later version. *  *     This program is distributed in the hope that it will be useful, *     but WITHOUT ANY WARRANTY; without even the implied warranty of *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *     GNU General Public License for more details. *  *     You should have received a copy of the GNU General Public License  *     along with this program; if not, write to the Free Software  *     Foundation, Inc., 59 Temple Place, Suite 330, Boston,  *     MA 02111-1307 USA *      ********************************************************************/#ifdef HAVE_CONFIG_H#include <config.h>#endif#include <stdlib.h>#include <stdio.h>#include <string.h>#ifdef OBEX_SYSLOG#include <syslog.h>#endif#include <netbuf.h>/* * Function msg_recycle (msg) * *    Reuse an already used message. We just reset the state * */GNetBuf *g_netbuf_recycle(GNetBuf *msg){	msg->data = msg->head;	msg->tail = msg->head;	msg->len = 0;	msg->end = msg->head + msg->truesize;	return msg;}/* * Function g_netbuf_new (len) * *    Allocate new network buffer * */GNetBuf *g_netbuf_new(unsigned int len){	GNetBuf *msg;	uint8_t *buf;		msg = malloc(sizeof(GNetBuf));	if (msg == NULL)		return NULL;	memset(msg, 0, sizeof(GNetBuf));		buf = malloc(len);	if (buf == NULL) {		free(msg);		return NULL;	}		/* Init */	msg->truesize = len;	msg->head = buf;		g_netbuf_recycle(msg);		return msg;}/* * Function g_netbuf_realloc (msg, len) * *    Change the true size of the message * */GNetBuf *g_netbuf_realloc(GNetBuf *msg, unsigned int len){	uint8_t *buf;/* 	DEBUG(4, "msg->head=%p\n", msg->head); *//* 	DEBUG(4, "msg->data=%p\n", msg->data); *//* 	DEBUG(4, "msg->tail=%p\n", msg->tail); *//* 	DEBUG(4, "msg->len=%d\n", msg->len); *//* 	DEBUG(4, "msg->truesize=%d\n\n", msg->truesize); */	buf = realloc(msg->head, len);	if (buf == NULL)		return NULL;	msg->truesize = len;	msg->data = buf + (msg->data - msg->head);		msg->tail = buf + (msg->tail - msg->head);	msg->head = buf;	msg->end = msg->head + len;/* 	DEBUG(4, "msg->head=%p\n", msg->head); *//* 	DEBUG(4, "msg->data=%p\n", msg->data); *//* 	DEBUG(4, "msg->tail=%p\n", msg->tail); *//* 	DEBUG(4, "msg->len=%d\n", msg->len); *//* 	DEBUG(4, "msg->truesize=%d\n", msg->truesize); */	return msg;}/* * Function g_netbuf_free (msg) * *    Free message * */void g_netbuf_free(GNetBuf *msg){	if (!msg)		return;	if (msg->head)		free(msg->head);	free(msg);}/* * Function g_netbuf_put (msg, len) * *    Make space for more data into message * */uint8_t *g_netbuf_put(GNetBuf *msg, unsigned int len){        uint8_t *tmp = msg->tail;        	msg->tail += len;        msg->len += len;	        if (msg->tail > msg->end) {		//DEBUG(4, "put over, trying to realloc ...!\n");				msg = g_netbuf_realloc(msg, msg->truesize+len);		if (!msg)			return NULL;		tmp = msg->tail - len;        }        return tmp;}uint8_t *g_netbuf_put_data(GNetBuf *msg, uint8_t *data, unsigned int len){	uint8_t *tmp;	/* Make room for more data */	tmp = g_netbuf_put(msg, len);	/* Copy body data to object */	memcpy(tmp, data, len);	return tmp;}/* * Function g_netbuf_push (buf, len) * *    Insert new header in front of data * */uint8_t *g_netbuf_push(GNetBuf *msg, unsigned int len){	if ((msg->data - len) < msg->head) {		//DEBUG(4, "pushed under, trying to realloc!\n");		msg = g_netbuf_realloc(msg, msg->truesize+len);		if (!msg)			return NULL;				/* Move data with offset len */		memmove(msg->data+len, msg->data, msg->len);		msg->data = msg->data+len;		msg->tail = msg->tail+len;	}	msg->data -= len;	msg->len += len;	return msg->data;}/* * Function g_netbuf_prepend_hdr (msg, hdr, len) * *     * */uint8_t *g_netbuf_prepend_hdr(GNetBuf *msg, uint8_t *hdr, unsigned int len){	uint8_t *tmp;		/* Make room for header */	tmp = g_netbuf_push(msg, len);	/* Copy body data to object */	memcpy(tmp, hdr, len);	return tmp;}/* * Function g_netbuf_pull (msg, len) * *    Remove header or data in front of the message * */uint8_t *g_netbuf_pull(GNetBuf *msg, unsigned int len){	if (len > msg->len)                return NULL;		msg->len -= len;        return msg->data += len;}/* * Function g_netbuf_reserve (msg, len) * *    Reserve space in front of message for headers or data * */void g_netbuf_reserve(GNetBuf *msg, unsigned int len){        msg->data+=len;        msg->tail+=len;}/* * Function msg_headroom (msg) * *    Returns the number of bytes available for inserting headers or data *    in front of the message. */int g_netbuf_headroom(GNetBuf *msg){	return msg->data - msg->head;}/* * Function g_netbuf_tailroom (msg) * *    Returns the number of bytes available for inserting more data into the *    message */int g_netbuf_tailroom(GNetBuf *msg){	return msg->end - msg->tail;}/* * Function g_netbuf_trim (msg, len) * *    Set the length of the message * */void g_netbuf_trim(GNetBuf *msg, unsigned int len){	if (msg->len > len) {		msg->len = len;		msg->tail = msg->data+len;        }}void g_netbuf_print(const char *label, GNetBuf *msg){	int 	i;	int	j = -1;	char	buf[81];	for (i = 0; i < msg->len; i++) {		j = (i % 16) * 3;		sprintf(&(buf[j]), "%02x ", msg->data[i]);		if((j == (15 * 3)) || (i == (msg->len - 1))) {#ifdef OBEX_SYSLOG			syslog(LOG_DEBUG, "OpenObex: %s: %s\n", label, buf);#else			fprintf(stderr, "%s: %s\n", label, buf);#endif		}	}}/* slist_t */slist_t *slist_append(slist_t *list, void *data){	slist_t	*entry, *prev;	entry = (slist_t*)malloc(sizeof(slist_t));	if (!entry)		return NULL;	entry->data = data;	entry->next = NULL;		if (!list)		return entry;		for (prev = list; prev->next; prev = prev->next) ;		prev->next = entry;	return list;}slist_t *slist_remove(slist_t *list, void *data){	slist_t	*entry, *prev;	for (prev = NULL, entry = list; entry; prev = entry, entry = entry->next) {		if (entry->data == data) {			if (prev)				prev->next = entry->next;			else				list = entry->next;			free(entry);			break;		}	}	return list;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -