/* * Copyright 1993, University Corporation for Atmospheric Research * See netcdf/COPYRIGHT file for copying and redistribution conditions. */ /* $Id: error.c,v 1.14 90/02/23 16:08:55 davis Exp */ /* * Utility Functions to implement consistant error logging * mechanisms for netcdf */ /*LINTLIBRARY*/ #ifdef NO_STDARG /* The 4.0 release should be ANSI compliant */ #undef NO_STDARG #endif #include "local_nc.h" #include #ifndef NO_STDARG #include #else /* try varargs instead */ #include #endif /* !NO_STDARG */ #include #if defined ERRNO_MISSING extern int errno; #endif #ifdef VMS #include #endif #ifndef NO_STRERROR #include /* contains prototype for ansi libc function strerror() */ #else /* provide a strerror function for older unix systems */ char * strerror(errnum) int errnum ; { extern int sys_nerr; extern const char * const sys_errlist[]; if (errnum < 0 || errnum >= sys_nerr) return NULL ; return (char *)sys_errlist[errnum] ; } #endif /* NO_STRERROR */ #ifdef vms /* * On the vms system, when a system error occurs which is not * mapped into the unix styled errno values, errno is set EVMSERR * and a VMS error code is set in vaxc$errno. * This routine prints the systems message associated with status return * from a system services call. */ #include #include static int vmserror1( int status ) { short msglen ; char msgbuf[256] ; $DESCRIPTOR(message, msgbuf) ; register ret ; ret = SYS$GETMSG(status, &msglen, &message, 15, 0) ; switch(ret) { case SS$_BUFFEROVF : case SS$_NORMAL : (void) fprintf(stderr, "%.*s\n", msglen, msgbuf) ; break ; default : break ; } return(ret) ; } #endif /* vms */ #ifdef USE_doprnt_FOR_vfprintf /* * kludge for ze ancienne regieme */ vfprintf(stream, fmt, va_alist) FILE *stream; char *fmt; va_dcl { return _doprnt(fmt, va_alist, stream); } #endif /* * Log SYSTEM errors * Use where you would want to call perror(3). * Calling sequence is * nc_serror(format, arg1, arg2,...) * with zero or more args of types compatible with the associated format * specifiers. For example: * nc_serror("shutting down"); * nc_serror("can't open %s", file_name); * nc_serror("process %d in state %s",pid,state); */ void #ifndef NO_STDARG nc_serror(const char *fmt, ...) #else /*VARARGS1*/ nc_serror(fmt, va_alist) const char *fmt ; va_dcl #endif /* !NO_STDARG */ { if( ncopts & NC_VERBOSE ) { va_list args ; static const char unknown[] = "Unknown Error"; int errnum = errno; /* save real errno in case we wipe it out */ const char * cp; #ifndef NO_STDARG va_start(args, fmt) ; #else va_start(args) ; #endif /* !NO_STDARG */ (void) fprintf(stderr,"%s: ", cdf_routine_name); (void) vfprintf(stderr,fmt,args) ; va_end(args) ; switch(errnum) { case 0 : ncerr = NC_NOERR ; (void) fputc('\n',stderr) ; break ; #ifdef vms case EVMSERR : ncerr = NC_SYSERR ; (void) fputc(': ',stderr) ; (void) vmserror1(vaxc$errno) ; break ; #endif /* vms */ default : ncerr = NC_SYSERR ; (void) fprintf(stderr,": %s\n", (cp = strerror(errnum)) == NULL ? unknown : cp ) ; break ; } (void) fflush(stderr); /* to ensure log files are current */ errno = 0 ; /* ??? */ } /* NC_VERBOSE */ if( ncopts & NC_FATAL ) { exit(ncopts) ; } } /* * Like nc_serror above, but doesn't check for system error. * Use for logging error conditions which are not system errors. * Calling sequence is * NCadvise(ncerr, format, arg1, arg2,...) * with zero or more args of types compatible with the associated format * specifiers. For example: * NCadvise(NC_NOERR, "just advice"); * NCadvise(NC_EBADID, "%d is not a valid cdf id", cdfid); */ #ifndef NO_STDARG void NCadvise(int err, const char *fmt,...) #else /*VARARGS1*/ void NCadvise(err, fmt, va_alist) int err ; const char *fmt ; va_dcl #endif /* !NO_STDARG */ { va_list args ; ncerr = err ; if( ncopts & NC_VERBOSE ) { (void) fprintf(stderr,"%s: ", cdf_routine_name); #ifndef NO_STDARG va_start(args ,fmt) ; #else va_start(args) ; #endif /* !NO_STDARG */ (void) vfprintf(stderr,fmt,args) ; va_end(args) ; (void) fputc('\n',stderr) ; (void) fflush(stderr); /* to ensure log files are current */ } if( (ncopts & NC_FATAL) && ncerr != NC_NOERR ) { exit(ncopts) ; } }