Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/amachronic/microtar.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAidan MacDonald <amachronic@protonmail.com>2021-11-06 17:05:48 +0300
committerAidan MacDonald <amachronic@protonmail.com>2021-11-06 17:05:48 +0300
commit862f4c1468debea982882759e0e50a7f49b00d79 (patch)
tree59f6efcedb0a1323f21e6e22e299f33e75617d59
parent8e4b2750c0b43bc55d6ef1403b569e6ab6ac10c8 (diff)
Add EACCESS error and use it
Return this error if using an archive in the wrong access mode, ie. write to an archive opened for reading, or vice-versa. Previously EAPI was returned which is probably not as useful.
-rw-r--r--src/microtar.c17
-rw-r--r--src/microtar.h1
2 files changed, 11 insertions, 7 deletions
diff --git a/src/microtar.c b/src/microtar.c
index 0653adb..3856437 100644
--- a/src/microtar.c
+++ b/src/microtar.c
@@ -297,6 +297,7 @@ const char* mtar_strerror(int err)
case MTAR_EAPI: return "API usage error";
case MTAR_ENAMETOOLONG: return "name too long";
case MTAR_ETOOSHORT: return "file too short";
+ case MTAR_EACCESS: return "wrong access mode";
default: return "unknown error";
}
}
@@ -348,7 +349,7 @@ int mtar_rewind(mtar_t* tar)
int mtar_next(mtar_t* tar)
{
if(tar->access != MTAR_READ)
- return MTAR_EAPI;
+ return MTAR_EACCESS;
if(tar->state & S_HEADER_VALID) {
tar->state &= ~S_HEADER_VALID;
@@ -365,7 +366,7 @@ int mtar_next(mtar_t* tar)
int mtar_foreach(mtar_t* tar, mtar_foreach_cb cb, void* arg)
{
if(tar->access != MTAR_READ)
- return MTAR_EAPI;
+ return MTAR_EACCESS;
int err = mtar_rewind(tar);
if(err)
@@ -402,7 +403,7 @@ int mtar_find(mtar_t* tar, const char* name)
int mtar_read_data(mtar_t* tar, void* ptr, unsigned size)
{
if(tar->access != MTAR_READ)
- return MTAR_EAPI;
+ return MTAR_EACCESS;
if(!(tar->state & S_HEADER_VALID))
return MTAR_EAPI;
@@ -422,7 +423,7 @@ int mtar_read_data(mtar_t* tar, void* ptr, unsigned size)
int mtar_seek_data(mtar_t* tar, int offset, int whence)
{
if(tar->access != MTAR_READ)
- return MTAR_EAPI;
+ return MTAR_EACCESS;
if(!(tar->state & S_HEADER_VALID))
return MTAR_EAPI;
@@ -474,7 +475,7 @@ int mtar_eof_data(mtar_t* tar)
int mtar_write_header(mtar_t* tar, const mtar_header_t* h)
{
if(tar->access != MTAR_WRITE)
- return MTAR_EAPI;
+ return MTAR_EACCESS;
if(((tar->state & S_WROTE_DATA) && !(tar->state & S_WROTE_DATA_EOF)) ||
(tar->state & S_WROTE_FINALIZE))
return MTAR_EAPI;
@@ -536,6 +537,8 @@ int mtar_write_dir_header(mtar_t* tar, const char* name)
int mtar_write_data(mtar_t* tar, const void* ptr, unsigned size)
{
+ if(tar->access != MTAR_WRITE)
+ return MTAR_EACCESS;
if(!(tar->state & S_WROTE_HEADER) ||
(tar->state & S_WROTE_DATA_EOF) ||
(tar->state & S_WROTE_FINALIZE))
@@ -558,7 +561,7 @@ int mtar_write_data(mtar_t* tar, const void* ptr, unsigned size)
int mtar_end_data(mtar_t* tar)
{
if(tar->access != MTAR_WRITE)
- return MTAR_EAPI;
+ return MTAR_EACCESS;
if((tar->state & S_WROTE_DATA_EOF) ||
(tar->state & S_WROTE_FINALIZE))
return MTAR_EAPI;
@@ -578,7 +581,7 @@ int mtar_end_data(mtar_t* tar)
int mtar_finalize(mtar_t* tar)
{
if(tar->access != MTAR_WRITE)
- return MTAR_EAPI;
+ return MTAR_EACCESS;
if(((tar->state & S_WROTE_DATA) && !(tar->state & S_WROTE_DATA_EOF)) ||
(tar->state & S_WROTE_FINALIZE))
return MTAR_EAPI;
diff --git a/src/microtar.h b/src/microtar.h
index 6197a3d..12e43e0 100644
--- a/src/microtar.h
+++ b/src/microtar.h
@@ -45,6 +45,7 @@ enum mtar_error {
MTAR_EAPI = -12,
MTAR_ENAMETOOLONG = -13,
MTAR_ETOOSHORT = -14,
+ MTAR_EACCESS = -15,
MTAR_ELAST = MTAR_ETOOSHORT,
};