On 08/26/2009 10:06 PM, Pete Zaitcev wrote:
Signed-off-by: Pete Zaitcev<zaitcev@xxxxxxxxxx>
applied a modified version, see attached... after that short IRC discussion, I think an array with a range check would be nicer than coding it (though the C compiler should make a nice, efficient table from 'switch' statement for us...)
Jeff
commit 469aeb041c69c43dda1051e5911c47b5dbc78721 Author: Pete Zaitcev <zaitcev@xxxxxxxxxx> Date: Wed Aug 26 22:19:02 2009 -0400 libcldc, cldcli: Use humanized error messages Signed-off-by: Pete Zaitcev <zaitcev@xxxxxxxxxx> [slight change, error messages kept in array -jg] Signed-off-by: Jeff Garzik <jgarzik@xxxxxxxxxx> diff --git a/include/cld_msg.h b/include/cld_msg.h index 01bda16..e4c8f28 100644 --- a/include/cld_msg.h +++ b/include/cld_msg.h @@ -257,5 +257,6 @@ struct cld_msg_event { extern unsigned long long cld_sid2llu(const uint8_t *sid); extern void __cld_rand64(void *p); +extern const char *cld_errstr(enum cle_err_codes ecode); #endif /* __CLD_MSG_H__ */ diff --git a/lib/common.c b/lib/common.c index fac652b..a4eda54 100644 --- a/lib/common.c +++ b/lib/common.c @@ -4,6 +4,9 @@ #include <cld-private.h> #include "cld_msg.h" +/* duplicated from tools/cldcli.c; put in common header somewhere? */ +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) + unsigned long long cld_sid2llu(const uint8_t *sid) { const uint64_t *v_le = (const uint64_t *) sid; @@ -19,3 +22,34 @@ void __cld_rand64(void *p) v[1] = rand(); } +static const char *cld_errlist[] = +{ + [CLE_OK] = "Success", + [CLE_SESS_EXISTS] = "Session exists", + [CLE_SESS_INVAL] = "Invalid session", + [CLE_DB_ERR] = "Database error", + [CLE_BAD_PKT] = "Invalid/corrupted packet", + [CLE_INODE_INVAL] = "Invalid inode number", + [CLE_NAME_INVAL] = "Invalid file name", + [CLE_OOM] = "Server out of memory", + [CLE_FH_INVAL] = "Invalid file handle", + [CLE_DATA_INVAL] = "Invalid data packet", + [CLE_LOCK_INVAL] = "Invalid lock", + [CLE_LOCK_CONFLICT] = "Conflicting lock held", + [CLE_LOCK_PENDING] = "Lock waiting to be acquired", + [CLE_MODE_INVAL] = "Operation incompatible with file mode", + [CLE_INODE_EXISTS] = "File exists", + [CLE_DIR_NOTEMPTY] = "Directory not empty", + [CLE_INTERNAL_ERR] = "Internal error", + [CLE_TIMEOUT] = "Session timed out", + [CLE_SIG_INVAL] = "Bad HMAC signature", +}; + +const char *cld_errstr(enum cle_err_codes ecode) +{ + if (ecode >= ARRAY_SIZE(cld_errlist)) + return "(unknown)"; + + return cld_errlist[ecode]; +} + diff --git a/tools/cldcli.c b/tools/cldcli.c index 635bc6e..eb4ebc4 100644 --- a/tools/cldcli.c +++ b/tools/cldcli.c @@ -66,9 +66,11 @@ struct creq { struct cp_fc_info *cfi; }; +enum { CRESP_MSGSZ = 64 }; + struct cresp { enum thread_codes tcode; - char msg[64]; + char msg[CRESP_MSGSZ]; union { size_t file_len; unsigned int n_records; @@ -117,31 +119,10 @@ static error_t parse_opt (int key, char *arg, struct argp_state *state); static const struct argp argp = { options, parse_opt, NULL, doc }; -static const char *names_cle_err[] = { - [CLE_OK] = "CLE_OK", - [CLE_SESS_EXISTS] = "CLE_SESS_EXISTS", - [CLE_SESS_INVAL] = "CLE_SESS_INVAL", - [CLE_DB_ERR] = "CLE_DB_ERR", - [CLE_BAD_PKT] = "CLE_BAD_PKT", - [CLE_INODE_INVAL] = "CLE_INODE_INVAL", - [CLE_NAME_INVAL] = "CLE_NAME_INVAL", - [CLE_OOM] = "CLE_OOM", - [CLE_FH_INVAL] = "CLE_FH_INVAL", - [CLE_DATA_INVAL] = "CLE_DATA_INVAL", - [CLE_LOCK_INVAL] = "CLE_LOCK_INVAL", - [CLE_LOCK_CONFLICT] = "CLE_LOCK_CONFLICT", - [CLE_LOCK_PENDING] = "CLE_LOCK_PENDING", - [CLE_MODE_INVAL] = "CLE_MODE_INVAL", - [CLE_INODE_EXISTS] = "CLE_INODE_EXISTS", - [CLE_DIR_NOTEMPTY] = "CLE_DIR_NOTEMPTY", - [CLE_INTERNAL_ERR] = "CLE_INTERNAL_ERR", - [CLE_TIMEOUT] = "CLE_TIMEOUT", - [CLE_SIG_INVAL] = "CLE_SIG_INVAL", -}; - static void errc_msg(struct cresp *cresp, enum cle_err_codes errc) { - strcpy(cresp->msg, names_cle_err[errc]); + strncpy(cresp->msg, cld_errstr(errc), CRESP_MSGSZ); + cresp->msg[CRESP_MSGSZ-1] = 0; } static void applog(int prio, const char *fmt, ...)