blob: 1314b3b7a88d7f20abf269dc586329cf1543f483 [file] [log] [blame]
sewardjde4a1d02002-03-22 01:27:54 +00001
2/*--------------------------------------------------------------------*/
3/*--- For sending error/informative messages. ---*/
nethercote85cdd342004-08-01 22:36:40 +00004/*--- vg_messages.c ---*/
sewardjde4a1d02002-03-22 01:27:54 +00005/*--------------------------------------------------------------------*/
6
7/*
njnb9c427c2004-12-01 14:14:42 +00008 This file is part of Valgrind, a dynamic binary instrumentation
9 framework.
sewardjde4a1d02002-03-22 01:27:54 +000010
njn53612422005-03-12 16:22:54 +000011 Copyright (C) 2000-2005 Julian Seward
sewardjde4a1d02002-03-22 01:27:54 +000012 jseward@acm.org
sewardjde4a1d02002-03-22 01:27:54 +000013
14 This program is free software; you can redistribute it and/or
15 modify it under the terms of the GNU General Public License as
16 published by the Free Software Foundation; either version 2 of the
17 License, or (at your option) any later version.
18
19 This program is distributed in the hope that it will be useful, but
20 WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 General Public License for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software
26 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
27 02111-1307, USA.
28
njn25e49d8e72002-09-23 09:36:25 +000029 The GNU General Public License is contained in the file COPYING.
sewardjde4a1d02002-03-22 01:27:54 +000030*/
31
32
nethercotef1e5e152004-09-01 23:58:16 +000033#include "core.h"
sewardj1cf558c2005-04-25 01:36:56 +000034#include "pub_core_debuglog.h" /* VG_(debugLog_vprintf) */
sewardjde4a1d02002-03-22 01:27:54 +000035
thughes6233a382004-08-21 11:10:44 +000036#include <time.h>
37#include <sys/time.h>
38
njn14319cc2005-03-13 06:26:22 +000039/* Size of a buffer used for creating messages. */
40#define M_MSGBUF 10000
sewardjde4a1d02002-03-22 01:27:54 +000041
njn695c16e2005-03-27 03:40:28 +000042static char mbuf[M_MSGBUF];
43static int n_mbuf;
sewardjde4a1d02002-03-22 01:27:54 +000044
sewardj1cf558c2005-04-25 01:36:56 +000045static void add_to_buf ( HChar c, void *p )
sewardjde4a1d02002-03-22 01:27:54 +000046{
njn695c16e2005-03-27 03:40:28 +000047 if (n_mbuf >= (M_MSGBUF-1)) return;
48 mbuf[n_mbuf++] = c;
49 mbuf[n_mbuf] = 0;
sewardjde4a1d02002-03-22 01:27:54 +000050}
51
thughes6233a382004-08-21 11:10:44 +000052static void add_timestamp ( Char *buf )
53{
54 struct timeval tv;
55 struct tm tm;
56
57 if ( gettimeofday( &tv, NULL ) == 0 &&
58 localtime_r( &tv.tv_sec, &tm ) == &tm ) {
59 VG_(sprintf)( buf, "%04d-%02d-%02d %02d:%02d:%02d.%03d ",
60 tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
61 tm.tm_hour, tm.tm_min, tm.tm_sec, tv.tv_usec / 1000 );
62 }
63 else {
64 VG_(strcpy)( buf, "" );
65 }
66
67 return;
68}
69
sewardj2c5ffbe2005-03-12 13:32:06 +000070static int add_to_msg ( const Char *format, ... )
sewardjde4a1d02002-03-22 01:27:54 +000071{
fitzhardinge39de4b42003-10-31 07:12:21 +000072 int count;
sewardjde4a1d02002-03-22 01:27:54 +000073 va_list vargs;
74 va_start(vargs,format);
sewardj1cf558c2005-04-25 01:36:56 +000075 count = VG_(debugLog_vprintf) ( add_to_buf, NULL, format, vargs );
sewardjde4a1d02002-03-22 01:27:54 +000076 va_end(vargs);
fitzhardinge39de4b42003-10-31 07:12:21 +000077 return count;
78}
79
sewardj2c5ffbe2005-03-12 13:32:06 +000080static int start_msg ( VgMsgKind kind )
njnc5a79092005-03-12 04:59:51 +000081{
82 Char ts[32];
83 Char c;
84 static const Char pfx[] = ">>>>>>>>>>>>>>>>";
njn695c16e2005-03-27 03:40:28 +000085 n_mbuf = 0;
86 mbuf[n_mbuf] = 0;
njnc5a79092005-03-12 04:59:51 +000087
88 if (VG_(clo_time_stamp))
89 add_timestamp(ts);
90 else
91 VG_(strcpy)(ts, "");
92 switch (kind) {
93 case Vg_UserMsg: c = '='; break;
94 case Vg_DebugMsg: c = '-'; break;
95 case Vg_DebugExtraMsg: c = '+'; break;
96 case Vg_ClientMsg: c = '*'; break;
97 default: c = '?'; break;
98 }
99 // The pfx trick prints one or more '>' characters in front of the
100 // messages when running Valgrind under Valgrind, one per level of
101 // self-hosting.
102 return add_to_msg( "%s%c%c%s%d%c%c ",
103 &pfx[sizeof(pfx)-1-RUNNING_ON_VALGRIND],
104 c,c, ts, VG_(getpid)(), c,c );
105}
106
sewardj2c5ffbe2005-03-12 13:32:06 +0000107static
njnc5a79092005-03-12 04:59:51 +0000108int end_msg ( void )
109{
110 int count = 0;
111 if (VG_(clo_log_fd) >= 0) {
112 add_to_buf('\n',0);
njn695c16e2005-03-27 03:40:28 +0000113 VG_(send_bytes_to_logging_sink) ( mbuf, VG_(strlen)(mbuf) );
njnc5a79092005-03-12 04:59:51 +0000114 count = 1;
115 }
116 return count;
117}
118
sewardjb5f6f512005-03-10 23:59:00 +0000119int VG_(vmessage) ( VgMsgKind kind, const Char* format, va_list vargs )
fitzhardinge39de4b42003-10-31 07:12:21 +0000120{
121 int count;
njnc5a79092005-03-12 04:59:51 +0000122 count = start_msg ( kind );
sewardj1cf558c2005-04-25 01:36:56 +0000123 count += VG_(debugLog_vprintf) ( add_to_buf, NULL, format, vargs );
njnc5a79092005-03-12 04:59:51 +0000124 count += end_msg();
fitzhardinge39de4b42003-10-31 07:12:21 +0000125 return count;
sewardjde4a1d02002-03-22 01:27:54 +0000126}
127
128/* Send a simple single-part message. */
sewardjb5f6f512005-03-10 23:59:00 +0000129int VG_(message) ( VgMsgKind kind, const Char* format, ... )
sewardjde4a1d02002-03-22 01:27:54 +0000130{
fitzhardinge39de4b42003-10-31 07:12:21 +0000131 int count;
sewardjde4a1d02002-03-22 01:27:54 +0000132 va_list vargs;
133 va_start(vargs,format);
fitzhardinge39de4b42003-10-31 07:12:21 +0000134 count = VG_(vmessage) ( kind, format, vargs );
sewardjde4a1d02002-03-22 01:27:54 +0000135 va_end(vargs);
fitzhardinge39de4b42003-10-31 07:12:21 +0000136 return count;
sewardjde4a1d02002-03-22 01:27:54 +0000137}
138
sewardj570f8902002-11-03 11:44:36 +0000139/* Do the low-level send of a message to the logging sink. */
140void VG_(send_bytes_to_logging_sink) ( Char* msg, Int nbytes )
141{
142 Int rc;
143 if (VG_(logging_to_filedes)) {
nethercotef8548672004-06-21 12:42:35 +0000144 VG_(write)( VG_(clo_log_fd), msg, nbytes );
sewardj570f8902002-11-03 11:44:36 +0000145 } else {
nethercotef8548672004-06-21 12:42:35 +0000146 rc = VG_(write_socket)( VG_(clo_log_fd), msg, nbytes );
sewardj570f8902002-11-03 11:44:36 +0000147 if (rc == -1) {
148 /* for example, the listener process died. Switch back to
149 stderr. */
150 VG_(logging_to_filedes) = True;
151 VG_(clo_log_to) = VgLogTo_Fd;
nethercotef8548672004-06-21 12:42:35 +0000152 VG_(clo_log_fd) = 2;
153 VG_(write)( VG_(clo_log_fd), msg, nbytes );
sewardj570f8902002-11-03 11:44:36 +0000154 }
sewardjde4a1d02002-03-22 01:27:54 +0000155 }
156}
157
sewardjde4a1d02002-03-22 01:27:54 +0000158/*--------------------------------------------------------------------*/
nethercotec91ce8d2004-08-09 11:15:10 +0000159/*--- end ---*/
sewardjde4a1d02002-03-22 01:27:54 +0000160/*--------------------------------------------------------------------*/