#include "isinst.h"
#include "depinst.h"
#include "repo.h"
void parse_name_ver(const char *dirname, char *pkgname, size_t pkgnamesize, char *pkgver, size_t pkgversize) {
const char *lastdash = strrchr(dirname, '-');
if (lastdash != NULL) {
size_t namelen = lastdash - dirname;
if (namelen < pkgnamesize) {
strncpy(pkgname, dirname, namelen);
pkgname[namelen] = '\0';
}
if (strlen(lastdash + 1) < pkgversize) {
strlcpy(pkgver, lastdash + 1, pkgversize);
}
}
}
int is_new_ver(const char *instver, const char *availablevers) {
return strcmp(availablevers, instver) > 0;
}
void list_instpkg(Package *packages, int *cntpkg, int maxpk) {
const char *db_path = "/var/db/pkg";
DIR *dir = opendir(db_path);
struct dirent *entry;
if (!dir) {
perror("opendirに失敗");
return;
}
*cntpkg = 0;
while ((entry = readdir(dir)) != NULL) {
if (*cntpkg >= maxpk) {
break;
}
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
continue;
}
if (entry->d_type == DT_DIR) {
char *lastdash = strrchr(entry->d_name, '-');
if (!lastdash) {
continue;
}
size_t namelen = lastdash - entry->d_name;
if (namelen < sizeof(packages[*cntpkg].name)) {
strncpy(packages[*cntpkg].name, entry->d_name, namelen);
packages[*cntpkg].name[namelen] = '\0';
}
strncpy(packages[*cntpkg].version, lastdash + 1, sizeof(packages[*cntpkg].version) - 1);
packages[*cntpkg].version[sizeof(packages[*cntpkg].version) - 1] = '\0';
(*cntpkg)++;
}
}
closedir(dir);
}
void diffinst() {
Package instpkg[MAX_PACKAGES];
int cntinstpkg = 0;
list_instpkg(instpkg, &cntinstpkg, MAX_PACKAGES);
for (int i = 0; i < cntinstpkg; i++) {
char availablepkgname[1024];
if (findpkgver(instpkg[i].name, availablepkgname, sizeof(availablepkgname)) != 1) {
continue;
}
char availablevers[256] = {0};
char *lastdash = strrchr(availablepkgname, '-');
if (!lastdash) {
continue;
}
strlcpy(availablevers, lastdash + 1, sizeof(availablevers));
char *tgz = strstr(availablevers, ".tgz");
if (tgz) {
*tgz = '\0';
}
if (is_new_ver(instpkg[i].version, availablevers)) {
printf("%s (インストールしたバージョン: %s、更新出来るバージョン: %s)\n",
instpkg[i].name, instpkg[i].version, availablevers);
}
}
}