error: Add error_set_win32 and error_setg_win32
These functions help maintaining homogeneous formatting of error messages with Windows error code and description (generated by g_win32_error_message()). Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@hds.com> Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com> Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
		
							parent
							
								
									d9840e2592
								
							
						
					
					
						commit
						20840d4cfe
					
				@ -36,6 +36,15 @@ void error_set(Error **err, ErrorClass err_class, const char *fmt, ...) GCC_FMT_
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
void error_set_errno(Error **err, int os_error, ErrorClass err_class, const char *fmt, ...) GCC_FMT_ATTR(4, 5);
 | 
					void error_set_errno(Error **err, int os_error, ErrorClass err_class, const char *fmt, ...) GCC_FMT_ATTR(4, 5);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef _WIN32
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Set an indirect pointer to an error given a ErrorClass value and a
 | 
				
			||||||
 | 
					 * printf-style human message, followed by a g_win32_error_message() string if
 | 
				
			||||||
 | 
					 * @win32_err is not zero.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void error_set_win32(Error **err, int win32_err, ErrorClass err_class, const char *fmt, ...) GCC_FMT_ATTR(4, 5);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Same as error_set(), but sets a generic error
 | 
					 * Same as error_set(), but sets a generic error
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@ -43,6 +52,10 @@ void error_set_errno(Error **err, int os_error, ErrorClass err_class, const char
 | 
				
			|||||||
    error_set(err, ERROR_CLASS_GENERIC_ERROR, fmt, ## __VA_ARGS__)
 | 
					    error_set(err, ERROR_CLASS_GENERIC_ERROR, fmt, ## __VA_ARGS__)
 | 
				
			||||||
#define error_setg_errno(err, os_error, fmt, ...) \
 | 
					#define error_setg_errno(err, os_error, fmt, ...) \
 | 
				
			||||||
    error_set_errno(err, os_error, ERROR_CLASS_GENERIC_ERROR, fmt, ## __VA_ARGS__)
 | 
					    error_set_errno(err, os_error, ERROR_CLASS_GENERIC_ERROR, fmt, ## __VA_ARGS__)
 | 
				
			||||||
 | 
					#ifdef _WIN32
 | 
				
			||||||
 | 
					#define error_setg_win32(err, win32_err, fmt, ...) \
 | 
				
			||||||
 | 
					    error_set_win32(err, win32_err, ERROR_CLASS_GENERIC_ERROR, fmt, ## __VA_ARGS__)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Helper for open() errors
 | 
					 * Helper for open() errors
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										35
									
								
								util/error.c
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								util/error.c
									
									
									
									
									
								
							@ -76,6 +76,41 @@ void error_setg_file_open(Error **errp, int os_errno, const char *filename)
 | 
				
			|||||||
    error_setg_errno(errp, os_errno, "Could not open '%s'", filename);
 | 
					    error_setg_errno(errp, os_errno, "Could not open '%s'", filename);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef _WIN32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void error_set_win32(Error **errp, int win32_err, ErrorClass err_class,
 | 
				
			||||||
 | 
					                     const char *fmt, ...)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    Error *err;
 | 
				
			||||||
 | 
					    char *msg1;
 | 
				
			||||||
 | 
					    va_list ap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (errp == NULL) {
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    assert(*errp == NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    err = g_malloc0(sizeof(*err));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    va_start(ap, fmt);
 | 
				
			||||||
 | 
					    msg1 = g_strdup_vprintf(fmt, ap);
 | 
				
			||||||
 | 
					    if (win32_err != 0) {
 | 
				
			||||||
 | 
					        char *msg2 = g_win32_error_message(win32_err);
 | 
				
			||||||
 | 
					        err->msg = g_strdup_printf("%s: %s (error: %x)", msg1, msg2,
 | 
				
			||||||
 | 
					                                   (unsigned)win32_err);
 | 
				
			||||||
 | 
					        g_free(msg2);
 | 
				
			||||||
 | 
					        g_free(msg1);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        err->msg = msg1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    va_end(ap);
 | 
				
			||||||
 | 
					    err->err_class = err_class;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    *errp = err;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Error *error_copy(const Error *err)
 | 
					Error *error_copy(const Error *err)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    Error *err_new;
 | 
					    Error *err_new;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user