]> Nishi Git Mirror - sp.git/commitdiff
ベースディレクトリを関数化
author諏訪子 <suwako@076.moe>
Sun, 15 Sep 2024 14:01:57 +0000 (23:01 +0900)
committer諏訪子 <suwako@076.moe>
Sun, 15 Sep 2024 14:01:57 +0000 (23:01 +0900)
CHANGELOG.md
main.c
src/addpass.c
src/common.c
src/common.h
src/delpass.c
src/initpass.c
src/showpass.c
src/yankpass.c

index 5ee1ff12daa8c866e040efe7b9ecc3c28876ff1b..bcbce916ede2db4e2b639931c96f1d334e5f854d 100644 (file)
@@ -4,6 +4,7 @@
 * パスワードの検索の追加
 * 静的リンクはデフォルトに
 * simpas情報の表示
+* ベースディレクトリを関数化
 
 # 1.3.0
 * 英訳の追加 (レミリア・スカーレットさん)
diff --git a/main.c b/main.c
index 9385d463c690ddf4d581a8792c5a0948ab74843d..d8bfe70ccee507dc412aec69e54f2c11a4482ed8 100644 (file)
--- a/main.c
+++ b/main.c
@@ -22,41 +22,24 @@ void usage() {
 char *getfullpath(char *arg) {
   char *lang = getlang();
 
-  char *homedir = getenv("HOME");
-  if (homedir == NULL) {
-    if (strncmp(lang, "en", 2) == 0)
-      perror("Failed to getting home directory");
-    else perror("ホームディレクトリを受取に失敗");
-    return NULL;
-  }
-
-#if defined(__HAIKU__)
-  char *basedir = "/config/settings/sp/";
-#else
-  char *basedir = "/.local/share/sp/";
-#endif
+  char *basedir = getbasedir(1);
   size_t fullPathLen;
   char *fullPath;
-  if (arg != NULL) {
-    fullPathLen = strlen(homedir) + strlen(basedir) + strlen(arg) + 5;
-  } else {
-    fullPathLen = strlen(homedir) + strlen(basedir);
-  }
+  fullPathLen = strlen(basedir) + (arg != NULL ? strlen(arg) + 5 : 0);
 
   fullPath = (char *)malloc(fullPathLen);
   if (fullPath == NULL) {
     if (strncmp(lang, "en", 2) == 0)
       perror("Failed to allocating memory");
     else perror("メモリの役割に失敗");
-    free(fullPath);
-    free(homedir);
+    free(basedir);
     return NULL;
   }
 
   if (arg != NULL) {
-    snprintf(fullPath, fullPathLen, "%s%s%s.gpg", homedir, basedir, arg);
+    snprintf(fullPath, fullPathLen, "%s%s.gpg", basedir, arg);
   } else {
-    snprintf(fullPath, fullPathLen, "%s%s", homedir, basedir);
+    snprintf(fullPath, fullPathLen, "%s", basedir);
   }
 
   return fullPath;
index 81e01e4ccda34fb1a3788cc69a7ebc2d9b45fb63..ae1df5ecfa651f83376af4bea9b6306cf644ac7b 100644 (file)
@@ -40,25 +40,13 @@ void addpass(char *file) {
   char *lang = getlang();
 
   // パスを準備
-  char *homedir = getenv("HOME");
-  if (homedir == NULL) {
-    if (strncmp(lang, "en", 2) == 0)
-      perror("Failed to retrieve home directory");
-    else perror("ホームディレクトリを受取に失敗");
-    return;
-  }
-
-#if defined(__HAIKU__)
-  char *basedir = "/config/settings/sp/";
-#else
-  char *basedir = "/.local/share/sp/";
-#endif
+  char *basedir = getbasedir(1);
   char *ext = ".gpg";
 
   char pass[256];
   char knin[256];
 
-  int alllen = snprintf(NULL, 0, "%s%s%s%s", homedir, basedir, file, ext) + 1;
+  int alllen = snprintf(NULL, 0, "%s%s%s", basedir, file, ext) + 1;
   char *gpgpathchk = malloc(alllen);
   if (gpgpathchk == NULL) {
     if (strncmp(lang, "en", 2) == 0)
@@ -68,7 +56,7 @@ void addpass(char *file) {
   }
 
   // ファイルが既に存在するかどうか確認
-  snprintf(gpgpathchk, alllen, "%s%s%s%s", homedir, basedir, file, ext);
+  snprintf(gpgpathchk, alllen, "%s%s%s", basedir, file, ext);
 
   if (access(gpgpathchk, F_OK) != -1) {
     if (strncmp(lang, "en", 2) == 0)
@@ -153,7 +141,7 @@ void addpass(char *file) {
 
   // 鍵を受け取る
   char keypath[256];
-  snprintf(keypath, sizeof(keypath), "%s%s%s", homedir, basedir, ".gpg-id");
+  snprintf(keypath, sizeof(keypath), "%s%s", basedir, ".gpg-id");
 
   keypath[sizeof(keypath) - 1] = '\0';
 
@@ -222,7 +210,7 @@ void addpass(char *file) {
 
   // ディレクトリを創作
   char dirpath[512];
-  snprintf(dirpath, sizeof(dirpath), "%s%s%s", homedir, basedir, file);
+  snprintf(dirpath, sizeof(dirpath), "%s%s", basedir, file);
 
   dirpath[sizeof(dirpath) - 1] = '\0';
 
@@ -239,7 +227,7 @@ void addpass(char *file) {
     }
   }
 
-  snprintf(gpgpath, alllen, "%s%s%s%s", homedir, basedir, file, ext);
+  snprintf(gpgpath, alllen, "%s%s%s", basedir, file, ext);
 
   struct stat statbuf;
   if (stat(gpgpath, &statbuf) == 0) {
index cd76fb8874baf8e1db3a35d341dd20e9d90451ea..59f26f242670dfffb853c63aad67b1882209f35c 100644 (file)
@@ -1,6 +1,44 @@
 #include "common.h"
 #include <string.h>
 
+char *getbasedir(int trailing) {
+  char *lang = getlang();
+
+  char *homedir = getenv("HOME");
+  if (homedir == NULL) {
+    if (strncmp(lang, "en", 2) == 0)
+      perror("Failed to get home directory");
+    else perror("ホームディレクトリを受取に失敗");
+    return NULL;
+  }
+
+#if defined(__HAIKU__)
+  char *basedir = "/config/settings/sp";
+  char *slash = "/";
+#elif defined(_WIN32)
+  char *basedir = "\\AppData\\Local\\076\\sp";
+  char *slash = "\\";
+#else
+  char *basedir = "/.local/share/sp";
+  char *slash = "/";
+#endif
+
+  size_t len = strlen(homedir) + strlen(basedir) + strlen(slash) + 4;
+  char *res = malloc(len);
+  if (res == NULL) {
+    if (strncmp(lang, "en", 2) == 0)
+      perror("Failed to allocate memory");
+    else perror("メモリの役割に失敗");
+    return NULL;
+  }
+  if (trailing == 1)
+    snprintf(res, len, "%s%s%s", homedir, basedir, slash);
+  else
+    snprintf(res, len, "%s%s", homedir, basedir);
+
+  return res;
+}
+
 char *getlang() {
   char *lang = NULL;
 
index c8b74dddbd01d1ff08efd71616deb663af1c28b2..a8a8b8e7a8ff8e4e32d181fcce6b52c8c3c9a15e 100644 (file)
@@ -21,6 +21,7 @@ typedef struct {
   size_t size;
 } List;
 
+char *getbasedir(int trailing);
 char *getlang();
 int mkdir_r(const char *path, mode_t mode);
 
index 62bbe87e8f277b1d2a81dfada43c48f6cb038a3f..91f5d69259dfe1e6c4d02d267c54c39dad498d44 100644 (file)
@@ -62,22 +62,10 @@ int delpass(char *file, int force) {
 
   // パスを準備
   char pwfile[512];
-  char *homedir = getenv("HOME");
-  if (homedir == NULL) {
-    if (strncmp(lang, "en", 2) == 0)
-      perror("Failed to get home directory");
-    else perror("ホームディレクトリを受取に失敗");
-    return -1;
-  }
-
-#if defined(__HAIKU__)
-  char *basedir = "/config/settings/sp/";
-#else
-  char *basedir = "/.local/share/sp/";
-#endif
+  char *basedir = getbasedir(1);
   char *ext = ".gpg";
 
-  int alllen = snprintf(NULL, 0, "%s%s%s%s", homedir, basedir, file, ext) + 1;
+  int alllen = snprintf(NULL, 0, "%s%s%s", basedir, file, ext) + 1;
   char *gpgpathchk = malloc(alllen);
   if (gpgpathchk == NULL) {
     if (strncmp(lang, "en", 2) == 0)
@@ -87,7 +75,7 @@ int delpass(char *file, int force) {
   }
 
   // ファイルが既に存在するかどうか確認
-  snprintf(gpgpathchk, alllen, "%s%s%s%s", homedir, basedir, file, ext);
+  snprintf(gpgpathchk, alllen, "%s%s%s", basedir, file, ext);
   if (access(gpgpathchk, F_OK) != 0) {
     if (strncmp(lang, "en", 2) == 0)
       perror("Password does not exist");
@@ -97,15 +85,7 @@ int delpass(char *file, int force) {
   }
   free(gpgpathchk);
 
-  int needed = snprintf(
-    pwfile,
-    sizeof(pwfile),
-    "%s%s%s%s",
-    homedir,
-    basedir,
-    file,
-    ext
-  );
+  int needed = snprintf( pwfile, sizeof(pwfile), "%s%s%s", basedir, file, ext);
   if (needed >= (int)sizeof(pwfile)) {
     if (strncmp(lang, "en", 2) == 0)
       perror("Error: Path is too long");
@@ -140,11 +120,9 @@ int delpass(char *file, int force) {
   int numt;
   char **tokens = explode(file, '/', &numt);
 
-  char basepath[1024];
   char passpath[1024];
-  snprintf(basepath, sizeof(basepath), "%s%s", homedir, basedir);
-  snprintf(passpath, sizeof(passpath), "%s%s%s", homedir, basedir, tokens[0]);
-  char *ls = strrchr(basepath, '/');
+  snprintf(passpath, sizeof(passpath), "%s%s", basedir, tokens[0]);
+  char *ls = strrchr(basedir, '/');
   if (ls != NULL) {
     *ls = '\0';
   }
@@ -157,7 +135,7 @@ int delpass(char *file, int force) {
 
   for (int i = numt - 1; i >= 0; i--) {
     // ~/.local/share/sp を削除したら危険
-    if (strncmp(passpath, basepath, sizeof(passpath)) == 0) {
+    if (strncmp(passpath, basedir, sizeof(passpath)) == 0) {
       break;
     }
 
index 0eab1b5ac278d33007ced493c35204a7b268060a..c73cfb7901404aa3c3f475108139b7e8e494d735 100644 (file)
@@ -4,52 +4,38 @@
 void initpass(char *gpgid) {
   char *lang = getlang();
 
-  char *homedir = getenv("HOME");
-  if (homedir == NULL) {
-    if (strncmp(lang, "en", 2) == 0)
-      perror("Failed to get home directory.");
-    else perror("ホームディレクトリを受取に失敗。");
-    return;
-  }
-
-#if defined(__HAIKU)
-  char *basedir = "/config/settings/sp/";
-#else
-  char *basedir = "/.local/share/sp/";
-#endif
-  char dirpath[256];
-  snprintf(dirpath, sizeof(dirpath), "%s%s", homedir, basedir);
+  char *basedir = getbasedir(1);
 
-  if (mkdir_r(dirpath, 0755) != 0 && errno != EEXIST) {
+  if (mkdir_r(basedir, 0755) != 0 && errno != EEXIST) {
     if (strncmp(lang, "en", 2) == 0)
-      perror("Failed to create directory.");
-    else perror("ディレクトリを作成に失敗。");
+      fprintf(stderr, "Failed to create directory.\n");
+    else fprintf(stderr, "ディレクトリを作成に失敗。\n");
     return;
   }
 
   char gpgidpath[512];
-  snprintf(gpgidpath, sizeof(gpgidpath), "%s/.gpg-id", dirpath);
+  snprintf(gpgidpath, sizeof(gpgidpath), "%s/.gpg-id", basedir);
 
   struct stat statbuf;
   if (stat(gpgidpath, &statbuf) == 0) {
     if (strncmp(lang, "en", 2) == 0)
-      perror(".gpg-id file already exists.");
-    else perror(".gpg-idファイルは既に存在します。");
+      fprintf(stderr, ".gpg-id file already exists.\n");
+    else fprintf(stderr, ".gpg-idファイルは既に存在します。\n");
     return;
   }
 
   FILE *gpgidfile = fopen(gpgidpath, "w");
   if (gpgidfile == NULL) {
     if (strncmp(lang, "en", 2) == 0)
-      perror("Failed to write .gpg-id file.");
-    else perror(".gpg-idファイルを書き込めません。");
+      fprintf(stderr, "Failed to write .gpg-id file.\n");
+    else fprintf(stderr, ".gpg-idファイルを書き込めません。\n");
     return;
   }
 
-  if (fputs(gpgid, gpgidfile) == EOF) {
+  if (fprintf(gpgidfile, "%s\n", gpgid) < 0) {
     if (strncmp(lang, "en", 2) == 0)
-      perror("Failed to write .gpg-id file.");
-    else perror(".gpg-idファイルへの書き込みに失敗しました。");
+      fprintf(stderr, "Failed to write .gpg-id file.\n");
+    else fprintf(stderr, ".gpg-idファイルへの書き込みに失敗しました。\n");
     fclose(gpgidfile);
     return;
   }
index d291db5af7e5e7f789ee10c4a7eb71927f873d51..713d362bf84ad5f9426336b8a2b01bad3d8ff77d 100644 (file)
@@ -43,21 +43,9 @@ const char *showpass(char *file) {
   gpgme_set_protocol(ctx, GPGME_PROTOCOL_OpenPGP);
 
   // 暗号化したタイルを開く
-  char *homedir = getenv("HOME");
-  if (homedir == NULL) {
-    if (strncmp(lang, "en", 2) == 0)
-      perror("Failed to get home directory");
-    else perror("ホームディレクトリを受取に失敗");
-    return NULL;
-  }
-
-#if defined(__HAIKU__)
-  char *basedir = "/config/settings/sp/";
-#else
-  char *basedir = "/.local/share/sp/";
-#endif
+  char *basedir = getbasedir(1);
   char *ext = ".gpg";
-  int alllen = snprintf(NULL, 0, "%s%s%s%s", homedir, basedir, file, ext) + 1;
+  int alllen = snprintf(NULL, 0, "%s%s%s", basedir, file, ext) + 1;
   char *gpgpath = malloc(alllen);
   if (gpgpath == NULL) {
     if (strncmp(lang, "en", 2) == 0)
@@ -66,7 +54,7 @@ const char *showpass(char *file) {
     return NULL;
   }
 
-  snprintf(gpgpath, alllen, "%s%s%s%s", homedir, basedir, file, ext);
+  snprintf(gpgpath, alllen, "%s%s%s", basedir, file, ext);
 
   gpgfile = fopen(gpgpath, "rb");
   if (gpgfile == NULL) {
index 40c67fed17b9db415df97b8c17f1547334534357..ecc30f7551c2ad87c00ab1e2b0050aa03ca52d25 100644 (file)
@@ -40,21 +40,9 @@ void yankpass(char *file) {
   gpgme_set_protocol(ctx, GPGME_PROTOCOL_OpenPGP);
 
   // 暗号化したタイルを開く
-  char* homedir = getenv("HOME");
-  if (homedir == NULL) {
-    if (strncmp(lang, "en", 2) == 0)
-      perror("Failed to get home directory");
-    else perror("ホームディレクトリを受取に失敗");
-    return;
-  }
-
-#if defined(__HAIKU__)
-  char *basedir = "/config/settings/sp/";
-#else
-  char* basedir = "/.local/share/sp/";
-#endif
+  char *basedir = getbasedir(1);
   char* ext = ".gpg";
-  int alllen = snprintf(NULL, 0, "%s%s%s%s", homedir, basedir, file, ext) + 1;
+  int alllen = snprintf(NULL, 0, "%s%s%s", basedir, file, ext) + 1;
   char* gpgpath = malloc(alllen);
   if (gpgpath == NULL) {
     if (strncmp(lang, "en", 2) == 0)
@@ -63,7 +51,7 @@ void yankpass(char *file) {
     return;
   }
 
-  snprintf(gpgpath, alllen, "%s%s%s%s", homedir, basedir, file, ext);
+  snprintf(gpgpath, alllen, "%s%s%s", basedir, file, ext);
   gpgfile = fopen(gpgpath, "rb");
   if (gpgfile == NULL) {
     if (strncmp(lang, "en", 2) == 0) {