aboutsummaryrefslogtreecommitdiffstats
path: root/sm/keydb.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2001-11-26 13:08:36 +0000
committerWerner Koch <[email protected]>2001-11-26 13:08:36 +0000
commit99829ef5fbff1c0a4aa9fb0b55b4720b44985c39 (patch)
tree5780ab73d8432dcf7592a6d7a293ad20ac94ccc4 /sm/keydb.c
parentMore error codes (diff)
downloadgnupg-99829ef5fbff1c0a4aa9fb0b55b4720b44985c39.tar.gz
gnupg-99829ef5fbff1c0a4aa9fb0b55b4720b44985c39.zip
* keydb.c (keydb_add_resource): Create keybox
* keylist.c (gpgsm_list_keys): Fixed non-server keylisting. * server.c (rc_to_assuan_status): New. Use it for all commands.
Diffstat (limited to 'sm/keydb.c')
-rw-r--r--sm/keydb.c247
1 files changed, 120 insertions, 127 deletions
diff --git a/sm/keydb.c b/sm/keydb.c
index b6501fe5f..a5f3f41d8 100644
--- a/sm/keydb.c
+++ b/sm/keydb.c
@@ -78,134 +78,130 @@ static void unlock_all (KEYDB_HANDLE hd);
int
keydb_add_resource (const char *url, int force, int secret)
{
- static int any_secret, any_public;
- const char *resname = url;
- char *filename = NULL;
- int rc = 0;
- KeydbResourceType rt = KEYDB_RESOURCE_TYPE_NONE;
-/* const char *created_fname = NULL; */
-
- /* Do we have an URL?
- * gnupg-ring:filename := this is a plain keybox
- * filename := See what is is, but create as plain keybox.
- */
- if (strlen (resname) > 11) {
- if (!strncmp( resname, "gnupg-kbx:", 10) ) {
- rt = KEYDB_RESOURCE_TYPE_KEYBOX;
- resname += 11;
+ static int any_secret, any_public;
+ const char *resname = url;
+ char *filename = NULL;
+ int rc = 0;
+ FILE *fp;
+ KeydbResourceType rt = KEYDB_RESOURCE_TYPE_NONE;
+ const char *created_fname = NULL;
+
+ /* Do we have an URL?
+ gnupg-kbx:filename := this is a plain keybox
+ filename := See what is is, but create as plain keybox.
+ */
+ if (strlen (resname) > 10)
+ {
+ if (!strncmp (resname, "gnupg-kbx:", 10) )
+ {
+ rt = KEYDB_RESOURCE_TYPE_KEYBOX;
+ resname += 10;
}
- #if !defined(HAVE_DRIVE_LETTERS) && !defined(__riscos__)
- else if (strchr (resname, ':')) {
- log_error ("invalid key resource URL `%s'\n", url );
- rc = GNUPG_General_Error;
- goto leave;
+#if !defined(HAVE_DRIVE_LETTERS) && !defined(__riscos__)
+ else if (strchr (resname, ':'))
+ {
+ log_error ("invalid key resource URL `%s'\n", url );
+ rc = GNUPG_General_Error;
+ goto leave;
}
- #endif /* !HAVE_DRIVE_LETTERS && !__riscos__ */
+#endif /* !HAVE_DRIVE_LETTERS && !__riscos__ */
}
- if (*resname != DIRSEP_C ) { /* do tilde expansion etc */
- if (strchr(resname, DIRSEP_C) )
- filename = make_filename (resname, NULL);
- else
- filename = make_filename (opt.homedir, resname, NULL);
+ if (*resname != DIRSEP_C )
+ { /* do tilde expansion etc */
+ if (strchr(resname, DIRSEP_C) )
+ filename = make_filename (resname, NULL);
+ else
+ filename = make_filename (opt.homedir, resname, NULL);
}
- else
- filename = xstrdup (resname);
-
- if (!force)
- force = secret? !any_secret : !any_public;
-
- /* see whether we can determine the filetype */
- if (rt == KEYDB_RESOURCE_TYPE_NONE) {
- FILE *fp2 = fopen( filename, "rb" );
-
- if (fp2) {
- u32 magic;
-
- /* FIXME: check for the keybox magic */
- if (fread( &magic, 4, 1, fp2) == 1 )
- {
- if (magic == 0x13579ace || magic == 0xce9a5713)
- ; /* GDBM magic - no more support */
- else
- rt = KEYDB_RESOURCE_TYPE_KEYBOX;
- }
- else /* maybe empty: assume ring */
+ else
+ filename = xstrdup (resname);
+
+ if (!force)
+ force = secret? !any_secret : !any_public;
+
+ /* see whether we can determine the filetype */
+ if (rt == KEYDB_RESOURCE_TYPE_NONE)
+ {
+ FILE *fp2 = fopen( filename, "rb" );
+
+ if (fp2) {
+ u32 magic;
+
+ /* FIXME: check for the keybox magic */
+ if (fread( &magic, 4, 1, fp2) == 1 )
+ {
+ if (magic == 0x13579ace || magic == 0xce9a5713)
+ ; /* GDBM magic - no more support */
+ else
rt = KEYDB_RESOURCE_TYPE_KEYBOX;
- fclose (fp2);
- }
- else /* no file yet: create ring */
+ }
+ else /* maybe empty: assume ring */
rt = KEYDB_RESOURCE_TYPE_KEYBOX;
+ fclose (fp2);
+ }
+ else /* no file yet: create ring */
+ rt = KEYDB_RESOURCE_TYPE_KEYBOX;
}
-
- switch (rt) {
- case KEYDB_RESOURCE_TYPE_NONE:
- log_error ("unknown type of key resource `%s'\n", url );
- rc = GNUPG_General_Error;
- goto leave;
-
- case KEYDB_RESOURCE_TYPE_KEYBOX:
-#if 0
- fp = fopen (filename);
- if (!iobuf && !force) {
- rc = G10ERR_OPEN_FILE;
- goto leave;
- }
-
- if (!fp) {
- char *last_slash_in_filename;
-
- last_slash_in_filename = strrchr (filename, DIRSEP_C);
- *last_slash_in_filename = 0;
-
- if (access(filename, F_OK)) {
- /* on the first time we try to create the default
+
+ switch (rt)
+ {
+ case KEYDB_RESOURCE_TYPE_NONE:
+ log_error ("unknown type of key resource `%s'\n", url );
+ rc = GNUPG_General_Error;
+ goto leave;
+
+ case KEYDB_RESOURCE_TYPE_KEYBOX:
+ fp = fopen (filename, "rb");
+ if (!fp && !force)
+ {
+ rc = GNUPG_File_Open_Error;
+ goto leave;
+ }
+
+ if (!fp)
+ { /* no file */
+#if 0 /* no autocreate of the homedirectory yet */
+ {
+ char *last_slash_in_filename;
+
+ last_slash_in_filename = strrchr (filename, DIRSEP_C);
+ *last_slash_in_filename = 0;
+ if (access (filename, F_OK))
+ { /* on the first time we try to create the default
homedir and in this case the process will be
- terminated, so that on the next invocation it can
+ terminated, so that on the next invocation can
read the options file in on startup */
- try_make_homedir (filename);
- rc = G10ERR_OPEN_FILE;
- *last_slash_in_filename = DIRSEP_C;
- goto leave;
+ try_make_homedir (filename);
+ rc = GNUPG_File_Open_Error;
+ *last_slash_in_filename = DIRSEP_C;
+ goto leave;
+ }
+ *last_slash_in_filename = DIRSEP_C;
+ }
+#endif
+ fp = fopen (filename, "w");
+ if (!fp)
+ {
+ log_error (_("error creating keybox `%s': %s\n"),
+ filename, strerror(errno));
+ rc = GNUPG_File_Create_Error;
+ goto leave;
}
- *last_slash_in_filename = DIRSEP_C;
-
- iobuf = iobuf_create (filename);
- if (!iobuf) {
- log_error ( _("error creating keybox `%s': %s\n"),
- filename, strerror(errno));
- rc = G10ERR_OPEN_FILE;
- goto leave;
- }
- else {
- #ifndef HAVE_DOSISH_SYSTEM
- if (secret && !opt.preserve_permissionws) {
- if (chmod (filename, S_IRUSR | S_IWUSR) ) {
- log_error (_("changing permission of "
- " `%s' failed: %s\n"),
- filename, strerror(errno) );
- rc = G10ERR_WRITE_FILE;
- goto leave;
- }
- }
- #endif
- if (!opt.quiet)
- log_info (_("keybox `%s' created\n"), filename);
- created_fname = filename;
- }
+ if (!opt.quiet)
+ log_info (_("keybox `%s' created\n"), filename);
+ created_fname = filename;
}
- iobuf_close (iobuf);
- iobuf = NULL;
- if (created_fname) /* must invalidate that ugly cache */
- iobuf_ioctl (NULL, 2, 0, (char*)created_fname);
-#endif
+ fclose (fp);
+ fp = NULL;
+ /* now regsiter the file */
{
void *token = keybox_register_file (filename, secret);
if (!token)
; /* already registered - ignore it */
else if (used_resources >= MAX_KEYDB_RESOURCES)
- rc = GNUPG_Resource_Limit;
+ rc = GNUPG_Resource_Limit;
else
{
all_resources[used_resources].type = rt;
@@ -216,29 +212,26 @@ keydb_add_resource (const char *url, int force, int secret)
}
}
break;
-
- default:
- log_error ("resource type of `%s' not supported\n", url);
- rc = GNUPG_General_Error;
- goto leave;
+ default:
+ log_error ("resource type of `%s' not supported\n", url);
+ rc = GNUPG_Not_Supported;
+ goto leave;
}
- /* fixme: check directory permissions and print a warning */
+ /* fixme: check directory permissions and print a warning */
- leave:
- if (rc)
- log_error ("keyblock resource `%s': %s\n", filename, gnupg_strerror(rc));
- else if (secret)
- any_secret = 1;
- else
- any_public = 1;
- xfree (filename);
- return rc;
+ leave:
+ if (rc)
+ log_error ("keyblock resource `%s': %s\n", filename, gnupg_strerror(rc));
+ else if (secret)
+ any_secret = 1;
+ else
+ any_public = 1;
+ xfree (filename);
+ return rc;
}
-
-
KEYDB_HANDLE
keydb_new (int secret)
{