1 /* 2 Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. 3 4 This program is free software; you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; version 2 of the License. 7 8 This program is distributed in the hope that it will be useful, 9 but WITHOUT ANY WARRANTY; without even the implied warranty of 10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 GNU General Public License for more details. 12 13 You should have received a copy of the GNU General Public License 14 along with this program; see the file COPYING. If not, write to the 15 Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, 16 MA 02110-1335 USA. 17 */ 18 19 /* Debug logging functions 20 */ 21 22 23 #include "runtime.hpp" 24 #include "log.hpp" 25 26 #ifdef YASSL_LOG 27 #include <time.h> 28 #include <stdio.h> 29 #include <string.h> 30 #endif 31 32 33 34 namespace yaSSL { 35 36 37 #ifdef YASSL_LOG 38 39 enum { MAX_MSG = 81 }; 40 41 Log::Log(const char* str) 42 { 43 log_ = fopen(str, "w"); 44 Trace("********** Logger Attached **********"); 45 } 46 47 48 Log::~Log() 49 { 50 Trace("********** Logger Detached **********"); 51 fclose(log_); 52 } 53 54 55 // Trace a message 56 void Log::Trace(const char* str) 57 { 58 if (!log_) return; 59 60 time_t clicks = time(0); 61 char timeStr[32]; 62 63 // get rid of newline 64 strncpy(timeStr, ctime(&clicks), sizeof(timeStr)); 65 unsigned int len = strlen(timeStr); 66 timeStr[len - 1] = 0; 67 68 char msg[MAX_MSG]; 69 70 strncpy(msg, timeStr, sizeof(timeStr)); 71 strncat(msg, ":", 1); 72 strncat(msg, str, MAX_MSG - sizeof(timeStr) - 2); 73 strncat(msg, "\n", 1); 74 msg[MAX_MSG - 1] = 0; 75 76 fputs(msg, log_); 77 } 78 79 80 #if defined(_WIN32) || defined(__MACH__) || defined(__hpux__) 81 typedef int socklen_t; 82 #endif 83 84 85 // write tcp address 86 void Log::ShowTCP(socket_t fd, bool ended) 87 { 88 sockaddr_in peeraddr; 89 socklen_t len = sizeof(peeraddr); 90 if (getpeername(fd, (sockaddr*)&peeraddr, &len) != 0) 91 return; 92 93 const char* p = reinterpret_cast<const char*>(&peeraddr.sin_addr); 94 char msg[MAX_MSG]; 95 char number[16]; 96 97 if (ended) 98 strncpy(msg, "yaSSL conn DONE w/ peer ", 26); 99 else 100 strncpy(msg, "yaSSL conn BEGUN w/ peer ", 26); 101 for (int i = 0; i < 4; ++i) { 102 sprintf(number, "%u", static_cast<unsigned short>(p[i])); 103 strncat(msg, number, 8); 104 if (i < 3) 105 strncat(msg, ".", 1); 106 } 107 strncat(msg, " port ", 8); 108 sprintf(number, "%d", htons(peeraddr.sin_port)); 109 strncat(msg, number, 8); 110 111 msg[MAX_MSG - 1] = 0; 112 Trace(msg); 113 } 114 115 116 // log processed data 117 void Log::ShowData(uint bytes, bool sent) 118 { 119 char msg[MAX_MSG]; 120 char number[16]; 121 122 if (sent) 123 strncpy(msg, "Sent ", 10); 124 else 125 strncpy(msg, "Received ", 10); 126 sprintf(number, "%u", bytes); 127 strncat(msg, number, 8); 128 strncat(msg, " bytes of application data", 27); 129 130 msg[MAX_MSG - 1] = 0; 131 Trace(msg); 132 } 133 134 135 #else // no YASSL_LOG 136 137 138 Log::Log(const char*) {} 139 Log::~Log() {} 140 void Log::Trace(const char*) {} 141 void Log::ShowTCP(socket_t, bool) {} 142 void Log::ShowData(uint, bool) {} 143 144 145 #endif // YASSL_LOG 146 } // namespace 147