diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-11-15 12:39:10 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-11-15 12:39:10 +0000 |
commit | af116bb7d7d5a53310e48d196ebe577b9a63f799 (patch) | |
tree | 904c07043b29bc3bcf9c2232276187c9fd1f16b4 /src | |
parent | 4931e4393ebff15289ad282f3d3dd0fba4999986 (diff) | |
download | gdbm-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.in | 4 | ||||
-rw-r--r-- | src/gdbm_load.c | 18 | ||||
-rw-r--r-- | src/gdbmerrno.c | 2 | ||||
-rw-r--r-- | src/gdbmload.c | 19 |
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) |