Browse Source

Handle structured error codes.

tags/v0.9.3
Michael Brown 18 years ago
parent
commit
cde6d776e3
1 changed files with 63 additions and 8 deletions
  1. 63
    8
      src/hci/strerror.c

+ 63
- 8
src/hci/strerror.c View File

24
 	__table_end ( struct errortab, errortab );
24
 	__table_end ( struct errortab, errortab );
25
 
25
 
26
 /**
26
 /**
27
- * Retrieve string representation of error number.
27
+ * Find error description
28
+ *
29
+ * @v errno		Error number
30
+ * @v mask		Mask of bits that we care about
31
+ * @ret errortab	Error description, or NULL
32
+ */
33
+static struct errortab * find_error ( int errno, int mask ) {
34
+	struct errortab *errortab;
35
+
36
+	for ( errortab = errortab_start ; errortab < errortab_end ;
37
+	      errortab++ ) {
38
+		if ( ( ( errortab->errno ^ errno ) & mask ) == 0 )
39
+			return errortab;
40
+	}
41
+
42
+	return NULL;
43
+}
44
+
45
+/**
46
+ * Find closest error description
28
  *
47
  *
29
  * @v errno		Error number
48
  * @v errno		Error number
49
+ * @ret errortab	Error description, or NULL
50
+ *
51
+ * 
52
+ */
53
+static struct errortab * find_closest_error ( int errno ) {
54
+	struct errortab *errortab;
55
+
56
+	/* First, look for an exact match */
57
+	if ( ( errortab = find_error ( errno, 0x7fffffff ) ) != NULL )
58
+		return errortab;
59
+
60
+	/* Second, try masking off the gPXE-specific bit and seeing if
61
+	 * we have an entry for the generic POSIX error message.
62
+	 */
63
+	if ( ( errortab = find_error ( errno, 0x0000ffff ) ) != NULL )
64
+		return errortab;
65
+
66
+	/* Lastly, try masking off the POSIX bits and seeing if we
67
+	 * have a match just based on the PXENV component.  This
68
+	 * allows us to report errors from underlying PXE stacks.
69
+	 */
70
+	if ( ( errortab = find_error ( ( errno & 0x000000ff ),
71
+				       0xffff00ff ) ) != NULL )
72
+		return errortab;
73
+
74
+	return NULL;
75
+}
76
+
77
+/**
78
+ * Retrieve string representation of error number.
79
+ *
80
+ * @v errno/rc		Error number or return status code
30
  * @ret strerror	Pointer to error text
81
  * @ret strerror	Pointer to error text
31
  *
82
  *
32
  * If the error is not found in the linked-in error tables, generates
83
  * If the error is not found in the linked-in error tables, generates
37
  *
88
  *
38
  */
89
  */
39
 const char * strerror ( int errno ) {
90
 const char * strerror ( int errno ) {
40
-	static char *generic_message = "Error 0x0000";
91
+	static char errbuf[64];
41
 	struct errortab *errortab;
92
 	struct errortab *errortab;
42
 
93
 
43
 	/* Allow for strerror(rc) as well as strerror(errno) */
94
 	/* Allow for strerror(rc) as well as strerror(errno) */
44
 	if ( errno < 0 )
95
 	if ( errno < 0 )
45
 		errno = -errno;
96
 		errno = -errno;
46
 
97
 
47
-	for ( errortab = errortab_start ; errortab < errortab_end ;
48
-	      errortab++ ) {
49
-		if ( errortab->errno == errno )
50
-			return errortab->text;
98
+	/* Find the error description, if one exists */
99
+	errortab = find_closest_error ( errno );
100
+
101
+	/* Construct the error message */
102
+	if ( errortab ) {
103
+		snprintf ( errbuf, sizeof ( errbuf ), "%s (%#08x)",
104
+			   errortab->text, errno );
105
+	} else {
106
+		snprintf ( errbuf, sizeof ( errbuf ), "Error %#08x", errno );
51
 	}
107
 	}
52
 
108
 
53
-	sprintf ( generic_message + 8, "%hx", errno );
54
-	return generic_message;
109
+	return errbuf;
55
 }
110
 }
56
 
111
 
57
 /** The most common errors */
112
 /** The most common errors */

Loading…
Cancel
Save