Date: Wed, 12 Nov 2008 20:13:31 GMT From: Robert Watson <rwatson@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 152891 for review Message-ID: <200811122013.mACKDVFP061816@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=152891 Change 152891 by rwatson@rwatson_cinnamon on 2008/11/12 20:13:30 Go back on decision I made this morning (already): require use the BSM error space for the argument to au_to_return(), au_to_return32(), and au_to_return64(), and return BSM error space values from parsed records. Otherwise, we lose information if the local OS doesn't support a particular error and we parse and then reassemble a record. Instead, teach print_retval() to convert to a local error when trying to print an error string. Update test token generation to convert to the BSM space when generating return tokens. Affected files ... .. //depot/projects/trustedbsd/openbsm/libbsm/bsm_errno.c#6 edit .. //depot/projects/trustedbsd/openbsm/libbsm/bsm_io.c#57 edit .. //depot/projects/trustedbsd/openbsm/libbsm/bsm_token.c#74 edit .. //depot/projects/trustedbsd/openbsm/sys/bsm/audit_internal.h#4 edit .. //depot/projects/trustedbsd/openbsm/test/bsm/generate.c#10 edit Differences ... ==== //depot/projects/trustedbsd/openbsm/libbsm/bsm_errno.c#6 (text+ko) ==== @@ -26,7 +26,7 @@ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * - * $P4: //depot/projects/trustedbsd/openbsm/libbsm/bsm_errno.c#5 $ + * $P4: //depot/projects/trustedbsd/openbsm/libbsm/bsm_errno.c#6 $ */ #include <sys/types.h> @@ -326,21 +326,24 @@ }; static const int bsm_errors_count = sizeof(bsm_errors) / sizeof(bsm_errors[0]); +/* + * Converstion from a BSM error to a local error number may fail if either + * OpenBSM doesn't recognize the error on the wire, or because there is no + * appropriate local mapping. However, we don't allow conversion to BSM to + * fail, we just convert to BSM_UKNOWNERR. + */ int -au_bsm_to_errno(u_char bsm_error) +au_bsm_to_errno(u_char bsm_error, int *errorp) { int i; for (i = 0; i < bsm_errors_count; i++) { - if (bsm_errors[i].be_bsm_error == bsm_error) - return (bsm_errors[i].be_os_error); + if (bsm_errors[i].be_bsm_error == bsm_error) { + *errorp = bsm_errors[i].be_os_error; + return (0); + } } - - /* - * If there is no local match, return EINVAL. Perhaps there is - * something better we could be doing here? - */ - return (EINVAL); + return (-1); } u_char @@ -350,7 +353,17 @@ for (i = 0; i < bsm_errors_count; i++) { if (bsm_errors[i].be_os_error == error) - return (htobe32(bsm_errors[i].be_bsm_error)); + return (bsm_errors[i].be_bsm_error); } return (BSM_UNKNOWNERR); } + +char * +au_strerror(u_char bsm_error) +{ + + switch (bsm_error) { + + + } +} ==== //depot/projects/trustedbsd/openbsm/libbsm/bsm_io.c#57 (text+ko) ==== @@ -32,7 +32,7 @@ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * - * $P4: //depot/projects/trustedbsd/openbsm/libbsm/bsm_io.c#56 $ + * $P4: //depot/projects/trustedbsd/openbsm/libbsm/bsm_io.c#57 $ */ #include <sys/types.h> @@ -771,13 +771,24 @@ static void print_retval(FILE *fp, u_char status, char raw) { + int error; + if (raw) fprintf(fp, "%u", status); else { - if (status == 0) - fprintf(fp, "success"); - else - fprintf(fp, "failure : %s", strerror(status)); + /* + * Convert to a local error number and print the OS's version + * of the error string if possible. We may want to provide + * an au_strerror(3) in the future so that we can print + * strings for non-local errors. + */ + if (au_bsm_to_errno(status, &error) == 0) { + if (error == 0) + fprintf(fp, "success"); + else + fprintf(fp, "failure : %s", strerror(error)); + } else + fprintf(fp, "failure: Unknown error: %d", status); } } @@ -2946,7 +2957,6 @@ READ_TOKEN_U_CHAR(buf, len, tok->tt.ret32.status, tok->len, err); if (err) return (-1); - tok->tt.ret32.status = au_bsm_to_errno(tok->tt.ret32.status); READ_TOKEN_U_INT32(buf, len, tok->tt.ret32.ret, tok->len, err); if (err) @@ -2985,7 +2995,6 @@ READ_TOKEN_U_CHAR(buf, len, tok->tt.ret64.err, tok->len, err); if (err) return (-1); - tok->tt.ret64.err = au_bsm_to_errno(tok->tt.ret64.err); READ_TOKEN_U_INT64(buf, len, tok->tt.ret64.val, tok->len, err); if (err) ==== //depot/projects/trustedbsd/openbsm/libbsm/bsm_token.c#74 (text+ko) ==== @@ -30,7 +30,7 @@ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * - * $P4: //depot/projects/trustedbsd/openbsm/libbsm/bsm_token.c#73 $ + * $P4: //depot/projects/trustedbsd/openbsm/libbsm/bsm_token.c#74 $ */ #include <sys/types.h> @@ -846,7 +846,6 @@ if (t == NULL) return (NULL); - status = au_errno_to_bsm(status); ADD_U_CHAR(dptr, AUT_RETURN32); ADD_U_CHAR(dptr, status); ADD_U_INT32(dptr, ret); @@ -864,7 +863,6 @@ if (t == NULL) return (NULL); - status = au_errno_to_bsm(status); ADD_U_CHAR(dptr, AUT_RETURN64); ADD_U_CHAR(dptr, status); ADD_U_INT64(dptr, ret); ==== //depot/projects/trustedbsd/openbsm/sys/bsm/audit_internal.h#4 (text+ko) ==== @@ -30,7 +30,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $P4: //depot/projects/trustedbsd/openbsm/sys/bsm/audit_internal.h#3 $ + * $P4: //depot/projects/trustedbsd/openbsm/sys/bsm/audit_internal.h#4 $ */ #ifndef _AUDIT_INTERNAL_H @@ -117,7 +117,7 @@ /* * Map between BSM and local constants for error numbers. */ -int au_bsm_to_errno(u_char bsm_error); +int au_bsm_to_errno(u_char bsm_error, int *errorp); u_char au_errno_to_bsm(int error); #endif /* !_AUDIT_INTERNAL_H_ */ ==== //depot/projects/trustedbsd/openbsm/test/bsm/generate.c#10 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $P4: //depot/projects/trustedbsd/openbsm/test/bsm/generate.c#9 $ + * $P4: //depot/projects/trustedbsd/openbsm/test/bsm/generate.c#10 $ */ /* @@ -553,7 +553,7 @@ free(buf); } -static char return32_status = 0xd7; +static char return32_status = EINVAL; static uint32_t return32_ret = 0x12345678; static void @@ -561,7 +561,8 @@ { token_t *return32_token; - return32_token = au_to_return32(return32_status, return32_ret); + return32_token = au_to_return32(au_errno_to_bsm(return32_status), + return32_ret); if (return32_token == NULL) err(EX_UNAVAILABLE, "au_to_return32"); write_token(directory, token_filename, return32_token); @@ -572,7 +573,8 @@ { token_t *return32_token; - return32_token = au_to_return32(return32_status, return32_ret); + return32_token = au_to_return32(au_errno_to_bsm(return32_status), + return32_ret); if (return32_token == NULL) err(EX_UNAVAILABLE, "au_to_return32"); write_record(directory, record_filename, return32_token, AUE_NULL);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200811122013.mACKDVFP061816>