blob: 38f8c75829fc5bf3b0c0864225cee194c5c3bc68 [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"
sewardjde4a1d02002-03-22 01:27:54 +000034
thughes6233a382004-08-21 11:10:44 +000035#include <time.h>
36#include <sys/time.h>
37
sewardjde4a1d02002-03-22 01:27:54 +000038
39static char vg_mbuf[M_VG_MSGBUF];
40static int vg_n_mbuf;
41
sewardjb5f6f512005-03-10 23:59:00 +000042static void add_to_buf ( Char c, void *p )
sewardjde4a1d02002-03-22 01:27:54 +000043{
44 if (vg_n_mbuf >= (M_VG_MSGBUF-1)) return;
45 vg_mbuf[vg_n_mbuf++] = c;
46 vg_mbuf[vg_n_mbuf] = 0;
47}
48
thughes6233a382004-08-21 11:10:44 +000049static void add_timestamp ( Char *buf )
50{
51 struct timeval tv;
52 struct tm tm;
53
54 if ( gettimeofday( &tv, NULL ) == 0 &&
55 localtime_r( &tv.tv_sec, &tm ) == &tm ) {
56 VG_(sprintf)( buf, "%04d-%02d-%02d %02d:%02d:%02d.%03d ",
57 tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
58 tm.tm_hour, tm.tm_min, tm.tm_sec, tv.tv_usec / 1000 );
59 }
60 else {
61 VG_(strcpy)( buf, "" );
62 }
63
64 return;
65}
66
sewardj2c5ffbe2005-03-12 13:32:06 +000067static int add_to_msg ( const Char *format, ... )
sewardjde4a1d02002-03-22 01:27:54 +000068{
fitzhardinge39de4b42003-10-31 07:12:21 +000069 int count;
sewardjde4a1d02002-03-22 01:27:54 +000070 va_list vargs;
71 va_start(vargs,format);
sewardjb5f6f512005-03-10 23:59:00 +000072 count = VG_(vprintf) ( add_to_buf, format, vargs, 0 );
sewardjde4a1d02002-03-22 01:27:54 +000073 va_end(vargs);
fitzhardinge39de4b42003-10-31 07:12:21 +000074 return count;
75}
76
sewardj2c5ffbe2005-03-12 13:32:06 +000077static int start_msg ( VgMsgKind kind )
njnc5a79092005-03-12 04:59:51 +000078{
79 Char ts[32];
80 Char c;
81 static const Char pfx[] = ">>>>>>>>>>>>>>>>";
82 vg_n_mbuf = 0;
83 vg_mbuf[vg_n_mbuf] = 0;
84
85 if (VG_(clo_time_stamp))
86 add_timestamp(ts);
87 else
88 VG_(strcpy)(ts, "");
89 switch (kind) {
90 case Vg_UserMsg: c = '='; break;
91 case Vg_DebugMsg: c = '-'; break;
92 case Vg_DebugExtraMsg: c = '+'; break;
93 case Vg_ClientMsg: c = '*'; break;
94 default: c = '?'; break;
95 }
96 // The pfx trick prints one or more '>' characters in front of the
97 // messages when running Valgrind under Valgrind, one per level of
98 // self-hosting.
99 return add_to_msg( "%s%c%c%s%d%c%c ",
100 &pfx[sizeof(pfx)-1-RUNNING_ON_VALGRIND],
101 c,c, ts, VG_(getpid)(), c,c );
102}
103
sewardj2c5ffbe2005-03-12 13:32:06 +0000104static
njnc5a79092005-03-12 04:59:51 +0000105int end_msg ( void )
106{
107 int count = 0;
108 if (VG_(clo_log_fd) >= 0) {
109 add_to_buf('\n',0);
110 VG_(send_bytes_to_logging_sink) ( vg_mbuf, VG_(strlen)(vg_mbuf) );
111 count = 1;
112 }
113 return count;
114}
115
sewardjb5f6f512005-03-10 23:59:00 +0000116int VG_(vmessage) ( VgMsgKind kind, const Char* format, va_list vargs )
fitzhardinge39de4b42003-10-31 07:12:21 +0000117{
118 int count;
njnc5a79092005-03-12 04:59:51 +0000119 count = start_msg ( kind );
sewardjb5f6f512005-03-10 23:59:00 +0000120 count += VG_(vprintf) ( add_to_buf, format, vargs, 0 );
njnc5a79092005-03-12 04:59:51 +0000121 count += end_msg();
fitzhardinge39de4b42003-10-31 07:12:21 +0000122 return count;
sewardjde4a1d02002-03-22 01:27:54 +0000123}
124
125/* Send a simple single-part message. */
sewardjb5f6f512005-03-10 23:59:00 +0000126int VG_(message) ( VgMsgKind kind, const Char* format, ... )
sewardjde4a1d02002-03-22 01:27:54 +0000127{
fitzhardinge39de4b42003-10-31 07:12:21 +0000128 int count;
sewardjde4a1d02002-03-22 01:27:54 +0000129 va_list vargs;
130 va_start(vargs,format);
fitzhardinge39de4b42003-10-31 07:12:21 +0000131 count = VG_(vmessage) ( kind, format, vargs );
sewardjde4a1d02002-03-22 01:27:54 +0000132 va_end(vargs);
fitzhardinge39de4b42003-10-31 07:12:21 +0000133 return count;
sewardjde4a1d02002-03-22 01:27:54 +0000134}
135
sewardj570f8902002-11-03 11:44:36 +0000136/* Do the low-level send of a message to the logging sink. */
137void VG_(send_bytes_to_logging_sink) ( Char* msg, Int nbytes )
138{
139 Int rc;
140 if (VG_(logging_to_filedes)) {
nethercotef8548672004-06-21 12:42:35 +0000141 VG_(write)( VG_(clo_log_fd), msg, nbytes );
sewardj570f8902002-11-03 11:44:36 +0000142 } else {
nethercotef8548672004-06-21 12:42:35 +0000143 rc = VG_(write_socket)( VG_(clo_log_fd), msg, nbytes );
sewardj570f8902002-11-03 11:44:36 +0000144 if (rc == -1) {
145 /* for example, the listener process died. Switch back to
146 stderr. */
147 VG_(logging_to_filedes) = True;
148 VG_(clo_log_to) = VgLogTo_Fd;
nethercotef8548672004-06-21 12:42:35 +0000149 VG_(clo_log_fd) = 2;
150 VG_(write)( VG_(clo_log_fd), msg, nbytes );
sewardj570f8902002-11-03 11:44:36 +0000151 }
sewardjde4a1d02002-03-22 01:27:54 +0000152 }
153}
154
sewardjde4a1d02002-03-22 01:27:54 +0000155/*--------------------------------------------------------------------*/
nethercotec91ce8d2004-08-09 11:15:10 +0000156/*--- end ---*/
sewardjde4a1d02002-03-22 01:27:54 +0000157/*--------------------------------------------------------------------*/