1 /* $NetBSD: warn_stat.c,v 1.1.1.1 2013/01/02 18:59:15 tron Exp $ */ 2 3 /*++ 4 /* NAME 5 /* warn_stat 3 6 /* SUMMARY 7 /* baby-sit stat() error returns 8 /* SYNOPSIS 9 /* #include <warn_stat.h> 10 /* 11 /* int warn_stat(path, st) 12 /* const char *path; 13 /* struct stat *st; 14 /* 15 /* int warn_lstat(path, st) 16 /* const char *path; 17 /* struct stat *st; 18 /* 19 /* int warn_fstat(fd, st) 20 /* int fd; 21 /* struct stat *st; 22 /* DESCRIPTION 23 /* warn_stat(), warn_fstat() and warn_lstat() wrap the stat(), 24 /* fstat() and lstat() system calls with code that logs a 25 /* diagnosis for common error cases. 26 /* LICENSE 27 /* .ad 28 /* .fi 29 /* The Secure Mailer license must be distributed with this software. 30 /* AUTHOR(S) 31 /* Wietse Venema 32 /* IBM T.J. Watson Research 33 /* P.O. Box 704 34 /* Yorktown Heights, NY 10598, USA 35 /*--*/ 36 37 /* System library. */ 38 39 #include <sys_defs.h> 40 #include <sys/stat.h> 41 #include <errno.h> 42 43 /* Utility library. */ 44 45 #include <msg.h> 46 #define WARN_STAT_INTERNAL 47 #include <warn_stat.h> 48 49 /* diagnose_stat - log stat warning */ 50 51 static void diagnose_stat(void) 52 { 53 struct stat st; 54 55 /* 56 * When *stat() fails with EOVERFLOW, and the interface uses 32-bit data 57 * types, suggest that the program be recompiled with larger data types. 58 */ 59 #ifdef EOVERFLOW 60 if (errno == EOVERFLOW && sizeof(st.st_size) == 4) { 61 msg_warn("this program was built for 32-bit file handles, " 62 "but some number does not fit in 32 bits"); 63 msg_warn("possible solution: recompile in 64-bit mode, or " 64 "recompile in 32-bit mode with 'large file' support"); 65 } 66 #endif 67 } 68 69 /* warn_stat - stat with warning */ 70 71 int warn_stat(const char *path, struct stat * st) 72 { 73 int ret; 74 75 ret = stat(path, st); 76 if (ret < 0) 77 diagnose_stat(); 78 return (ret); 79 } 80 81 /* warn_lstat - lstat with warning */ 82 83 int warn_lstat(const char *path, struct stat * st) 84 { 85 int ret; 86 87 ret = lstat(path, st); 88 if (ret < 0) 89 diagnose_stat(); 90 return (ret); 91 } 92 93 /* warn_fstat - fstat with warning */ 94 95 int warn_fstat(int fd, struct stat * st) 96 { 97 int ret; 98 99 ret = fstat(fd, st); 100 if (ret < 0) 101 diagnose_stat(); 102 return (ret); 103 } 104