119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright 1987, 1988 by MIT Student Information Processing Board. 33984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * 419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Permission to use, copy, modify, and distribute this software and 519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * its documentation for any purpose is hereby granted, provided that 619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * the names of M.I.T. and the M.I.T. S.I.P.B. not be used in 719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * advertising or publicity pertaining to distribution of the software 819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * without specific, written prior permission. M.I.T. and the 919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * M.I.T. S.I.P.B. make no representations about the suitability of 1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * this software for any purpose. It is provided "as is" without 1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * express or implied warranty. 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h> 1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "com_err.h" 1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "error_table.h" 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "internal.h" 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectdefault_com_err_proc (const char *whoami, errcode_t code, const 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *fmt, va_list args) 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project COM_ERR_ATTR((format(printf, 3, 0))); 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectdefault_com_err_proc (const char *whoami, errcode_t code, const 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *fmt, va_list args) 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (whoami) { 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(whoami, stderr); 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(": ", stderr); 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (code) { 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(error_message(code), stderr); 3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(" ", stderr); 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fmt) { 3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project vfprintf (stderr, fmt, args); 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* should output \r only if using a tty in raw mode */ 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs("\r\n", stderr); 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fflush(stderr); 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecttypedef void (*errf) (const char *, errcode_t, const char *, va_list); 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrf com_err_hook = default_com_err_proc; 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid com_err_va (const char *whoami, errcode_t code, const char *fmt, 4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project va_list args) 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (*com_err_hook) (whoami, code, fmt, args); 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid com_err (const char *whoami, 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t code, 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *fmt, ...) 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project va_list pvar; 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!com_err_hook) 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err_hook = default_com_err_proc; 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project va_start(pvar, fmt); 6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err_va (whoami, code, fmt, pvar); 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project va_end(pvar); 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrf set_com_err_hook (new_proc) 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errf new_proc; 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errf x = com_err_hook; 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (new_proc) 7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err_hook = new_proc; 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err_hook = default_com_err_proc; 7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return x; 7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrf reset_com_err_hook () { 8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errf x = com_err_hook; 8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err_hook = default_com_err_proc; 8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return x; 8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 85