17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5e3320f40Smarkfen * Common Development and Distribution License (the "License"). 6e3320f40Smarkfen * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 21a574db85Sraf 227c478bd9Sstevel@tonic-gate /* 23a574db85Sraf * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 247c478bd9Sstevel@tonic-gate * Use is subject to license terms. 257c478bd9Sstevel@tonic-gate */ 267c478bd9Sstevel@tonic-gate 277c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 287c478bd9Sstevel@tonic-gate 29*7257d1b4Sraf #include "lint.h" 30a574db85Sraf #include "file64.h" 31a574db85Sraf #include "mtlib.h" 32d362b749Svk #include <sys/types.h> 33d362b749Svk #include <err.h> 347c478bd9Sstevel@tonic-gate #include <stdio.h> 357c478bd9Sstevel@tonic-gate #include <stdlib.h> 367c478bd9Sstevel@tonic-gate #include <stdarg.h> 377c478bd9Sstevel@tonic-gate #include <string.h> 387c478bd9Sstevel@tonic-gate #include <errno.h> 39a574db85Sraf #include "stdiom.h" 407c478bd9Sstevel@tonic-gate 417c478bd9Sstevel@tonic-gate /* Function exit/warning functions and global variables. */ 427c478bd9Sstevel@tonic-gate 437c478bd9Sstevel@tonic-gate static const char *progname; 447c478bd9Sstevel@tonic-gate 457c478bd9Sstevel@tonic-gate /* 467c478bd9Sstevel@tonic-gate * warncore() is the workhorse of these functions. Everything else has 477c478bd9Sstevel@tonic-gate * a warncore() component in it. 487c478bd9Sstevel@tonic-gate */ 49a574db85Sraf static rmutex_t * 50e3320f40Smarkfen warncore(FILE *fp, const char *fmt, va_list args) 517c478bd9Sstevel@tonic-gate { 52f7b942dfSvk const char *execname; 53a574db85Sraf rmutex_t *lk; 54a574db85Sraf 55a574db85Sraf FLOCKFILE(lk, fp); 56f7b942dfSvk 577c478bd9Sstevel@tonic-gate if (progname == NULL) { 58f7b942dfSvk execname = getexecname(); 59f7b942dfSvk if ((execname != NULL) && 60f7b942dfSvk ((progname = strrchr(execname, '/')) != NULL)) 617c478bd9Sstevel@tonic-gate progname++; 62f7b942dfSvk else 63f7b942dfSvk progname = execname; 647c478bd9Sstevel@tonic-gate } 657c478bd9Sstevel@tonic-gate 66f7b942dfSvk if (progname != NULL) 67f7b942dfSvk (void) fprintf(fp, "%s: ", progname); 687c478bd9Sstevel@tonic-gate 697c478bd9Sstevel@tonic-gate if (fmt != NULL) { 70e3320f40Smarkfen (void) vfprintf(fp, fmt, args); 717c478bd9Sstevel@tonic-gate } 72a574db85Sraf 73a574db85Sraf return (lk); 747c478bd9Sstevel@tonic-gate } 757c478bd9Sstevel@tonic-gate 767c478bd9Sstevel@tonic-gate /* Finish a warning with a newline and a flush of stderr. */ 777c478bd9Sstevel@tonic-gate static void 78a574db85Sraf warnfinish(FILE *fp, rmutex_t *lk) 797c478bd9Sstevel@tonic-gate { 80e3320f40Smarkfen (void) fputc('\n', fp); 81e3320f40Smarkfen (void) fflush(fp); 82a574db85Sraf FUNLOCKFILE(lk); 837c478bd9Sstevel@tonic-gate } 847c478bd9Sstevel@tonic-gate 857c478bd9Sstevel@tonic-gate void 86d362b749Svk _vwarnxfp(FILE *fp, const char *fmt, va_list args) 877c478bd9Sstevel@tonic-gate { 88a574db85Sraf rmutex_t *lk; 89a574db85Sraf 90a574db85Sraf lk = warncore(fp, fmt, args); 91a574db85Sraf warnfinish(fp, lk); 927c478bd9Sstevel@tonic-gate } 937c478bd9Sstevel@tonic-gate 947c478bd9Sstevel@tonic-gate void 95d362b749Svk vwarnx(const char *fmt, va_list args) 96d362b749Svk { 97d362b749Svk _vwarnxfp(stderr, fmt, args); 98d362b749Svk } 99d362b749Svk 100d362b749Svk void 101d362b749Svk _vwarnfp(FILE *fp, const char *fmt, va_list args) 1027c478bd9Sstevel@tonic-gate { 1037c478bd9Sstevel@tonic-gate int tmperr = errno; /* Capture errno now. */ 104a574db85Sraf rmutex_t *lk; 1057c478bd9Sstevel@tonic-gate 106a574db85Sraf lk = warncore(fp, fmt, args); 107d362b749Svk if (fmt != NULL) { 108d362b749Svk (void) fputc(':', fp); 109d362b749Svk (void) fputc(' ', fp); 110d362b749Svk } 111e3320f40Smarkfen (void) fputs(strerror(tmperr), fp); 112a574db85Sraf warnfinish(fp, lk); 113e3320f40Smarkfen } 114e3320f40Smarkfen 115e3320f40Smarkfen void 116e3320f40Smarkfen vwarn(const char *fmt, va_list args) 117e3320f40Smarkfen { 118d362b749Svk _vwarnfp(stderr, fmt, args); 1197c478bd9Sstevel@tonic-gate } 1207c478bd9Sstevel@tonic-gate 1217c478bd9Sstevel@tonic-gate /* PRINTFLIKE1 */ 1227c478bd9Sstevel@tonic-gate void 1237c478bd9Sstevel@tonic-gate warnx(const char *fmt, ...) 1247c478bd9Sstevel@tonic-gate { 1257c478bd9Sstevel@tonic-gate va_list args; 1267c478bd9Sstevel@tonic-gate 1277c478bd9Sstevel@tonic-gate va_start(args, fmt); 1287c478bd9Sstevel@tonic-gate vwarnx(fmt, args); 1297c478bd9Sstevel@tonic-gate va_end(args); 1307c478bd9Sstevel@tonic-gate } 1317c478bd9Sstevel@tonic-gate 1327c478bd9Sstevel@tonic-gate void 133d362b749Svk _warnfp(FILE *fp, const char *fmt, ...) 1347c478bd9Sstevel@tonic-gate { 1357c478bd9Sstevel@tonic-gate va_list args; 1367c478bd9Sstevel@tonic-gate 1377c478bd9Sstevel@tonic-gate va_start(args, fmt); 138d362b749Svk _vwarnfp(fp, fmt, args); 1397c478bd9Sstevel@tonic-gate va_end(args); 1407c478bd9Sstevel@tonic-gate } 1417c478bd9Sstevel@tonic-gate 142e3320f40Smarkfen void 143d362b749Svk _warnxfp(FILE *fp, const char *fmt, ...) 144e3320f40Smarkfen { 145e3320f40Smarkfen va_list args; 146e3320f40Smarkfen 147e3320f40Smarkfen va_start(args, fmt); 148d362b749Svk _vwarnxfp(fp, fmt, args); 149e3320f40Smarkfen va_end(args); 150e3320f40Smarkfen } 151e3320f40Smarkfen 152d362b749Svk /* PRINTFLIKE1 */ 153e3320f40Smarkfen void 154d362b749Svk warn(const char *fmt, ...) 155e3320f40Smarkfen { 156e3320f40Smarkfen va_list args; 157e3320f40Smarkfen 158e3320f40Smarkfen va_start(args, fmt); 159d362b749Svk vwarn(fmt, args); 160e3320f40Smarkfen va_end(args); 161e3320f40Smarkfen } 162e3320f40Smarkfen 1637c478bd9Sstevel@tonic-gate /* PRINTFLIKE2 */ 1647c478bd9Sstevel@tonic-gate void 1657c478bd9Sstevel@tonic-gate err(int status, const char *fmt, ...) 1667c478bd9Sstevel@tonic-gate { 1677c478bd9Sstevel@tonic-gate va_list args; 1687c478bd9Sstevel@tonic-gate 1697c478bd9Sstevel@tonic-gate va_start(args, fmt); 1707c478bd9Sstevel@tonic-gate vwarn(fmt, args); 1717c478bd9Sstevel@tonic-gate va_end(args); 1727c478bd9Sstevel@tonic-gate exit(status); 1737c478bd9Sstevel@tonic-gate } 1747c478bd9Sstevel@tonic-gate 175d362b749Svk void 176d362b749Svk _errfp(FILE *fp, int status, const char *fmt, ...) 177d362b749Svk { 178d362b749Svk va_list args; 179d362b749Svk 180d362b749Svk va_start(args, fmt); 181d362b749Svk _vwarnfp(fp, fmt, args); 182d362b749Svk va_end(args); 183d362b749Svk exit(status); 184d362b749Svk } 185d362b749Svk 1867c478bd9Sstevel@tonic-gate void 1877c478bd9Sstevel@tonic-gate verr(int status, const char *fmt, va_list args) 1887c478bd9Sstevel@tonic-gate { 1897c478bd9Sstevel@tonic-gate vwarn(fmt, args); 1907c478bd9Sstevel@tonic-gate exit(status); 1917c478bd9Sstevel@tonic-gate } 1927c478bd9Sstevel@tonic-gate 193d362b749Svk void 194d362b749Svk _verrfp(FILE *fp, int status, const char *fmt, va_list args) 195d362b749Svk { 196d362b749Svk _vwarnfp(fp, fmt, args); 197d362b749Svk exit(status); 198d362b749Svk } 199d362b749Svk 2007c478bd9Sstevel@tonic-gate /* PRINTFLIKE2 */ 2017c478bd9Sstevel@tonic-gate void 2027c478bd9Sstevel@tonic-gate errx(int status, const char *fmt, ...) 2037c478bd9Sstevel@tonic-gate { 2047c478bd9Sstevel@tonic-gate va_list args; 2057c478bd9Sstevel@tonic-gate 2067c478bd9Sstevel@tonic-gate va_start(args, fmt); 2077c478bd9Sstevel@tonic-gate vwarnx(fmt, args); 2087c478bd9Sstevel@tonic-gate va_end(args); 2097c478bd9Sstevel@tonic-gate exit(status); 2107c478bd9Sstevel@tonic-gate } 2117c478bd9Sstevel@tonic-gate 212d362b749Svk void 213d362b749Svk _errxfp(FILE *fp, int status, const char *fmt, ...) 214d362b749Svk { 215d362b749Svk va_list args; 216d362b749Svk 217d362b749Svk va_start(args, fmt); 218d362b749Svk _vwarnxfp(fp, fmt, args); 219d362b749Svk va_end(args); 220d362b749Svk exit(status); 221d362b749Svk } 222d362b749Svk 2237c478bd9Sstevel@tonic-gate void 2247c478bd9Sstevel@tonic-gate verrx(int status, const char *fmt, va_list args) 2257c478bd9Sstevel@tonic-gate { 2267c478bd9Sstevel@tonic-gate vwarnx(fmt, args); 2277c478bd9Sstevel@tonic-gate exit(status); 2287c478bd9Sstevel@tonic-gate } 229d362b749Svk 230d362b749Svk void 231d362b749Svk _verrxfp(FILE *fp, int status, const char *fmt, va_list args) 232d362b749Svk { 233d362b749Svk _vwarnxfp(fp, fmt, args); 234d362b749Svk exit(status); 235d362b749Svk } 236