]> git.proxmox.com Git - mirror_edk2.git/blobdiff - StdLib/BsdSocketLib/res_update.c
edk2: Remove AppPkg, StdLib, StdLibPrivateInternalFiles
[mirror_edk2.git] / StdLib / BsdSocketLib / res_update.c
diff --git a/StdLib/BsdSocketLib/res_update.c b/StdLib/BsdSocketLib/res_update.c
deleted file mode 100644 (file)
index be0f531..0000000
+++ /dev/null
@@ -1,561 +0,0 @@
-/** @file\r
-  Copyright (c) 1999 - 2014, Intel Corporation. All rights reserved.<BR>\r
-  This program and the accompanying materials are licensed and made available\r
-  under the terms and conditions of the BSD License which accompanies this\r
-  distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php.\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-**/\r
-/*\r
- * Copyright (c) 1996 by Internet Software Consortium.\r
- *\r
- * Permission to use, copy, modify, and distribute this software for any\r
- * purpose with or without fee is hereby granted, provided that the above\r
- * copyright notice and this permission notice appear in all copies.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS\r
- * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES\r
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE\r
- * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL\r
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR\r
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS\r
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS\r
- * SOFTWARE.\r
- */\r
-\r
-/*\r
- * Portions copyright (c) 1999, 2000\r
- * Intel Corporation.\r
- * All rights reserved.\r
- *\r
- * Redistribution and use in source and binary forms, with or without\r
- * modification, are permitted provided that the following conditions\r
- * are met:\r
- *\r
- * 1. Redistributions of source code must retain the above copyright\r
- *    notice, this list of conditions and the following disclaimer.\r
- *\r
- * 2. Redistributions in binary form must reproduce the above copyright\r
- *    notice, this list of conditions and the following disclaimer in the\r
- *    documentation and/or other materials provided with the distribution.\r
- *\r
- * 3. All advertising materials mentioning features or use of this software\r
- *    must display the following acknowledgement:\r
- *\r
- *    This product includes software developed by Intel Corporation and\r
- *    its contributors.\r
- *\r
- * 4. Neither the name of Intel Corporation or its contributors may be\r
- *    used to endorse or promote products derived from this software\r
- *    without specific prior written permission.\r
- *\r
- * THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION AND CONTRIBUTORS ``AS IS''\r
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
- * ARE DISCLAIMED.  IN NO EVENT SHALL INTEL CORPORATION OR CONTRIBUTORS BE\r
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r
- * THE POSSIBILITY OF SUCH DAMAGE.\r
- *\r
- */\r
-\r
-/*\r
- * Based on the Dynamic DNS reference implementation by Viraj Bais\r
- * <viraj_bais@ccm.fm.intel.com>\r
- */\r
-\r
-#include <sys/param.h>\r
-#include <sys/socket.h>\r
-#include <sys/time.h>\r
-#include <netinet/in.h>\r
-#include <arpa/inet.h>\r
-#include <arpa/nameser.h>\r
-#include <errno.h>\r
-#include <limits.h>\r
-#include <netdb.h>\r
-#include <resolv.h>\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-\r
-/*\r
- * Separate a linked list of records into groups so that all records\r
- * in a group will belong to a single zone on the nameserver.\r
- * Create a dynamic update packet for each zone and send it to the\r
- * nameservers for that zone, and await answer.\r
- * Abort if error occurs in updating any zone.\r
- * Return the number of zones updated on success, < 0 on error.\r
- *\r
- * On error, caller must deal with the unsynchronized zones\r
- * eg. an A record might have been successfully added to the forward\r
- * zone but the corresponding PTR record would be missing if error\r
- * was encountered while updating the reverse zone.\r
- */\r
-\r
-#define NSMAX 16\r
-\r
-struct ns1 {\r
-    char nsname[MAXDNAME];\r
-    struct in_addr nsaddr1;\r
-};\r
-\r
-struct zonegrp {\r
-    char        z_origin[MAXDNAME];\r
-    int16_t     z_class;\r
-    char        z_soardata[MAXDNAME + 5 * INT32SZ];\r
-    struct ns1  z_ns[NSMAX];\r
-    int     z_nscount;\r
-    ns_updrec * z_rr;\r
-    struct zonegrp *z_next;\r
-};\r
-\r
-\r
-int\r
-res_update(ns_updrec *rrecp_in) {\r
-    ns_updrec *rrecp, *tmprrecp;\r
-    u_char buf[PACKETSZ], answer[PACKETSZ], packet[2*PACKETSZ];\r
-    char name[MAXDNAME], zname[MAXDNAME], primary[MAXDNAME],\r
-         mailaddr[MAXDNAME];\r
-    u_char soardata[2*MAXCDNAME+5*INT32SZ];\r
-    char *dname, *svdname, *cp1, *target;\r
-    u_char *cp, *eom;\r
-    HEADER *hp = (HEADER *) answer;\r
-    struct zonegrp *zptr = NULL, *tmpzptr, *prevzptr, *zgrp_start = NULL;\r
-    int i, j, k = 0, n, ancount, nscount, arcount, rcode, rdatasize,\r
-        newgroup, done, myzone, seen_before, numzones = 0;\r
-    u_int16_t dlen, class, qclass, type, qtype;\r
-    u_int32_t ttl;\r
-\r
-    if ((_res.options & RES_INIT) == 0 && res_init() == -1) {\r
-        h_errno = NETDB_INTERNAL;\r
-        return (-1);\r
-    }\r
-\r
-    for (rrecp = rrecp_in; rrecp; rrecp = rrecp->r_next) {\r
-        dname = rrecp->r_dname;\r
-        n = (int)strlen(dname);\r
-        if (dname[n-1] == '.')\r
-            dname[n-1] = '\0';\r
-        qtype = T_SOA;\r
-        qclass = rrecp->r_class;\r
-        done = 0;\r
-        seen_before = 0;\r
-\r
-        while (!done && dname) {\r
-            if (qtype == T_SOA) {\r
-            for (tmpzptr = zgrp_start;\r
-                 tmpzptr && !seen_before;\r
-                 tmpzptr = tmpzptr->z_next) {\r
-                if (strcasecmp(dname,\r
-                           tmpzptr->z_origin) == 0 &&\r
-                    tmpzptr->z_class == qclass)\r
-                    seen_before++;\r
-                for (tmprrecp = tmpzptr->z_rr;\r
-                     tmprrecp && !seen_before;\r
-                     tmprrecp = tmprrecp->r_grpnext)\r
-                if (strcasecmp(dname, tmprrecp->r_dname) == 0\r
-                    && tmprrecp->r_class == qclass) {\r
-                    seen_before++;\r
-                    break;\r
-                }\r
-                if (seen_before) {\r
-                    /*\r
-                     * Append to the end of\r
-                     * current group.\r
-                     */\r
-                    for (tmprrecp = tmpzptr->z_rr;\r
-                         tmprrecp->r_grpnext;\r
-                         tmprrecp = tmprrecp->r_grpnext)\r
-                        (void)NULL;\r
-                    tmprrecp->r_grpnext = rrecp;\r
-                    rrecp->r_grpnext = NULL;\r
-                    done = 1;\r
-                    break;\r
-                }\r
-            }\r
-        } else if (qtype == T_A) {\r
-            for (tmpzptr = zgrp_start;\r
-             tmpzptr && !done;\r
-             tmpzptr = tmpzptr->z_next)\r
-                for (i = 0; i < tmpzptr->z_nscount; i++)\r
-                if (tmpzptr->z_class == qclass &&\r
-                    strcasecmp(tmpzptr->z_ns[i].nsname,\r
-                           dname) == 0 &&\r
-                    tmpzptr->z_ns[i].nsaddr1.s_addr != 0) {\r
-                    zptr->z_ns[k].nsaddr1.s_addr =\r
-                     tmpzptr->z_ns[i].nsaddr1.s_addr;\r
-                    done = 1;\r
-                    break;\r
-                }\r
-        }\r
-        if (done)\r
-            break;\r
-        n = res_mkquery(QUERY, dname, qclass, qtype, NULL,\r
-                0, NULL, buf, sizeof buf);\r
-        if (n <= 0) {\r
-            fprintf(stderr, "res_update: mkquery failed\n");\r
-            return (n);\r
-        }\r
-        n = res_send(buf, n, answer, sizeof answer);\r
-        if (n < 0) {\r
-            fprintf(stderr, "res_update: send error for %s\n",\r
-                rrecp->r_dname);\r
-            return (n);\r
-        }\r
-        if (n < HFIXEDSZ)\r
-            return (-1);\r
-        ancount = ntohs(hp->ancount);\r
-        nscount = ntohs(hp->nscount);\r
-        arcount = ntohs(hp->arcount);\r
-        rcode = hp->rcode;\r
-        cp = answer + HFIXEDSZ;\r
-        eom = answer + n;\r
-        /* skip the question section */\r
-        n = dn_skipname(cp, eom);\r
-        if (n < 0 || cp + n + 2 * INT16SZ > eom)\r
-            return (-1);\r
-        cp += n + 2 * INT16SZ;\r
-\r
-        if (qtype == T_SOA) {\r
-            if (ancount == 0 && nscount == 0 && arcount == 0) {\r
-            /*\r
-             * if (rcode == NOERROR) then the dname exists but\r
-             * has no soa record associated with it.\r
-             * if (rcode == NXDOMAIN) then the dname does not\r
-             * exist and the server is replying out of NCACHE.\r
-             * in either case, proceed with the next try\r
-             */\r
-            dname = strchr(dname, '.');\r
-            if (dname != NULL)\r
-                dname++;\r
-            continue;\r
-            } else if ((rcode == NOERROR || rcode == NXDOMAIN) &&\r
-                   ancount == 0 &&\r
-                   nscount == 1 && arcount == 0) {\r
-            /*\r
-             * name/data does not exist, soa record supplied in the\r
-             * authority section\r
-             */\r
-            /* authority section must contain the soa record */\r
-            if ((n = dn_expand(answer, eom, cp, zname,\r
-                    sizeof zname)) < 0)\r
-                return (n);\r
-            cp += n;\r
-            if (cp + 2 * INT16SZ > eom)\r
-                return (-1);\r
-            GETSHORT(type, cp);\r
-            GETSHORT(class, cp);\r
-            if (type != T_SOA || class != qclass) {\r
-                fprintf(stderr, "unknown answer\n");\r
-                return (-1);\r
-            }\r
-            myzone = 0;\r
-            svdname = dname;\r
-            while (dname)\r
-                if (strcasecmp(dname, zname) == 0) {\r
-                myzone = 1;\r
-                break;\r
-                } else if ((dname = strchr(dname, '.')) != NULL)\r
-                dname++;\r
-            if (!myzone) {\r
-                dname = strchr(svdname, '.');\r
-                if (dname != NULL)\r
-                dname++;\r
-                continue;\r
-            }\r
-            nscount = 0;\r
-            /* fallthrough */\r
-            } else if (rcode == NOERROR && ancount == 1) {\r
-            /*\r
-             * found the zone name\r
-             * new servers will supply NS records for the zone\r
-             * in authority section and A records for those\r
-             * nameservers in the additional section\r
-             * older servers have to be explicitly queried for\r
-             * NS records for the zone\r
-             */\r
-            /* answer section must contain the soa record */\r
-            if ((n = dn_expand(answer, eom, cp, zname,\r
-                           sizeof zname)) < 0)\r
-                return (n);\r
-            else\r
-                cp += n;\r
-            if (cp + 2 * INT16SZ > eom)\r
-                return (-1);\r
-            GETSHORT(type, cp);\r
-            GETSHORT(class, cp);\r
-            if (type == T_CNAME) {\r
-                dname = strchr(dname, '.');\r
-                if (dname != NULL)\r
-                    dname++;\r
-                continue;\r
-            }\r
-            if (strcasecmp(dname, zname) != 0 ||\r
-                type != T_SOA ||\r
-                class != rrecp->r_class) {\r
-                fprintf(stderr, "unknown answer\n");\r
-                return (-1);\r
-            }\r
-            /* FALLTHROUGH */\r
-            } else {\r
-            fprintf(stderr,\r
-        "unknown response: ans=%d, auth=%d, add=%d, rcode=%d\n",\r
-                ancount, nscount, arcount, hp->rcode);\r
-            return (-1);\r
-            }\r
-            if (cp + INT32SZ + INT16SZ > eom)\r
-                return (-1);\r
-            /* continue processing the soa record */\r
-            GETLONG(ttl, cp);\r
-            GETSHORT(dlen, cp);\r
-            if (cp + dlen > eom)\r
-                return (-1);\r
-            newgroup = 1;\r
-            zptr = zgrp_start;\r
-            prevzptr = NULL;\r
-            while (zptr) {\r
-            if (strcasecmp(zname, zptr->z_origin) == 0 &&\r
-                type == T_SOA && class == qclass) {\r
-                newgroup = 0;\r
-                break;\r
-            }\r
-            prevzptr = zptr;\r
-            zptr = zptr->z_next;\r
-            }\r
-            if (!newgroup) {\r
-            for (tmprrecp = zptr->z_rr;\r
-                 tmprrecp->r_grpnext;\r
-                 tmprrecp = tmprrecp->r_grpnext)\r
-                    ;\r
-            tmprrecp->r_grpnext = rrecp;\r
-            rrecp->r_grpnext = NULL;\r
-            done = 1;\r
-            cp += dlen;\r
-            break;\r
-            } else {\r
-            if ((n = dn_expand(answer, eom, cp, primary,\r
-                           sizeof primary)) < 0)\r
-                return (n);\r
-            cp += n;\r
-            /*\r
-             * We don't have to bounds check here because the\r
-             * next use of 'cp' is in dn_expand().\r
-             */\r
-            cp1 = (char *)soardata;\r
-            strcpy(cp1, primary);\r
-            cp1 += strlen(cp1) + 1;\r
-            if ((n = dn_expand(answer, eom, cp, mailaddr,\r
-                           sizeof mailaddr)) < 0)\r
-                return (n);\r
-            cp += n;\r
-            strcpy(cp1, mailaddr);\r
-            cp1 += strlen(cp1) + 1;\r
-            if (cp + 5*INT32SZ > eom)\r
-                return (-1);\r
-            memcpy(cp1, cp, 5*INT32SZ);\r
-            cp += 5*INT32SZ;\r
-            cp1 += 5*INT32SZ;\r
-            rdatasize = (int)((u_char *)cp1 - soardata);\r
-            zptr = calloc(1, sizeof(struct zonegrp));\r
-            if (zptr == NULL)\r
-                        return (-1);\r
-            if (zgrp_start == NULL)\r
-                zgrp_start = zptr;\r
-            else\r
-                prevzptr->z_next = zptr;\r
-            zptr->z_rr = rrecp;\r
-            rrecp->r_grpnext = NULL;\r
-            strcpy(zptr->z_origin, zname);\r
-            zptr->z_class = class;\r
-            memcpy(zptr->z_soardata, soardata, rdatasize);\r
-            /* fallthrough to process NS and A records */\r
-            }\r
-        } else if (qtype == T_NS) {\r
-            if (rcode == NOERROR && ancount > 0) {\r
-            strcpy(zname, dname);\r
-            for (zptr = zgrp_start; zptr; zptr = zptr->z_next) {\r
-                if (strcasecmp(zname, zptr->z_origin) == 0)\r
-                break;\r
-            }\r
-            if (zptr == NULL)\r
-                /* should not happen */\r
-                return (-1);\r
-            if (nscount > 0) {\r
-                /*\r
-                 * answer and authority sections contain\r
-                 * the same information, skip answer section\r
-                 */\r
-                for (j = 0; j < ancount; j++) {\r
-                n = dn_skipname(cp, eom);\r
-                if (n < 0)\r
-                    return (-1);\r
-                n += 2*INT16SZ + INT32SZ;\r
-                if (cp + n + INT16SZ > eom)\r
-                    return (-1);\r
-                cp += n;\r
-                GETSHORT(dlen, cp);\r
-                cp += dlen;\r
-                }\r
-            } else\r
-                nscount = ancount;\r
-            /* fallthrough to process NS and A records */\r
-            } else {\r
-            fprintf(stderr, "cannot determine nameservers for %s:\\r
-ans=%d, auth=%d, add=%d, rcode=%d\n",\r
-                dname, ancount, nscount, arcount, hp->rcode);\r
-            return (-1);\r
-            }\r
-        } else if (qtype == T_A) {\r
-            if (rcode == NOERROR && ancount > 0) {\r
-            arcount = ancount;\r
-            ancount = nscount = 0;\r
-            /* fallthrough to process A records */\r
-            } else {\r
-            fprintf(stderr, "cannot determine address for %s:\\r
-ans=%d, auth=%d, add=%d, rcode=%d\n",\r
-                dname, ancount, nscount, arcount, hp->rcode);\r
-            return (-1);\r
-            }\r
-        }\r
-        /* process NS records for the zone */\r
-        j = 0;\r
-        for (i = 0; i < nscount; i++) {\r
-            if ((n = dn_expand(answer, eom, cp, name,\r
-                    sizeof name)) < 0)\r
-            return (n);\r
-            cp += n;\r
-            if (cp + 3 * INT16SZ + INT32SZ > eom)\r
-                return (-1);\r
-            GETSHORT(type, cp);\r
-            GETSHORT(class, cp);\r
-            GETLONG(ttl, cp);\r
-            GETSHORT(dlen, cp);\r
-            if (cp + dlen > eom)\r
-            return (-1);\r
-            if (strcasecmp(name, zname) == 0 &&\r
-            type == T_NS && class == qclass) {\r
-                if ((n = dn_expand(answer, eom, cp,\r
-                           name, sizeof name)) < 0)\r
-                    return (n);\r
-                target = zptr->z_ns[j++].nsname;\r
-                strcpy(target, name);\r
-            }\r
-            cp += dlen;\r
-        }\r
-        if (zptr->z_nscount == 0)\r
-            zptr->z_nscount = j;\r
-        /* get addresses for the nameservers */\r
-        for (i = 0; i < arcount; i++) {\r
-            if ((n = dn_expand(answer, eom, cp, name,\r
-                    sizeof name)) < 0)\r
-            return (n);\r
-            cp += n;\r
-            if (cp + 3 * INT16SZ + INT32SZ > eom)\r
-            return (-1);\r
-            GETSHORT(type, cp);\r
-            GETSHORT(class, cp);\r
-            GETLONG(ttl, cp);\r
-            GETSHORT(dlen, cp);\r
-            if (cp + dlen > eom)\r
-                return (-1);\r
-            if (type == T_A && dlen == INT32SZ && class == qclass) {\r
-            for (j = 0; j < zptr->z_nscount; j++)\r
-                if (strcasecmp(name, zptr->z_ns[j].nsname) == 0) {\r
-                memcpy(&zptr->z_ns[j].nsaddr1.s_addr, cp,\r
-                       INT32SZ);\r
-                break;\r
-                }\r
-            }\r
-            cp += dlen;\r
-        }\r
-        if (zptr->z_nscount == 0) {\r
-            dname = zname;\r
-            qtype = T_NS;\r
-            continue;\r
-        }\r
-        done = 1;\r
-        for (k = 0; k < zptr->z_nscount; k++)\r
-            if (zptr->z_ns[k].nsaddr1.s_addr == 0) {\r
-            done = 0;\r
-            dname = zptr->z_ns[k].nsname;\r
-            qtype = T_A;\r
-            }\r
-        } /* while */\r
-    }\r
-    --ttl;  // Suppress the "Set but not used" warning/error for ttl.\r
-\r
-    _res.options |= RES_DEBUG;\r
-    for (zptr = zgrp_start; zptr; zptr = zptr->z_next) {\r
-\r
-        /* append zone section */\r
-        rrecp = res_mkupdrec(ns_s_zn, zptr->z_origin,\r
-                     zptr->z_class, ns_t_soa, 0);\r
-        if (rrecp == NULL) {\r
-            fprintf(stderr, "saverrec error\n");\r
-            fflush(stderr);\r
-            return (-1);\r
-        }\r
-        rrecp->r_grpnext = zptr->z_rr;\r
-        zptr->z_rr = rrecp;\r
-\r
-        n = res_mkupdate(zptr->z_rr, packet, sizeof packet);\r
-        if (n < 0) {\r
-            fprintf(stderr, "res_mkupdate error\n");\r
-            fflush(stderr);\r
-            return (-1);\r
-        } else\r
-            fprintf(stdout, "res_mkupdate: packet size = %d\n", n);\r
-\r
-        /* Override the list of NS records from res_init() with\r
-         * the authoritative nameservers for the zone being updated.\r
-         * Sort primary to be the first in the list of nameservers.\r
-         */\r
-        for (i = 0; i < zptr->z_nscount; i++) {\r
-            if (strcasecmp(zptr->z_ns[i].nsname,\r
-                       zptr->z_soardata) == 0) {\r
-                struct in_addr tmpaddr;\r
-\r
-                if (i != 0) {\r
-                    strcpy(zptr->z_ns[i].nsname,\r
-                           zptr->z_ns[0].nsname);\r
-                    strcpy(zptr->z_ns[0].nsname,\r
-                           zptr->z_soardata);\r
-                    tmpaddr = zptr->z_ns[i].nsaddr1;\r
-                    zptr->z_ns[i].nsaddr1 =\r
-                        zptr->z_ns[0].nsaddr1;\r
-                    zptr->z_ns[0].nsaddr1 = tmpaddr;\r
-                }\r
-                break;\r
-            }\r
-        }\r
-        for (i = 0; i < MAXNS; i++) {\r
-            _res.nsaddr_list[i].sin_addr = zptr->z_ns[i].nsaddr1;\r
-            _res.nsaddr_list[i].sin_family = AF_INET;\r
-            _res.nsaddr_list[i].sin_port = htons(NAMESERVER_PORT);\r
-        }\r
-        _res.nscount = (zptr->z_nscount < MAXNS) ?\r
-                    zptr->z_nscount : MAXNS;\r
-        n = res_send(packet, n, answer, sizeof(answer));\r
-        if (n < 0) {\r
-            fprintf(stderr, "res_send: send error, n=%d\n", n);\r
-            break;\r
-        } else\r
-            numzones++;\r
-    }\r
-\r
-    /* free malloc'ed memory */\r
-    while(zgrp_start) {\r
-        zptr = zgrp_start;\r
-        zgrp_start = zgrp_start->z_next;\r
-        res_freeupdrec(zptr->z_rr);  /* Zone section we allocated. */\r
-        free((char *)zptr);\r
-    }\r
-\r
-    return (numzones);\r
-}\r