1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <string.h>
5 
6 #include "pool.h"
7 #include "util.h"
8 #include "fastestmirror.h"
9 
10 #include "mirror.h"
11 
12 char *
findmetalinkurl(FILE * fp,unsigned char * chksump,Id * chksumtypep)13 findmetalinkurl(FILE *fp, unsigned char *chksump, Id *chksumtypep)
14 {
15   char buf[4096], *bp, *ep;
16   char **urls = 0;
17   int nurls = 0;
18   int i;
19 
20   if (chksumtypep)
21     *chksumtypep = 0;
22   while((bp = fgets(buf, sizeof(buf), fp)) != 0)
23     {
24       while (*bp == ' ' || *bp == '\t')
25 	bp++;
26       if (chksumtypep && !*chksumtypep && !strncmp(bp, "<hash type=\"sha256\">", 20))
27 	{
28 	  bp += 20;
29 	  if (solv_hex2bin((const char **)&bp, chksump, 32) == 32)
30 	    *chksumtypep = REPOKEY_TYPE_SHA256;
31 	  continue;
32 	}
33       if (strncmp(bp, "<url", 4))
34 	continue;
35       bp = strchr(bp, '>');
36       if (!bp)
37 	continue;
38       bp++;
39       ep = strstr(bp, "repodata/repomd.xml</url>");
40       if (!ep)
41 	continue;
42       *ep = 0;
43       if (strncmp(bp, "http", 4))
44 	continue;
45       urls = solv_extend(urls, nurls, 1, sizeof(*urls), 15);
46       urls[nurls++] = strdup(bp);
47     }
48   if (nurls)
49     {
50       if (nurls > 1)
51         findfastest(urls, nurls > 5 ? 5 : nurls);
52       bp = urls[0];
53       urls[0] = 0;
54       for (i = 0; i < nurls; i++)
55         solv_free(urls[i]);
56       solv_free(urls);
57       ep = strchr(bp, '/');
58       if ((ep = strchr(ep + 2, '/')) != 0)
59 	{
60 	  *ep = 0;
61 	  printf("[using mirror %s]\n", bp);
62 	  *ep = '/';
63 	}
64       return bp;
65     }
66   return 0;
67 }
68 
69 char *
findmirrorlisturl(FILE * fp)70 findmirrorlisturl(FILE *fp)
71 {
72   char buf[4096], *bp, *ep;
73   int i, l;
74   char **urls = 0;
75   int nurls = 0;
76 
77   while((bp = fgets(buf, sizeof(buf), fp)) != 0)
78     {
79       while (*bp == ' ' || *bp == '\t')
80 	bp++;
81       if (!*bp || *bp == '#')
82 	continue;
83       l = strlen(bp);
84       while (l > 0 && (bp[l - 1] == ' ' || bp[l - 1] == '\t' || bp[l - 1] == '\n'))
85 	bp[--l] = 0;
86       if ((ep = strstr(bp, "url=")) != 0)
87 	bp = ep + 4;
88       urls = solv_extend(urls, nurls, 1, sizeof(*urls), 15);
89       urls[nurls++] = strdup(bp);
90     }
91   if (nurls)
92     {
93       if (nurls > 1)
94         findfastest(urls, nurls > 5 ? 5 : nurls);
95       bp = urls[0];
96       urls[0] = 0;
97       for (i = 0; i < nurls; i++)
98         solv_free(urls[i]);
99       solv_free(urls);
100       ep = strchr(bp, '/');
101       if ((ep = strchr(ep + 2, '/')) != 0)
102 	{
103 	  *ep = 0;
104 	  printf("[using mirror %s]\n", bp);
105 	  *ep = '/';
106 	}
107       return bp;
108     }
109   return 0;
110 }
111