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> 158558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall#ifdef HAVE_TERMIOS_H 168558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall#include <termios.h> 178558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall#endif 188558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall#ifdef HAVE_UNISTD_H 198558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall#include <unistd.h> 208558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall#endif 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "com_err.h" 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "error_table.h" 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "internal.h" 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectdefault_com_err_proc (const char *whoami, errcode_t code, const 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *fmt, va_list args) 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project COM_ERR_ATTR((format(printf, 3, 0))); 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectdefault_com_err_proc (const char *whoami, errcode_t code, const 3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *fmt, va_list args) 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 348558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall int do_cr = 1, fd = fileno(stderr); 358558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (whoami) { 3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(whoami, stderr); 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(": ", stderr); 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (code) { 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(error_message(code), stderr); 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(" ", stderr); 4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fmt) { 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project vfprintf (stderr, fmt, args); 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 478558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall if (!isatty(fd)) 488558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall do_cr = 0; 498558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall#ifdef HAVE_TERMIOS_H 508558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall else { 518558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall struct termios t; 528558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall 538558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall if ((tcgetattr(fd, &t)) == 0 && 548558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall (t.c_oflag & OPOST) && (t.c_oflag & ONLCR)) 558558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall do_cr = 0; 568558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall } 578558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall#endif 588558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall if (do_cr) 598558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall fputc('\r', stderr); 608558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall fputc('\n', stderr); 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fflush(stderr); 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecttypedef void (*errf) (const char *, errcode_t, const char *, va_list); 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrf com_err_hook = default_com_err_proc; 6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid com_err_va (const char *whoami, errcode_t code, const char *fmt, 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project va_list args) 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (*com_err_hook) (whoami, code, fmt, args); 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid com_err (const char *whoami, 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t code, 7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *fmt, ...) 7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project va_list pvar; 7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!com_err_hook) 8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err_hook = default_com_err_proc; 8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project va_start(pvar, fmt); 8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err_va (whoami, code, fmt, pvar); 8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project va_end(pvar); 8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrf set_com_err_hook (new_proc) 8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errf new_proc; 8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errf x = com_err_hook; 9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (new_proc) 9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err_hook = new_proc; 9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err_hook = default_com_err_proc; 9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return x; 9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrf reset_com_err_hook () { 10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errf x = com_err_hook; 10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err_hook = default_com_err_proc; 10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return x; 10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 105