1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
2 /*
3  *
4  *   Copyright (C) 1997 University of Chicago.
5  *   See COPYRIGHT notice in top-level directory.
6  */
7 
8 #include "adio.h"
9 #include "adio_extern.h"
10 
11 /* NOTE: THIS FUNCTION IS DEPRECATED AND ONLY EXISTS HERE BECAUSE
12  * SOME DEPRECATED ADIO IMPLEMENTATIONS STILL CALL IT (SFS, HFS, PIOFS).
13  */
ADIOI_Error(ADIO_File fd,int error_code,char * string)14 int ADIOI_Error(ADIO_File fd, int error_code, char *string)
15 {
16     char buf[MPI_MAX_ERROR_STRING];
17     int myrank, result_len;
18     MPI_Errhandler err_handler;
19 
20     if (fd == ADIO_FILE_NULL) err_handler = ADIOI_DFLT_ERR_HANDLER;
21     else err_handler = fd->err_handler;
22 
23     MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
24     if (err_handler == MPI_ERRORS_ARE_FATAL) {
25 	MPI_Error_string(error_code, buf, &result_len);
26 	FPRINTF(stderr, "[%d] - %s : %s\n", myrank, string, buf);
27 	MPI_Abort(MPI_COMM_WORLD, 1);
28     }
29     else if (err_handler != MPI_ERRORS_RETURN) {
30 	/* MPI_File_call_errorhandler(fd, error_code); */
31 
32 	FPRINTF(stderr, "Only MPI_ERRORS_RETURN and MPI_ERRORS_ARE_FATAL are currently supported as error handlers for files\n");
33 	MPI_Abort(MPI_COMM_WORLD, 1);
34     }
35 
36     return error_code;
37 }
38 /* Check for special error codes for those MPI error
39    classes that relate to particular problems.
40    Returns an MPI error code corresponding to "my_errno", for function "myname"
41  * and the given file, "filename".  */
ADIOI_Err_create_code(const char * myname,const char * filename,int my_errno)42 int ADIOI_Err_create_code(const char *myname, const char *filename, int my_errno)
43 {
44     int error_code = MPI_SUCCESS;
45     if(!my_errno) return MPI_SUCCESS;
46 
47     /* --BEGIN ERROR HANDLING-- */
48     switch(my_errno) {
49         case EACCES:
50             error_code = MPIO_Err_create_code(MPI_SUCCESS,
51                                               MPIR_ERR_RECOVERABLE, myname,
52                                               __LINE__, MPI_ERR_ACCESS,
53                                               "**fileaccess",
54                                               "**fileaccess %s",
55                                               filename );
56             break;
57         case ENAMETOOLONG:
58             error_code = MPIO_Err_create_code(MPI_SUCCESS,
59                                               MPIR_ERR_RECOVERABLE, myname,
60                                               __LINE__, MPI_ERR_BAD_FILE,
61                                               "**filenamelong",
62                                               "**filenamelong %s %d",
63                                               filename,
64                                               strlen(filename));
65             break;
66         case ENOENT:
67             error_code = MPIO_Err_create_code(MPI_SUCCESS,
68                                               MPIR_ERR_RECOVERABLE, myname,
69                                               __LINE__, MPI_ERR_NO_SUCH_FILE,
70                                               "**filenoexist",
71                                               "**filenoexist %s",
72                                               filename);
73             break;
74         case EISDIR:
75             error_code = MPIO_Err_create_code(MPI_SUCCESS,
76                                               MPIR_ERR_RECOVERABLE,
77                                               myname, __LINE__,
78                                               MPI_ERR_BAD_FILE,
79                                               "**filenamedir",
80                                               "**filenamedir %s",
81                                               filename);
82             break;
83         case EROFS:
84 	    /* Read only file or file system and write access requested */
85             error_code = MPIO_Err_create_code(MPI_SUCCESS,
86                                               MPIR_ERR_RECOVERABLE, myname,
87                                               __LINE__, MPI_ERR_READ_ONLY,
88                                               "**ioneedrd", 0 );
89             break;
90         case EEXIST:
91             error_code = MPIO_Err_create_code(MPI_SUCCESS,
92                                               MPIR_ERR_RECOVERABLE, myname,
93                                               __LINE__, MPI_ERR_FILE_EXISTS,
94                                               "**fileexist", 0);
95             break;
96 	case ENOTDIR:
97 	case ELOOP:
98 	    error_code = MPIO_Err_create_code(MPI_SUCCESS,
99 					       MPIR_ERR_RECOVERABLE,
100 					       myname, __LINE__,
101 					       MPI_ERR_BAD_FILE,
102 					       "**filenamedir",
103 					       "**filenamedir %s",
104 					       filename);
105             break;
106 	case ENOSPC:
107 	    error_code = MPIO_Err_create_code(MPI_SUCCESS,
108 		    MPIR_ERR_RECOVERABLE, myname, __LINE__,
109 		    MPI_ERR_NO_SPACE,
110 		    "**filenospace", 0);
111 	    break;
112 	case EDQUOT:
113 	    error_code = MPIO_Err_create_code(MPI_SUCCESS,
114 		    MPIR_ERR_RECOVERABLE, myname, __LINE__,
115 		    MPI_ERR_QUOTA,
116 		    "**filequota", 0);
117 
118         default:
119             error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
120                                               myname, __LINE__, MPI_ERR_IO, "**io",
121                                               "**io %s", strerror(my_errno));
122             break;
123     }
124     /* --END ERROR HANDLING-- */
125 
126     return error_code;
127 }
128