📄 irpmarshall.c
字号:
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 + -