aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2011-11-15 12:39:10 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2011-11-15 12:39:10 +0000
commitaf116bb7d7d5a53310e48d196ebe577b9a63f799 (patch)
tree904c07043b29bc3bcf9c2232276187c9fd1f16b4 /src
parent4931e4393ebff15289ad282f3d3dd0fba4999986 (diff)
downloadgdbm-af116bb7d7d5a53310e48d196ebe577b9a63f799.tar.gz
gdbm-af116bb7d7d5a53310e48d196ebe577b9a63f799.tar.bz2
Return a meaningful error code if failed to restore file's metadata.
* src/gdbm.h.in (GDBM_ERR_FILE_OWNER) (GDBM_ERR_FILE_MODE): New error codes. (_GDBM_MAX_ERRNO): Update. * src/gdbmerrno.c (gdbm_errlist): Add new error codes. * src/gdbmload.c (_set_gdbm_meta_info): Set gdbm_errno and return 1 in case of errors. (_gdbm_load_file): Propagate the return value from _set_gdbm_meta_info. * src/gdbm_load.c (main): Handle mild error conditions. * export/export.c (usage): Print the GDBM version the program is linked with. * doc/gdbm.texinfo: Document changes.
Diffstat (limited to 'src')
-rw-r--r--src/gdbm.h.in4
-rw-r--r--src/gdbm_load.c18
-rw-r--r--src/gdbmerrno.c2
-rw-r--r--src/gdbmload.c19
4 files changed, 32 insertions, 11 deletions
diff --git a/src/gdbm.h.in b/src/gdbm.h.in
index 81e9943..b81516d 100644
--- a/src/gdbm.h.in
+++ b/src/gdbm.h.in
@@ -159,9 +159,11 @@ extern int gdbm_load_from_file (GDBM_FILE *, FILE *, int replace,
# define GDBM_FILE_STAT_ERROR 24
# define GDBM_FILE_EOF 25
# define GDBM_NO_DBNAME 26
+# define GDBM_ERR_FILE_OWNER 27
+# define GDBM_ERR_FILE_MODE 28
# define _GDBM_MIN_ERRNO 0
-# define _GDBM_MAX_ERRNO GDBM_NO_DBNAME
+# define _GDBM_MAX_ERRNO GDBM_ERR_FILE_MODE
typedef int gdbm_error; /* For compatibilities sake. */
extern gdbm_error gdbm_errno;
extern const char * const gdbm_errlist[];
diff --git a/src/gdbm_load.c b/src/gdbm_load.c
index 4e14207..cdc7302 100644
--- a/src/gdbm_load.c
+++ b/src/gdbm_load.c
@@ -116,10 +116,20 @@ main (int argc, char **argv)
rc = gdbm_load_from_file (&dbf, fp, replace, &err_line);
if (rc)
{
- if (err_line)
- gdbm_perror ("%s:%lu", filename, err_line);
- else
- gdbm_perror ("cannot load from %s", filename);
+ switch (gdbm_errno)
+ {
+ case GDBM_ERR_FILE_OWNER:
+ case GDBM_ERR_FILE_MODE:
+ error (_("error restoring metadata for %s: %s (%s)"),
+ filename, gdbm_strerror (gdbm_errno), strerror (errno));
+ break;
+
+ default:
+ if (err_line)
+ gdbm_perror ("%s:%lu", filename, err_line);
+ else
+ gdbm_perror (_("cannot load from %s"), filename);
+ }
}
if (dbf)
diff --git a/src/gdbmerrno.c b/src/gdbmerrno.c
index de1aab7..6829a3a 100644
--- a/src/gdbmerrno.c
+++ b/src/gdbmerrno.c
@@ -55,6 +55,8 @@ const char * const gdbm_errlist[_GDBM_MAX_ERRNO+1] = {
N_("Cannot stat file"), /* GDBM_FILE_STAT_ERROR */
N_("Unexpected end of file"), /* GDBM_FILE_EOF */
N_("Database name not given"), /* GDBM_NO_DBNAME */
+ N_("Failed to restore file owner"), /* GDBM_ERR_FILE_OWNER */
+ N_("Failed to restore file mode"), /* GDBM_ERR_FILE_MODE */
};
const char *
diff --git a/src/gdbmload.c b/src/gdbmload.c
index afd4866..1e9cb06 100644
--- a/src/gdbmload.c
+++ b/src/gdbmload.c
@@ -264,7 +264,7 @@ read_record (struct dump_file *file, char *param, int n, datum *dat)
rc = get_len (param, &len);
if (rc)
return rc;
- dat->dsize = len; // FIXME: data type mismatch
+ dat->dsize = len; /* FIXME: data type mismatch */
rc = get_data (file);
if (rc)
return rc;
@@ -294,7 +294,8 @@ _set_gdbm_meta_info (GDBM_FILE dbf, char *param)
int meta_flags = 0;
const char *p;
char *end;
-
+ int rc = 0;
+
p = getparm (param, "user");
if (p)
{
@@ -365,12 +366,18 @@ _set_gdbm_meta_info (GDBM_FILE dbf, char *param)
owner_gid = st.st_gid;
}
if (fchown (fd, owner_uid, owner_gid))
- /* FIXME: set error code */;
+ {
+ gdbm_errno = GDBM_ERR_FILE_OWNER;
+ rc = 1;
+ }
}
if ((meta_flags & META_MODE) && fchmod (fd, mode))
- /* FIXME: set error code */;
+ {
+ gdbm_errno = GDBM_ERR_FILE_OWNER;
+ rc = 1;
+ }
}
- return 0;
+ return rc;
}
int
@@ -432,7 +439,7 @@ _gdbm_load_file (struct dump_file *file, GDBM_FILE dbf, GDBM_FILE *ofp,
if (rc == 0)
{
- _set_gdbm_meta_info (dbf, file->header);
+ rc = _set_gdbm_meta_info (dbf, file->header);
*ofp = dbf;
}
else if (tmp)

Return to:

Send suggestions and report system problems to the System administrator.