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

📄 irpmarshall.c

📁 bind 9.3结合mysql数据库
💻 C
📖 第 1 页 / 共 3 页
字号:
		return (-1);	}	if (*buffer == NULL) {		need += 2;		/* for CRLF */		*buffer = memget(need);		if (*buffer == NULL) {			errno = ENOMEM;			return (-1);		}		*len = need;	}	strcpy(*buffer, pr->p_name);		strcat(*buffer, fieldsep);	joinarray(pr->p_aliases, *buffer, COMMA); strcat(*buffer, fieldsep);	strcat(*buffer, prProto);		strcat(*buffer, fieldsep);	return (0);}/* * int irp_unmarshall_pr(struct protoent *pr, char *buffer) * * notes: * *	See above * * return: * *	0 on success, -1 on failure * */int irp_unmarshall_pr(struct protoent *pr, char *buffer) {	char *p, *q;	int prproto;	long t;	char *name = NULL;	char **aliases = NULL;	char tmpbuf[24];	char *tb;	char fieldsep = ':';	int myerrno = EINVAL;	if (pr == NULL || buffer == NULL) {		errno = EINVAL;		return (-1);	}	p = buffer;	/* p_name field */	name = NULL;	if (getfield(&name, 0, &p, fieldsep) == NULL || strlen(name) == 0U) {		goto error;	}	/* p_aliases field */	q = strchr(p, fieldsep);	if (q == NULL) {		goto error;	}	aliases = splitarray(p, q, COMMA);	if (aliases == NULL) {		myerrno = errno;		goto error;	}	p = q + 1;	/* p_proto field */	tb = tmpbuf;	if (getfield(&tb, sizeof tmpbuf, &p, fieldsep) == NULL ||	    strlen(tb) == 0U) {		goto error;	}	t = strtol(tmpbuf, &tb, 10);	if (*tb) {		goto error;	/* junk in value */	}	prproto = (int)t;	if ((long) prproto != t) {	/* value must have been too big. */		goto error;	}	pr->p_name = name;	pr->p_aliases = aliases;	pr->p_proto = prproto;	return (0); error:	errno = myerrno;	if (name != NULL) free(name);	free_array(aliases, 0);	return (-1);}/* ------------------------- struct protoent ------------------------- *//* +++++++++++++++++++++++++ struct hostent +++++++++++++++++++++++++ *//* * int irp_marshall_ho(struct hostent *ho, char **buffer, size_t *len) * * notes: * *	see above. * * return: * *	0 on success, -1 on failure. * */intirp_marshall_ho(struct hostent *ho, char **buffer, size_t *len) {	size_t need = 1;	/* for null byte */	char hoaddrtype[24];	char holength[24];	char **av;	char *p;	int addrlen;	int malloced = 0;	size_t remlen;	const char *fieldsep = "@";	if (ho == NULL || len == NULL) {		errno = EINVAL;		return (-1);	}	switch(ho->h_addrtype) {	case AF_INET:		strcpy(hoaddrtype, "AF_INET");		break;	case AF_INET6:		strcpy(hoaddrtype, "AF_INET6");		break;	default:		errno = EINVAL;		return (-1);	}	sprintf(holength, "%d", ho->h_length);	need += strlen(ho->h_name) + 1;	need += joinlength(ho->h_aliases) + 1;	need += strlen(hoaddrtype) + 1;	need += strlen(holength) + 1;	/* we determine an upper bound on the string length needed, not an	   exact length. */	addrlen = (ho->h_addrtype == AF_INET ? 16 : 46) ; /* XX other AF's?? */	for (av = ho->h_addr_list; av != NULL && *av != NULL ; av++)		need += addrlen;	if (buffer == NULL) {		*len = need;		return (0);	}	if (*buffer != NULL && need > *len) {		errno = EINVAL;		return (-1);	}	if (*buffer == NULL) {		need += 2;		/* for CRLF */		*buffer = memget(need);		if (*buffer == NULL) {			errno = ENOMEM;			return (-1);		}		*len = need;		malloced = 1;	}	strcpy(*buffer, ho->h_name);		strcat(*buffer, fieldsep);	joinarray(ho->h_aliases, *buffer, COMMA); strcat(*buffer, fieldsep);	strcat(*buffer, hoaddrtype);		strcat(*buffer, fieldsep);	strcat(*buffer, holength);		strcat(*buffer, fieldsep);	p = *buffer + strlen(*buffer);	remlen = need - strlen(*buffer);	for (av = ho->h_addr_list ; av != NULL && *av != NULL ; av++) {		if (inet_ntop(ho->h_addrtype, *av, p, remlen) == NULL) {			goto error;		}		if (*(av + 1) != NULL)			strcat(p, COMMASTR);		remlen -= strlen(p);		p += strlen(p);	}	strcat(*buffer, fieldsep);	return (0); error:	if (malloced) {		memput(*buffer, need);	}	return (-1);}/* * int irp_unmarshall_ho(struct hostent *ho, char *buffer) * * notes: * *	See above. * * return: * *	0 on success, -1 on failure. * */intirp_unmarshall_ho(struct hostent *ho, char *buffer) {	char *p, *q, *r;	int hoaddrtype;	int holength;	long t;	char *name = NULL;	char **aliases = NULL;	char **hohaddrlist = NULL;	size_t hoaddrsize;	char tmpbuf[24];	char *tb;	char **alist;	int addrcount;	char fieldsep = '@';	int myerrno = EINVAL;	if (ho == NULL || buffer == NULL) {		errno = EINVAL;		return (-1);	}	p = buffer;	/* h_name field */	name = NULL;	if (getfield(&name, 0, &p, fieldsep) == NULL || strlen(name) == 0U) {		goto error;	}	/* h_aliases field */	q = strchr(p, fieldsep);	if (q == NULL) {		goto error;	}	aliases = splitarray(p, q, COMMA);	if (aliases == NULL) {		myerrno = errno;		goto error;	}	p = q + 1;	/* h_addrtype field */	tb = tmpbuf;	if (getfield(&tb, sizeof tmpbuf, &p, fieldsep) == NULL ||	    strlen(tb) == 0U) {		goto error;	}	if (strcmp(tmpbuf, "AF_INET") == 0)		hoaddrtype = AF_INET;	else if (strcmp(tmpbuf, "AF_INET6") == 0)		hoaddrtype = AF_INET6;	else		goto error;	/* h_length field */	tb = tmpbuf;	if (getfield(&tb, sizeof tmpbuf, &p, fieldsep) == NULL ||	    strlen(tb) == 0U) {		goto error;	}	t = strtol(tmpbuf, &tb, 10);	if (*tb) {		goto error;	/* junk in value */	}	holength = (int)t;	if ((long) holength != t) {	/* value must have been too big. */		goto error;	}	/* h_addr_list field */	q = strchr(p, fieldsep);	if (q == NULL)		goto error;	/* count how many addresss are in there */	if (q > p + 1) {		for (addrcount = 1, r = p ; r != q ; r++) {			if (*r == COMMA)				addrcount++;		}	} else {		addrcount = 0;	}	hoaddrsize = (addrcount + 1) * sizeof (char *);	hohaddrlist = malloc(hoaddrsize);	if (hohaddrlist == NULL) {		myerrno = ENOMEM;		goto error;	}	memset(hohaddrlist, 0x0, hoaddrsize);	alist = hohaddrlist;	for (t = 0, r = p ; r != q ; p = r + 1, t++) {		char saved;		while (r != q && *r != COMMA) r++;		saved = *r;		*r = 0x0;		alist[t] = malloc(hoaddrtype == AF_INET ? 4 : 16);		if (alist[t] == NULL) {			myerrno = ENOMEM;			goto error;		}		if (inet_pton(hoaddrtype, p, alist[t]) == -1)			goto error;		*r = saved;	}	alist[t] = NULL;	ho->h_name = name;	ho->h_aliases = aliases;	ho->h_addrtype = hoaddrtype;	ho->h_length = holength;	ho->h_addr_list = hohaddrlist;	return (0); error:	errno = myerrno;	if (name != NULL) free(name);	free_array(aliases, 0);	return (-1);}/* ------------------------- struct hostent------------------------- *//* +++++++++++++++++++++++++ struct netgrp +++++++++++++++++++++++++ *//* * int irp_marshall_ng(const char *host, const char *user, *		       const char *domain, char *buffer, size_t *len) * * notes: * *	See note for irp_marshall_ng_start * * return: * *	0 on success, 0 on failure. * */intirp_marshall_ng(const char *host, const char *user, const char *domain,		char **buffer, size_t *len) {	size_t need = 1; /* for nul byte */	const char *fieldsep = ",";	if (len == NULL) {		errno = EINVAL;		return (-1);	}	need += 4;		       /* two parens and two commas */	need += (host == NULL ? 0 : strlen(host));	need += (user == NULL ? 0 : strlen(user));	need += (domain == NULL ? 0 : strlen(domain));	if (buffer == NULL) {		*len = need;		return (0);	} else if (*buffer != NULL && need > *len) {		errno = EINVAL;		return (-1);	}	if (*buffer == NULL) {		need += 2;		/* for CRLF */		*buffer = memget(need);		if (*buffer == NULL) {			errno = ENOMEM;			return (-1);		}		*len = need;	}	(*buffer)[0] = '(';	(*buffer)[1] = '\0';	if (host != NULL)		strcat(*buffer, host);	strcat(*buffer, fieldsep);	if (user != NULL)		strcat(*buffer, user);	strcat(*buffer, fieldsep);	if (domain != NULL)		strcat(*buffer, domain);	strcat(*buffer, ")");	return (0);}/* ---------- *//* * int irp_unmarshall_ng(const char **host, const char **user, *			 const char **domain, char *buffer) * * notes: * *	Unpacks the BUFFER into 3 character arrays it allocates and assigns *	to *HOST, *USER and *DOMAIN. If any field of the value is empty, *	then the corresponding paramater value will be set to NULL. * * return: * *	0 on success and -1 on failure. */intirp_unmarshall_ng(const char **hostp, const char **userp, const char **domainp,		  char *buffer){	char *p, *q;	char fieldsep = ',';	int myerrno = EINVAL;	char *host, *user, *domain;	if (userp == NULL || hostp == NULL ||	    domainp == NULL || buffer == NULL) {		errno = EINVAL;		return (-1);	}	host = user = domain = NULL;	p = buffer;	while (isspace((unsigned char)*p)) {		p++;	}	if (*p != '(') {		goto error;	}	q = p + 1;	while (*q && *q != fieldsep)		q++;	if (!*q) {		goto error;	} else if (q > p + 1) {		host = strndup(p, q - p);	}	p = q + 1;	if (!*p) {		goto error;	} else if (*p != fieldsep) {		q = p + 1;		while (*q && *q != fieldsep)			q++;		if (!*q) {			goto error;		}		user = strndup(p, q - p);	} else {		p++;	}	if (!*p) {		goto error;	} else if (*p != ')') {		q = p + 1;		while (*q && *q != ')')			q++;		if (!*q) {			goto error;		}		domain = strndup(p, q - p);	}	*hostp = host;	*userp = user;	*domainp = domain;	return (0); error:	errno = myerrno;	if (host != NULL) free(host);	if (user != NULL) free(user);	if (domain != NULL) free(domain);	return (-1);}/* ------------------------- struct netgrp ------------------------- *//* +++++++++++++++++++++++++ struct nwent +++++++++++++++++++++++++ *//* * int irp_marshall_nw(struct nwent *ne, char **buffer, size_t *len) * * notes: * *	See at top. * * return: * *	0 on success and -1 on failure. * */intirp_marshall_nw(struct nwent *ne, char **buffer, size_t *len) {	size_t need = 1;	/* for null byte */	char nAddrType[24];	char nNet[MAXPADDRSIZE];	const char *fieldsep = COLONSTR;	if (ne == NULL || len == NULL) {		return (-1);	}	strcpy(nAddrType, ADDR_T_STR(ne->n_addrtype));	if (inet_net_ntop(ne->n_addrtype, ne->n_addr, ne->n_length,			  nNet, sizeof nNet) == NULL) {		return (-1);	}	need += strlen(ne->n_name) + 1;	need += joinlength(ne->n_aliases) + 1;	need += strlen(nAddrType) + 1;	need += strlen(nNet) + 1;	if (buffer == NULL) {		*len = need;		return (0);	}	if (*buffer != NULL && need > *len) {		errno = EINVAL;		return (-1);	}	if (*buffer == NULL) {		need += 2;		/* for CRLF */		*buffer = memget(need);		if (*buffer == NULL) {			errno = ENOMEM;			return (-1);		}		*len = need;	}	strcpy(*buffer, ne->n_name);		strcat(*buffer, fieldsep);	joinarray(ne->n_aliases, *buffer, COMMA) ; strcat(*buffer, fieldsep);	strcat(*buffer, nAddrType);		strcat(*buffer, fieldsep);	strcat(*buffer, nNet);			strcat(*buffer, fieldsep);	return (0);}/* * int irp_unmarshall_nw(struct nwent *ne, char *buffer) * * notes: * *	See note up top. * * return: * *	0 on success and -1 on failure. * */intirp_unmarshall_nw(struct nwent *ne, char *buffer) {	char *p, *q;	int naddrtype;	long nnet;	int bits;	char *name = NULL;	char **aliases = NULL;	char tmpbuf[24];	char *tb;	char fieldsep = ':';	int myerrno = EINVAL;	if (ne == NULL || buffer == NULL) {		goto error;	}	p = buffer;	/* n_name field */	name = NULL;	if (getfield(&name, 0, &p, fieldsep) == NULL || strlen(name) == 0U) {		goto error;	}	/* n_aliases field. Aliases are separated by commas */	q = strchr(p, fieldsep);	if (q == NULL) {		goto error;	}	aliases = splitarray(p, q, COMMA);	if (aliases == NULL) {		myerrno = errno;		goto error;	}	p = q + 1;	/* h_addrtype field */	tb = tmpbuf;	if (getfield(&tb, sizeof tmpbuf, &p, fieldsep) == NULL ||	    strlen(tb) == 0U) {		goto error;	}	if (strcmp(tmpbuf, "AF_INET") == 0)		naddrtype = AF_INET;	else if (strcmp(tmpbuf, "AF_INET6") == 0)		naddrtype = AF_INET6;	else		goto error;	/* n_net field */	tb = tmpbuf;	if (getfield(&tb, sizeof tmpbuf, &p, fieldsep) == NULL ||	    strlen(tb) == 0U) {		goto error;	}	nnet = 0;	bits = inet_net_pton(naddrtype, tmpbuf, &nnet, sizeof nnet);	if (bits < 0) {		goto error;	}	/* nnet = ntohl(nnet); */ /* keep in network order for nwent */	ne->n_name = name;	ne->n_aliases = aliases;	ne->n_addrtype = naddrtype;	ne->n_length = bits;	ne->n_addr = malloc(sizeof nnet);	if (ne->n_addr == NULL) {		goto error;	}	memcpy(ne->n_addr, &nnet, sizeof nnet);	return (0); error:	errno = myerrno;	if (name != NULL) free(name);	free_array(aliases, 0);	return (-1);}/* ------------------------- struct nwent ------------------------- *//* +++++++++++++++++++++++++ struct netent +++++++++++++++++++++++++ *//* * int irp_marshall_ne(struct netent *ne, char **buffer, size_t *len) * * notes: * *	See at top. * * return: * *	0 on success and -1 on failure. * */intirp_marshall_ne(struct netent *ne, char **buffer, size_t *len) {	size_t need = 1;	/* for null byte */	char nAddrType[24];	char nNet[MAXPADDRSIZE];	const char *fieldsep = COLONSTR;	long nval;	if (ne == NULL || len == NULL) {		return (-1);	}	strcpy(nAddrType, ADDR_T_STR(ne->n_addrtype));	nval = htonl(ne->n_net);	if (inet_ntop(ne->n_addrtype, &nval, nNet, sizeof nNet) == NULL) {		return (-1);	}	need += strlen(ne->n_name) + 1;	need += joinlength(ne->n_aliases) + 1;	need += strlen(nAddrType) + 1;	need += strlen(nNet) + 1;	if (buffer == NULL) {		*len = need;		return (0);	}	if (*buffer != NULL && need > *len) {		errno = EINVAL;		return (-1);	}	if (*buffer == NULL) {		need += 2;		/* for CRLF */		*buffer = memget(need);		if (*buffer == NULL) {			errno = ENOMEM;			return (-1);		}		*len = need;	}	strcpy(*buffer, ne->n_name);		strcat(*buffer, fieldsep);

⌨️ 快捷键说明

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