Deleted Added
full compact
logger.c (302408) logger.c (362181)
1/*
2 * logger.c : Implementation of the SvnServe logger API
3 *
4 * ====================================================================
5 * Licensed to the Apache Software Foundation (ASF) under one
6 * or more contributor license agreements. See the NOTICE file
7 * distributed with this work for additional information
8 * regarding copyright ownership. The ASF licenses this file

--- 74 unchanged lines hidden (view full) ---

83 result->stream = svn_stream_from_aprfile2(file, FALSE, pool);
84 result->pool = svn_pool_create(pool);
85
86 *logger = result;
87
88 return SVN_NO_ERROR;
89}
90
1/*
2 * logger.c : Implementation of the SvnServe logger API
3 *
4 * ====================================================================
5 * Licensed to the Apache Software Foundation (ASF) under one
6 * or more contributor license agreements. See the NOTICE file
7 * distributed with this work for additional information
8 * regarding copyright ownership. The ASF licenses this file

--- 74 unchanged lines hidden (view full) ---

83 result->stream = svn_stream_from_aprfile2(file, FALSE, pool);
84 result->pool = svn_pool_create(pool);
85
86 *logger = result;
87
88 return SVN_NO_ERROR;
89}
90
91void
92logger__log_error(logger_t *logger,
93 svn_error_t *err,
94 repository_t *repository,
95 client_info_t *client_info)
91static void
92log_message(logger_t *logger,
93 const svn_error_t *err,
94 const char *prefix,
95 repository_t *repository,
96 client_info_t *client_info)
96{
97 if (logger && err)
98 {
99 const char *timestr, *continuation;
100 const char *user, *repos, *remote_host;
97{
98 if (logger && err)
99 {
100 const char *timestr, *continuation;
101 const char *user, *repos, *remote_host;
101 char errbuf[256];
102
102 /* 8192 from MAX_STRING_LEN in from httpd-2.2.4/include/httpd.h */
103 /* 8192 from MAX_STRING_LEN in from httpd-2.2.4/include/httpd.h */
103 char errstr[8192];
104 const apr_size_t errstr_size = 8192;
105 char *errstr = apr_palloc(logger->pool, errstr_size);
104
105 svn_error_clear(svn_mutex__lock(logger->mutex));
106
107 timestr = svn_time_to_cstring(apr_time_now(), logger->pool);
108 remote_host = client_info && client_info->remote_host
109 ? client_info->remote_host
110 : "-";
111 user = client_info && client_info->user
112 ? client_info->user
113 : "-";
114 repos = repository && repository->repos_name
115 ? repository->repos_name
116 : "-";
117
118 continuation = "";
119 while (err)
120 {
106
107 svn_error_clear(svn_mutex__lock(logger->mutex));
108
109 timestr = svn_time_to_cstring(apr_time_now(), logger->pool);
110 remote_host = client_info && client_info->remote_host
111 ? client_info->remote_host
112 : "-";
113 user = client_info && client_info->user
114 ? client_info->user
115 : "-";
116 repos = repository && repository->repos_name
117 ? repository->repos_name
118 : "-";
119
120 continuation = "";
121 while (err)
122 {
123 char errbuf[256];
121 const char *message = svn_err_best_message(err, errbuf, sizeof(errbuf));
122 /* based on httpd-2.2.4/server/log.c:log_error_core */
124 const char *message = svn_err_best_message(err, errbuf, sizeof(errbuf));
125 /* based on httpd-2.2.4/server/log.c:log_error_core */
123 apr_size_t len = apr_snprintf(errstr, sizeof(errstr),
126 apr_size_t len = apr_snprintf(errstr, errstr_size,
124 "%" APR_PID_T_FMT
127 "%" APR_PID_T_FMT
125 " %s %s %s %s ERR%s %s %ld %d ",
128 " %s %s %s %s %s%s %s %ld %d ",
126 getpid(), timestr, remote_host, user,
129 getpid(), timestr, remote_host, user,
127 repos, continuation,
130 repos, prefix, continuation,
128 err->file ? err->file : "-", err->line,
129 err->apr_err);
130
131 len += escape_errorlog_item(errstr + len, message,
131 err->file ? err->file : "-", err->line,
132 err->apr_err);
133
134 len += escape_errorlog_item(errstr + len, message,
132 sizeof(errstr) - len);
135 errstr_size - len);
133 /* Truncate for the terminator (as apr_snprintf does) */
136 /* Truncate for the terminator (as apr_snprintf does) */
134 if (len > sizeof(errstr) - sizeof(APR_EOL_STR)) {
135 len = sizeof(errstr) - sizeof(APR_EOL_STR);
137 if (len > errstr_size - sizeof(APR_EOL_STR)) {
138 len = errstr_size - sizeof(APR_EOL_STR);
136 }
137
138 memcpy(errstr + len, APR_EOL_STR, sizeof(APR_EOL_STR));
139 len += sizeof(APR_EOL_STR) -1; /* add NL, ex terminating NUL */
140
141 svn_error_clear(svn_stream_write(logger->stream, errstr, &len));
142
143 continuation = "-";
144 err = err->child;
145 }
146
147 svn_pool_clear(logger->pool);
148
149 svn_error_clear(svn_mutex__unlock(logger->mutex, SVN_NO_ERROR));
150 }
151}
152
139 }
140
141 memcpy(errstr + len, APR_EOL_STR, sizeof(APR_EOL_STR));
142 len += sizeof(APR_EOL_STR) -1; /* add NL, ex terminating NUL */
143
144 svn_error_clear(svn_stream_write(logger->stream, errstr, &len));
145
146 continuation = "-";
147 err = err->child;
148 }
149
150 svn_pool_clear(logger->pool);
151
152 svn_error_clear(svn_mutex__unlock(logger->mutex, SVN_NO_ERROR));
153 }
154}
155
156void
157logger__log_error(logger_t *logger,
158 const svn_error_t *err,
159 repository_t *repository,
160 client_info_t *client_info)
161{
162 log_message(logger, err, "ERR", repository, client_info);
163}
164
165void
166logger__log_warning(logger_t *logger,
167 const svn_error_t *err,
168 repository_t *repository,
169 client_info_t *client_info)
170{
171 log_message(logger, err, "WARN", repository, client_info);
172}
173
153svn_error_t *
154logger__write(logger_t *logger,
155 const char *errstr,
156 apr_size_t len)
157{
158 SVN_MUTEX__WITH_LOCK(logger->mutex,
159 svn_stream_write(logger->stream, errstr, &len));
160 return SVN_NO_ERROR;
161}
174svn_error_t *
175logger__write(logger_t *logger,
176 const char *errstr,
177 apr_size_t len)
178{
179 SVN_MUTEX__WITH_LOCK(logger->mutex,
180 svn_stream_write(logger->stream, errstr, &len));
181 return SVN_NO_ERROR;
182}