xref: /aosp_15_r20/external/oj-libjdwp/src/share/back/log_messages.c (revision e82f7db8c62aed3c168547abe4f9f4aeceaebfc7)
1*e82f7db8SAndroid Build Coastguard Worker /*
2*e82f7db8SAndroid Build Coastguard Worker  * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
3*e82f7db8SAndroid Build Coastguard Worker  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*e82f7db8SAndroid Build Coastguard Worker  *
5*e82f7db8SAndroid Build Coastguard Worker  * This code is free software; you can redistribute it and/or modify it
6*e82f7db8SAndroid Build Coastguard Worker  * under the terms of the GNU General Public License version 2 only, as
7*e82f7db8SAndroid Build Coastguard Worker  * published by the Free Software Foundation.  Oracle designates this
8*e82f7db8SAndroid Build Coastguard Worker  * particular file as subject to the "Classpath" exception as provided
9*e82f7db8SAndroid Build Coastguard Worker  * by Oracle in the LICENSE file that accompanied this code.
10*e82f7db8SAndroid Build Coastguard Worker  *
11*e82f7db8SAndroid Build Coastguard Worker  * This code is distributed in the hope that it will be useful, but WITHOUT
12*e82f7db8SAndroid Build Coastguard Worker  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13*e82f7db8SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14*e82f7db8SAndroid Build Coastguard Worker  * version 2 for more details (a copy is included in the LICENSE file that
15*e82f7db8SAndroid Build Coastguard Worker  * accompanied this code).
16*e82f7db8SAndroid Build Coastguard Worker  *
17*e82f7db8SAndroid Build Coastguard Worker  * You should have received a copy of the GNU General Public License version
18*e82f7db8SAndroid Build Coastguard Worker  * 2 along with this work; if not, write to the Free Software Foundation,
19*e82f7db8SAndroid Build Coastguard Worker  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20*e82f7db8SAndroid Build Coastguard Worker  *
21*e82f7db8SAndroid Build Coastguard Worker  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22*e82f7db8SAndroid Build Coastguard Worker  * or visit www.oracle.com if you need additional information or have any
23*e82f7db8SAndroid Build Coastguard Worker  * questions.
24*e82f7db8SAndroid Build Coastguard Worker  */
25*e82f7db8SAndroid Build Coastguard Worker 
26*e82f7db8SAndroid Build Coastguard Worker #include "util.h"
27*e82f7db8SAndroid Build Coastguard Worker 
28*e82f7db8SAndroid Build Coastguard Worker #include <time.h>
29*e82f7db8SAndroid Build Coastguard Worker #include <errno.h>
30*e82f7db8SAndroid Build Coastguard Worker #include <sys/types.h>
31*e82f7db8SAndroid Build Coastguard Worker 
32*e82f7db8SAndroid Build Coastguard Worker #include "proc_md.h"
33*e82f7db8SAndroid Build Coastguard Worker 
34*e82f7db8SAndroid Build Coastguard Worker #include "log_messages.h"
35*e82f7db8SAndroid Build Coastguard Worker 
36*e82f7db8SAndroid Build Coastguard Worker #ifdef JDWP_LOGGING
37*e82f7db8SAndroid Build Coastguard Worker 
38*e82f7db8SAndroid Build Coastguard Worker #define MAXLEN_INTEGER          20
39*e82f7db8SAndroid Build Coastguard Worker #define MAXLEN_FILENAME         256
40*e82f7db8SAndroid Build Coastguard Worker #define MAXLEN_TIMESTAMP        80
41*e82f7db8SAndroid Build Coastguard Worker #define MAXLEN_LOCATION         (MAXLEN_FILENAME+MAXLEN_INTEGER+16)
42*e82f7db8SAndroid Build Coastguard Worker #define MAXLEN_MESSAGE          256
43*e82f7db8SAndroid Build Coastguard Worker #define MAXLEN_EXEC             (MAXLEN_FILENAME*2+MAXLEN_INTEGER+16)
44*e82f7db8SAndroid Build Coastguard Worker 
45*e82f7db8SAndroid Build Coastguard Worker static MUTEX_T my_mutex = MUTEX_INIT;
46*e82f7db8SAndroid Build Coastguard Worker 
47*e82f7db8SAndroid Build Coastguard Worker /* Static variables (should be protected with mutex) */
48*e82f7db8SAndroid Build Coastguard Worker static int logging;
49*e82f7db8SAndroid Build Coastguard Worker static FILE * log_file;
50*e82f7db8SAndroid Build Coastguard Worker static char logging_filename[MAXLEN_FILENAME+1+6];
51*e82f7db8SAndroid Build Coastguard Worker static char location_stamp[MAXLEN_LOCATION+1];
52*e82f7db8SAndroid Build Coastguard Worker static PID_T processPid;
53*e82f7db8SAndroid Build Coastguard Worker static int open_count;
54*e82f7db8SAndroid Build Coastguard Worker 
55*e82f7db8SAndroid Build Coastguard Worker /* Ascii id of current native thread. */
56*e82f7db8SAndroid Build Coastguard Worker static void
get_time_stamp(char * tbuf,size_t ltbuf)57*e82f7db8SAndroid Build Coastguard Worker get_time_stamp(char *tbuf, size_t ltbuf)
58*e82f7db8SAndroid Build Coastguard Worker {
59*e82f7db8SAndroid Build Coastguard Worker     char format[MAXLEN_TIMESTAMP+1];
60*e82f7db8SAndroid Build Coastguard Worker     unsigned millisecs = 0;
61*e82f7db8SAndroid Build Coastguard Worker     time_t t = 0;
62*e82f7db8SAndroid Build Coastguard Worker 
63*e82f7db8SAndroid Build Coastguard Worker     GETMILLSECS(millisecs);
64*e82f7db8SAndroid Build Coastguard Worker     if ( time(&t) == (time_t)(-1) )
65*e82f7db8SAndroid Build Coastguard Worker         t = 0;
66*e82f7db8SAndroid Build Coastguard Worker     (void)strftime(format, sizeof(format),
67*e82f7db8SAndroid Build Coastguard Worker                 /* Break this string up for SCCS's sake */
68*e82f7db8SAndroid Build Coastguard Worker                 "%" "d.%" "m.%" "Y %" "T.%%.3d %" "Z", localtime(&t));
69*e82f7db8SAndroid Build Coastguard Worker     (void)snprintf(tbuf, ltbuf, format, (int)(millisecs));
70*e82f7db8SAndroid Build Coastguard Worker }
71*e82f7db8SAndroid Build Coastguard Worker 
72*e82f7db8SAndroid Build Coastguard Worker /* Get basename of filename */
73*e82f7db8SAndroid Build Coastguard Worker static const char *
file_basename(const char * file)74*e82f7db8SAndroid Build Coastguard Worker file_basename(const char *file)
75*e82f7db8SAndroid Build Coastguard Worker {
76*e82f7db8SAndroid Build Coastguard Worker     char *p1;
77*e82f7db8SAndroid Build Coastguard Worker     char *p2;
78*e82f7db8SAndroid Build Coastguard Worker 
79*e82f7db8SAndroid Build Coastguard Worker     if ( file==NULL )
80*e82f7db8SAndroid Build Coastguard Worker         return "unknown";
81*e82f7db8SAndroid Build Coastguard Worker     p1 = strrchr(file, '\\');
82*e82f7db8SAndroid Build Coastguard Worker     p2 = strrchr(file, '/');
83*e82f7db8SAndroid Build Coastguard Worker     p1 = ((p1 > p2) ? p1 : p2);
84*e82f7db8SAndroid Build Coastguard Worker     if (p1 != NULL) {
85*e82f7db8SAndroid Build Coastguard Worker         file = p1 + 1;
86*e82f7db8SAndroid Build Coastguard Worker     }
87*e82f7db8SAndroid Build Coastguard Worker     return file;
88*e82f7db8SAndroid Build Coastguard Worker }
89*e82f7db8SAndroid Build Coastguard Worker 
90*e82f7db8SAndroid Build Coastguard Worker /* Fill in the exact source location of the LOG entry. */
91*e82f7db8SAndroid Build Coastguard Worker static void
fill_location_stamp(const char * flavor,const char * file,int line)92*e82f7db8SAndroid Build Coastguard Worker fill_location_stamp(const char *flavor, const char *file, int line)
93*e82f7db8SAndroid Build Coastguard Worker {
94*e82f7db8SAndroid Build Coastguard Worker     (void)snprintf(location_stamp, sizeof(location_stamp),
95*e82f7db8SAndroid Build Coastguard Worker                     "%s:\"%s\":%d;",
96*e82f7db8SAndroid Build Coastguard Worker                     flavor, file_basename(file), line);
97*e82f7db8SAndroid Build Coastguard Worker     location_stamp[sizeof(location_stamp)-1] = 0;
98*e82f7db8SAndroid Build Coastguard Worker }
99*e82f7db8SAndroid Build Coastguard Worker 
100*e82f7db8SAndroid Build Coastguard Worker /* Begin a log entry. */
101*e82f7db8SAndroid Build Coastguard Worker void
log_message_begin(const char * flavor,const char * file,int line)102*e82f7db8SAndroid Build Coastguard Worker log_message_begin(const char *flavor, const char *file, int line)
103*e82f7db8SAndroid Build Coastguard Worker {
104*e82f7db8SAndroid Build Coastguard Worker     MUTEX_LOCK(my_mutex); /* Unlocked in log_message_end() */
105*e82f7db8SAndroid Build Coastguard Worker     if ( logging ) {
106*e82f7db8SAndroid Build Coastguard Worker         location_stamp[0] = 0;
107*e82f7db8SAndroid Build Coastguard Worker         fill_location_stamp(flavor, file, line);
108*e82f7db8SAndroid Build Coastguard Worker     }
109*e82f7db8SAndroid Build Coastguard Worker }
110*e82f7db8SAndroid Build Coastguard Worker 
111*e82f7db8SAndroid Build Coastguard Worker /* Standard Logging Format Entry */
112*e82f7db8SAndroid Build Coastguard Worker static void
standard_logging_format(FILE * fp,const char * datetime,const char * level,const char * product,const char * module,const char * optional,const char * messageID,const char * message)113*e82f7db8SAndroid Build Coastguard Worker standard_logging_format(FILE *fp,
114*e82f7db8SAndroid Build Coastguard Worker         const char *datetime,
115*e82f7db8SAndroid Build Coastguard Worker         const char *level,
116*e82f7db8SAndroid Build Coastguard Worker         const char *product,
117*e82f7db8SAndroid Build Coastguard Worker         const char *module,
118*e82f7db8SAndroid Build Coastguard Worker         const char *optional,
119*e82f7db8SAndroid Build Coastguard Worker         const char *messageID,
120*e82f7db8SAndroid Build Coastguard Worker         const char *message)
121*e82f7db8SAndroid Build Coastguard Worker {
122*e82f7db8SAndroid Build Coastguard Worker     const char *format;
123*e82f7db8SAndroid Build Coastguard Worker 
124*e82f7db8SAndroid Build Coastguard Worker     /* "[#|Date&Time&Zone|LogLevel|ProductName|ModuleID|
125*e82f7db8SAndroid Build Coastguard Worker      *     OptionalKey1=Value1;OptionalKeyN=ValueN|MessageID:MessageText|#]\n"
126*e82f7db8SAndroid Build Coastguard Worker      */
127*e82f7db8SAndroid Build Coastguard Worker 
128*e82f7db8SAndroid Build Coastguard Worker     format="[#|%s|%s|%s|%s|%s|%s:%s|#]\n";
129*e82f7db8SAndroid Build Coastguard Worker 
130*e82f7db8SAndroid Build Coastguard Worker     print_message(fp, "", "", format,
131*e82f7db8SAndroid Build Coastguard Worker             datetime,
132*e82f7db8SAndroid Build Coastguard Worker             level,
133*e82f7db8SAndroid Build Coastguard Worker             product,
134*e82f7db8SAndroid Build Coastguard Worker             module,
135*e82f7db8SAndroid Build Coastguard Worker             optional,
136*e82f7db8SAndroid Build Coastguard Worker             messageID,
137*e82f7db8SAndroid Build Coastguard Worker             message);
138*e82f7db8SAndroid Build Coastguard Worker }
139*e82f7db8SAndroid Build Coastguard Worker 
140*e82f7db8SAndroid Build Coastguard Worker /* End a log entry */
141*e82f7db8SAndroid Build Coastguard Worker void
log_message_end(const char * format,...)142*e82f7db8SAndroid Build Coastguard Worker log_message_end(const char *format, ...)
143*e82f7db8SAndroid Build Coastguard Worker {
144*e82f7db8SAndroid Build Coastguard Worker     if ( logging ) {
145*e82f7db8SAndroid Build Coastguard Worker         va_list ap;
146*e82f7db8SAndroid Build Coastguard Worker         THREAD_T tid;
147*e82f7db8SAndroid Build Coastguard Worker         char datetime[MAXLEN_TIMESTAMP+1];
148*e82f7db8SAndroid Build Coastguard Worker         const char *level;
149*e82f7db8SAndroid Build Coastguard Worker         const char *product;
150*e82f7db8SAndroid Build Coastguard Worker         const char *module;
151*e82f7db8SAndroid Build Coastguard Worker         char optional[MAXLEN_INTEGER+6+MAXLEN_INTEGER+6+MAXLEN_LOCATION+1];
152*e82f7db8SAndroid Build Coastguard Worker         const char *messageID;
153*e82f7db8SAndroid Build Coastguard Worker         char message[MAXLEN_MESSAGE+1];
154*e82f7db8SAndroid Build Coastguard Worker 
155*e82f7db8SAndroid Build Coastguard Worker         /* Grab the location, start file if needed, and clear the lock */
156*e82f7db8SAndroid Build Coastguard Worker         if ( log_file == NULL && open_count == 0 && logging_filename[0] != 0 ) {
157*e82f7db8SAndroid Build Coastguard Worker             open_count++;
158*e82f7db8SAndroid Build Coastguard Worker             log_file = fopen(logging_filename, "w");
159*e82f7db8SAndroid Build Coastguard Worker             if ( log_file!=NULL ) {
160*e82f7db8SAndroid Build Coastguard Worker                 (void)setvbuf(log_file, NULL, _IOLBF, BUFSIZ);
161*e82f7db8SAndroid Build Coastguard Worker             } else {
162*e82f7db8SAndroid Build Coastguard Worker                 logging = 0;
163*e82f7db8SAndroid Build Coastguard Worker             }
164*e82f7db8SAndroid Build Coastguard Worker         }
165*e82f7db8SAndroid Build Coastguard Worker 
166*e82f7db8SAndroid Build Coastguard Worker         if ( log_file != NULL ) {
167*e82f7db8SAndroid Build Coastguard Worker 
168*e82f7db8SAndroid Build Coastguard Worker             /* Get the rest of the needed information */
169*e82f7db8SAndroid Build Coastguard Worker             tid = GET_THREAD_ID();
170*e82f7db8SAndroid Build Coastguard Worker             level = "FINEST"; /* FIXUP? */
171*e82f7db8SAndroid Build Coastguard Worker             product = "J2SE1.5"; /* FIXUP? */
172*e82f7db8SAndroid Build Coastguard Worker             module = "jdwp"; /* FIXUP? */
173*e82f7db8SAndroid Build Coastguard Worker             messageID = ""; /* FIXUP: Unique message string ID? */
174*e82f7db8SAndroid Build Coastguard Worker             (void)snprintf(optional, sizeof(optional),
175*e82f7db8SAndroid Build Coastguard Worker                         "LOC=%s;PID=%d;THR=t@%d",
176*e82f7db8SAndroid Build Coastguard Worker                         location_stamp,
177*e82f7db8SAndroid Build Coastguard Worker                         (int)processPid,
178*e82f7db8SAndroid Build Coastguard Worker                         (int)tid);
179*e82f7db8SAndroid Build Coastguard Worker 
180*e82f7db8SAndroid Build Coastguard Worker             /* Construct message string. */
181*e82f7db8SAndroid Build Coastguard Worker             va_start(ap, format);
182*e82f7db8SAndroid Build Coastguard Worker             (void)vsnprintf(message, sizeof(message), format, ap);
183*e82f7db8SAndroid Build Coastguard Worker             va_end(ap);
184*e82f7db8SAndroid Build Coastguard Worker 
185*e82f7db8SAndroid Build Coastguard Worker             get_time_stamp(datetime, sizeof(datetime));
186*e82f7db8SAndroid Build Coastguard Worker 
187*e82f7db8SAndroid Build Coastguard Worker             /* Send out standard logging format message */
188*e82f7db8SAndroid Build Coastguard Worker             standard_logging_format(log_file,
189*e82f7db8SAndroid Build Coastguard Worker                 datetime,
190*e82f7db8SAndroid Build Coastguard Worker                 level,
191*e82f7db8SAndroid Build Coastguard Worker                 product,
192*e82f7db8SAndroid Build Coastguard Worker                 module,
193*e82f7db8SAndroid Build Coastguard Worker                 optional,
194*e82f7db8SAndroid Build Coastguard Worker                 messageID,
195*e82f7db8SAndroid Build Coastguard Worker                 message);
196*e82f7db8SAndroid Build Coastguard Worker         }
197*e82f7db8SAndroid Build Coastguard Worker         location_stamp[0] = 0;
198*e82f7db8SAndroid Build Coastguard Worker     }
199*e82f7db8SAndroid Build Coastguard Worker     MUTEX_UNLOCK(my_mutex); /* Locked in log_message_begin() */
200*e82f7db8SAndroid Build Coastguard Worker }
201*e82f7db8SAndroid Build Coastguard Worker 
202*e82f7db8SAndroid Build Coastguard Worker #endif
203*e82f7db8SAndroid Build Coastguard Worker 
204*e82f7db8SAndroid Build Coastguard Worker /* Set up the logging with the name of a logging file. */
205*e82f7db8SAndroid Build Coastguard Worker /* ANDROID-CHANGED: Added directlog */
206*e82f7db8SAndroid Build Coastguard Worker void
setup_logging(const char * filename,unsigned flags,int directlog)207*e82f7db8SAndroid Build Coastguard Worker setup_logging(const char *filename, unsigned flags, int directlog)
208*e82f7db8SAndroid Build Coastguard Worker {
209*e82f7db8SAndroid Build Coastguard Worker #ifdef JDWP_LOGGING
210*e82f7db8SAndroid Build Coastguard Worker     FILE *fp = NULL;
211*e82f7db8SAndroid Build Coastguard Worker 
212*e82f7db8SAndroid Build Coastguard Worker     /* Turn off logging */
213*e82f7db8SAndroid Build Coastguard Worker     logging = 0;
214*e82f7db8SAndroid Build Coastguard Worker     gdata->log_flags = 0;
215*e82f7db8SAndroid Build Coastguard Worker 
216*e82f7db8SAndroid Build Coastguard Worker     /* Just return if not doing logging */
217*e82f7db8SAndroid Build Coastguard Worker     if ( filename==NULL || flags==0 )
218*e82f7db8SAndroid Build Coastguard Worker         return;
219*e82f7db8SAndroid Build Coastguard Worker 
220*e82f7db8SAndroid Build Coastguard Worker     /* Create potential filename for logging */
221*e82f7db8SAndroid Build Coastguard Worker     /* ANDROID-CHANGED: Add directlog */
222*e82f7db8SAndroid Build Coastguard Worker     if (directlog) {
223*e82f7db8SAndroid Build Coastguard Worker       strncpy(logging_filename, filename, sizeof(logging_filename));
224*e82f7db8SAndroid Build Coastguard Worker     } else {
225*e82f7db8SAndroid Build Coastguard Worker       processPid = GETPID();
226*e82f7db8SAndroid Build Coastguard Worker       (void)snprintf(logging_filename, sizeof(logging_filename),
227*e82f7db8SAndroid Build Coastguard Worker                       "%s.%d", filename, (int)processPid);
228*e82f7db8SAndroid Build Coastguard Worker     }
229*e82f7db8SAndroid Build Coastguard Worker 
230*e82f7db8SAndroid Build Coastguard Worker     /* Turn on logging (do this last) */
231*e82f7db8SAndroid Build Coastguard Worker     logging = 1;
232*e82f7db8SAndroid Build Coastguard Worker     gdata->log_flags = flags;
233*e82f7db8SAndroid Build Coastguard Worker 
234*e82f7db8SAndroid Build Coastguard Worker #endif
235*e82f7db8SAndroid Build Coastguard Worker }
236*e82f7db8SAndroid Build Coastguard Worker 
237*e82f7db8SAndroid Build Coastguard Worker /* Finish up logging, flush output to the logfile. */
238*e82f7db8SAndroid Build Coastguard Worker void
finish_logging()239*e82f7db8SAndroid Build Coastguard Worker finish_logging()
240*e82f7db8SAndroid Build Coastguard Worker {
241*e82f7db8SAndroid Build Coastguard Worker #ifdef JDWP_LOGGING
242*e82f7db8SAndroid Build Coastguard Worker     MUTEX_LOCK(my_mutex);
243*e82f7db8SAndroid Build Coastguard Worker     if ( logging ) {
244*e82f7db8SAndroid Build Coastguard Worker         logging = 0;
245*e82f7db8SAndroid Build Coastguard Worker         if ( log_file != NULL ) {
246*e82f7db8SAndroid Build Coastguard Worker             (void)fflush(log_file);
247*e82f7db8SAndroid Build Coastguard Worker             (void)fclose(log_file);
248*e82f7db8SAndroid Build Coastguard Worker             log_file = NULL;
249*e82f7db8SAndroid Build Coastguard Worker         }
250*e82f7db8SAndroid Build Coastguard Worker     }
251*e82f7db8SAndroid Build Coastguard Worker     MUTEX_UNLOCK(my_mutex);
252*e82f7db8SAndroid Build Coastguard Worker #endif
253*e82f7db8SAndroid Build Coastguard Worker }
254