]> Nishi Git Mirror - sp.git/commitdiff
ちんちん
author諏訪子 <suwako@076.moe>
Wed, 29 Nov 2023 15:10:25 +0000 (00:10 +0900)
committer諏訪子 <suwako@076.moe>
Wed, 29 Nov 2023 15:10:25 +0000 (00:10 +0900)
addpass.c
main.c
showpass.c

index 8a207af23bf2f20596ee19e2eeeb0b404c7855f3..3ac8e019efc78686b3cec7612899948de0dc508e 100644 (file)
--- a/addpass.c
+++ b/addpass.c
 
 #include "addpass.h"
 
+void cleanup(gpgme_ctx_t ctx, gpgme_key_t key, gpgme_data_t in, gpgme_data_t out) {
+  gpgme_data_release(in);
+  gpgme_data_release(out);
+  gpgme_release(ctx);
+  gpgme_key_release(key);
+}
+
 int mkdir_r(const char *path, mode_t mode) {
   char tmp[256];
   char *p = NULL;
@@ -120,6 +127,7 @@ void addpass(char* file) {
   }
 
   char* basedir = "/.local/share/sp/";
+  char* ext = ".gpg";
 
   // 鍵を受け取る
   char keypath[256];
@@ -163,22 +171,15 @@ void addpass(char* file) {
   err = gpgme_op_encrypt(ctx, &key[0], GPGME_ENCRYPT_ALWAYS_TRUST, in, out);
   if (err) {
     fprintf(stderr, "暗号化に失敗: %s\n", gpgme_strerror(err));
-    gpgme_data_release(in);
-    gpgme_data_release(out);
-    gpgme_release(ctx);
-    gpgme_key_release(key[0]);
+    cleanup(ctx, key[0], in, out);
     return;
   }
 
   // 暗号化したタイルを開く
-  char* ext = ".gpg";
   int alllen = snprintf(NULL, 0, "%s%s%s%s", homedir, basedir, file, ext) + 1;
   char* gpgpath = malloc(alllen);
   if (gpgpath == NULL) {
-    gpgme_data_release(in);
-    gpgme_data_release(out);
-    gpgme_release(ctx);
-    gpgme_key_release(key[0]);
+    cleanup(ctx, key[0], in, out);
     perror("メモリを割当に失敗。");
     return;
   }
@@ -193,25 +194,19 @@ void addpass(char* file) {
     *lastsla = '\0';
     if (mkdir_r(dirpath, 0755) != 0) {
       free(gpgpath);
-      gpgme_data_release(in);
-      gpgme_data_release(out);
-      gpgme_release(ctx);
-      gpgme_key_release(key[0]);
+      cleanup(ctx, key[0], in, out);
       perror("ディレクトリを創作に失敗。");
       return;
     }
   }
 
-  sprintf(gpgpath, "%s%s%s%s", homedir, basedir, file, ext);
+  snprintf(gpgpath, alllen, "%s%s%s%s", homedir, basedir, file, ext);
   gpgfile = fopen(gpgpath, "wb");
   if (gpgfile == NULL) {
     perror("ファイルを開くに失敗。");
     printf("失敗したパス: %s\n", gpgpath);
     free(gpgpath);
-    gpgme_data_release(in);
-    gpgme_data_release(out);
-    gpgme_release(ctx);
-    gpgme_key_release(key[0]);
+    cleanup(ctx, key[0], in, out);
     return;
   }
 
@@ -221,10 +216,7 @@ void addpass(char* file) {
     fprintf(stderr, "データを保存に失敗。\n");
     fclose(gpgfile);
     free(gpgpath);
-    gpgme_data_release(in);
-    gpgme_data_release(out);
-    gpgme_release(ctx);
-    gpgme_key_release(key[0]);
+    cleanup(ctx, key[0], in, out);
     return;
   }
 
@@ -240,10 +232,7 @@ void addpass(char* file) {
   // 掃除
   fclose(gpgfile);
   free(gpgpath);
-  gpgme_data_release(in);
-  gpgme_data_release(out);
-  gpgme_release(ctx);
-  gpgme_key_release(key[0]);
+  cleanup(ctx, key[0], in, out);
 
   printf("パスワードを保存出来ました。\n");
 }
diff --git a/main.c b/main.c
index a1ccf4eea691fa2ab65e82eb9f579c44411d9783..d2f8682bc4f11a8e1ab073ccf909a9900089a054 100644 (file)
--- a/main.c
+++ b/main.c
@@ -35,7 +35,7 @@ void helpme() {
 int main (int argc, char* argv[]) {
   if (argc < 2) {
     helpme();
-    return 1;
+    return 0;
   }
 
   if (argc == 3 && strcmp(argv[1], "-i") == 0) printf("TODO: 初期設定\n");
index 8cb8dc852e23fd9dea62936d1d7ffde410ce7cc7..e9a01d4822c5fe0a56ce5b87a5577618be255f12 100644 (file)
@@ -6,6 +6,14 @@
 
 #include "showpass.h"
 
+void clean_up(gpgme_ctx_t ctx, gpgme_data_t in, gpgme_data_t out, FILE* gpgfile, char* gpgpath) {
+  if (gpgfile) fclose(gpgfile);
+  if (gpgpath) free(gpgpath);
+  gpgme_data_release(in);
+  gpgme_data_release(out);
+  gpgme_release(ctx);
+}
+
 void showpass(char* file) {
   gpgme_ctx_t ctx;
   gpgme_error_t err;
@@ -51,7 +59,12 @@ void showpass(char* file) {
     free(gpgpath);
     return;
   }
-  gpgme_data_new_from_stream(&in, gpgfile);
+
+  if (gpgme_data_new_from_stream(&in, gpgfile) != GPG_ERR_NO_ERROR || gpgme_data_new(&out) != GPG_ERR_NO_ERROR) {
+    fprintf(stderr, "GPGMEデータオブジェクトを創作に失敗。\n");
+    clean_up(ctx, in, out, gpgfile, gpgpath);
+    return;
+  }
 
   // データオブジェクトを創作
   gpgme_data_new(&out);
@@ -62,29 +75,20 @@ void showpass(char* file) {
     fprintf(stderr, "復号化に失敗: %s\n", gpgme_strerror(err));
 
     // 掃除
-    fclose(gpgfile);
-    free(gpgpath);
-    gpgme_data_release(in);
-    gpgme_data_release(out);
-    gpgme_release(ctx);
+    clean_up(ctx, in, out, gpgfile, gpgpath);
     return;
   }
 
   // 復号化したパスワードを表示する
   gpgme_data_seek(out, 0, SEEK_SET);
-
   char buffer[512];
   ssize_t read_bytes;
-  while ((read_bytes = gpgme_data_read(out, buffer, sizeof(buffer))) > 0) {
+  while ((read_bytes = gpgme_data_read(out, buffer, sizeof(buffer) - 1)) > 0) {
     buffer[read_bytes] = '\0';
     printf("%s", buffer);
   }
   puts("");
 
   // 掃除
-  fclose(gpgfile);
-  free(gpgpath);
-  gpgme_data_release(in);
-  gpgme_data_release(out);
-  gpgme_release(ctx);
+  clean_up(ctx, in, out, gpgfile, gpgpath);
 }