#include "sync.h"
struct MemoryStruct {
char *memory;
size_t size;
const char *pkg;
};
size_t query_repo(void *ptr, size_t size, size_t nmemb, void *stream) {
struct MemoryStruct *ms = (struct MemoryStruct *)stream;
char *data = (char *)ptr;
size_t sumsize = size * nmemb;
for (char *cur = data; cur < data + sumsize;) {
char *a_tag_start = strstr(cur, "<a href=\"");
if (!a_tag_start) {
break;
}
char *urlstart = a_tag_start + 9;
char *urlend = strchr(urlstart, '"');
if (!urlend) {
break;
}
*urlend = '\0';
if (!strstr(urlstart, ".tgz") || strstr(urlstart, ".sig")) {
cur = urlend + 1;
continue;
}
char *dot = strrchr(urlstart, '.');
if (dot) *dot = '\0';
FILE *fp = fopen("/etc/fugu/PACKAGE.txt", "a");
if (fp) {
fprintf(fp, "%s\n", urlstart);
fclose(fp);
}
cur = urlend + 1;
}
return sumsize;
}
void fetch_repo(const char *url) {
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, query_repo);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform()に失敗:%s\n", curl_easy_strerror(res));
}
curl_easy_cleanup(curl);
curl_global_cleanup();
}
}
void sync() {
const char *basedir = "/etc/fugu";
const char *path = "/etc/fugu/PACKAGE.txt";
const char *repolist = "/etc/fugu/config.cnf";
struct stat st = {0};
FILE *file;
char url[256];
if (stat(basedir, &st) == -1) {
if (mkdir(basedir, 0755) == -1) {
perror("mkdirに失敗");
return;
}
}
if (remove(path) != 0 && errno != ENOENT) {
perror("PACKAGEファイルを削除に失敗");
return;
}
file = fopen(repolist, "r");
if (file == NULL) {
perror("config.cnfファイルを開くのに失敗");
return;
}
while (fgets(url, sizeof(url), file)) {
url[strcspn(url, "\n")] = 0;
printf("%sを同期中…\n", url);
fetch_repo(url);
}
fclose(file);
printf("完了。\n");
}