mcabber/src/histolog.c
author Mikael Berthe <mikael@lilotux.net>
Sat, 27 Aug 2005 11:21:27 +0200
changeset 403 17aa60c6dc63
parent 395 3e4f2f98c0bf
child 576 8b3db0b555a1
permissions -rw-r--r--
Allow a different server name than the jid domain name Sync libjabber with upstream (centericq). The libjabber patch is from Ian Johannesen. This allows connecting to Google Talk, for example.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
     1
/*
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
     2
 * histolog.c     -- File history handling
395
3e4f2f98c0bf Whitespace cleanup (histolog.c)
Mikael Berthe <mikael@lilotux.net>
parents: 394
diff changeset
     3
 *
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
     4
 * Copyright (C) 2005 Mikael Berthe <bmikael@lists.lilotux.net>
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
     5
 *
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
     6
 * This program is free software; you can redistribute it and/or modify
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
     7
 * it under the terms of the GNU General Public License as published by
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
     8
 * the Free Software Foundation; either version 2 of the License, or (at
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
     9
 * your option) any later version.
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    10
 *
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    11
 * This program is distributed in the hope that it will be useful, but
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    12
 * WITHOUT ANY WARRANTY; without even the implied warranty of
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    14
 * General Public License for more details.
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    15
 *
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    17
 * along with this program; if not, write to the Free Software
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    19
 * USA
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    20
 */
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    21
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    22
#include <string.h>
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    23
#include <stdlib.h>
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    24
#include <time.h>
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
    25
#include <ctype.h>
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
    26
#include <sys/types.h>
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
    27
#include <sys/stat.h>
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
    28
#include <fcntl.h>
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    29
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    30
#include "histolog.h"
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
    31
#include "hbuf.h"
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
    32
#include "jabglue.h"
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 221
diff changeset
    33
#include "utils.h"
378
2e6c7b1440d1 Improve debugging/logging
Mikael Berthe <mikael@lilotux.net>
parents: 374
diff changeset
    34
#include "logprint.h"
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    35
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    36
static guint UseFileLogging;
177
a51ce78a0e2a [/trunk] Changeset 189 by mikael
mikael
parents: 169
diff changeset
    37
static guint FileLoadLogs;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    38
static char *RootDir;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    39
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    40
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    41
//  user_histo_file()
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    42
// Returns history filename for the given jid
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    43
// Note: the caller *must* free the filename after use (if not null).
111
d896962c16fa [/trunk] Changeset 125 by mikael
mikael
parents: 110
diff changeset
    44
static char *user_histo_file(const char *jid)
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    45
{
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    46
  char *filename;
186
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
    47
  char *lowerid, *p;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
    48
  if (!UseFileLogging && !FileLoadLogs) return NULL;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    49
186
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
    50
  lowerid = g_strdup(jid);
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
    51
  for (p=lowerid; *p ; p++)
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
    52
    *p = tolower(*p);
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
    53
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    54
  filename = g_new(char, strlen(RootDir) + strlen(jid) + 1);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    55
  strcpy(filename, RootDir);
186
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
    56
  strcat(filename, lowerid);
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
    57
  g_free(lowerid);
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    58
  return filename;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    59
}
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    60
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
    61
//  write_histo_line()
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    62
// Adds a history (multi-)line to the jid's history logfile
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
    63
static void write_histo_line(const char *jid,
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
    64
        time_t timestamp, guchar type, guchar info, const char *data)
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    65
{
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    66
  guint len = 0;
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
    67
  FILE *fp;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    68
  time_t ts;
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
    69
  const char *p;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
    70
  char *filename;
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 221
diff changeset
    71
  char str_ts[20];
273
fe438fe67b6f Error checking when writing log files
mikael@frmp8452
parents: 259
diff changeset
    72
  int err;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    73
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
    74
  if (!UseFileLogging) return;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
    75
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
    76
  filename = user_histo_file(jid);
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    77
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    78
  // If timestamp is null, get current date
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    79
  if (timestamp)
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    80
    ts = timestamp;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    81
  else
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    82
    time(&ts);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    83
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    84
  if (!data)
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    85
    data = "";
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    86
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    87
  // Count number of extra lines
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    88
  for (p=data ; *p ; p++)
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    89
    if (*p == '\n') len++;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    90
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 221
diff changeset
    91
  /* Line format: "TI yyyymmddThh:mm:ssZ [data]"
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 221
diff changeset
    92
   * (Old format: "TI DDDDDDDDDD LLL [data])"
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 221
diff changeset
    93
   * T=Type, I=Info, yyyymmddThh:mm:ssZ=date, LLL=0-padded-len
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    94
   *
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    95
   * Types:
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    96
   * - M message    Info: S (send) R (receive)
352
e7e2f2fcc765 Correct a comment
Mikael Berthe <mikael@lilotux.net>
parents: 281
diff changeset
    97
   * - S status     Info: [_oifdna]
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    98
   * We don't check them, we'll trust the caller.
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
    99
   */
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   100
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
   101
  fp = fopen(filename, "a");
155
8a54d46e889a [/trunk] Changeset 167 by mikael
mikael
parents: 118
diff changeset
   102
  g_free(filename);
273
fe438fe67b6f Error checking when writing log files
mikael@frmp8452
parents: 259
diff changeset
   103
  if (!fp) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
   104
    scr_LogPrint(LPRINT_LOGNORM, "Unable to write history "
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
   105
                 "(cannot open logfile)");
273
fe438fe67b6f Error checking when writing log files
mikael@frmp8452
parents: 259
diff changeset
   106
    return;
fe438fe67b6f Error checking when writing log files
mikael@frmp8452
parents: 259
diff changeset
   107
  }
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   108
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 221
diff changeset
   109
  to_iso8601(str_ts, ts);
273
fe438fe67b6f Error checking when writing log files
mikael@frmp8452
parents: 259
diff changeset
   110
  err = fprintf(fp, "%c%c %-18.18s %03d %s\n", type, info, str_ts, len, data);
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
   111
  fclose(fp);
273
fe438fe67b6f Error checking when writing log files
mikael@frmp8452
parents: 259
diff changeset
   112
  if (err < 0) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
   113
    scr_LogPrint(LPRINT_LOGNORM, "Error while writing to log file: %s",
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
   114
                 strerror(errno));
273
fe438fe67b6f Error checking when writing log files
mikael@frmp8452
parents: 259
diff changeset
   115
  }
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   116
}
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   117
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   118
//  hlog_read_history()
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   119
// Reads the jid's history logfile
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   120
void hlog_read_history(const char *jid, GList **p_buddyhbuf, guint width)
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   121
{
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   122
  char *filename;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   123
  guchar type, info;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   124
  char *data, *tail;
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 183
diff changeset
   125
  time_t timestamp;
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 183
diff changeset
   126
  guint prefix_flags;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   127
  guint len;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   128
  FILE *fp;
197
c289e3c39c48 [/trunk] Changeset 209 by mikael
mikael
parents: 193
diff changeset
   129
  struct stat bufstat;
193
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
   130
  guint err = 0;
248
701651393076 [/trunk] Changeset 261 by mikael
mikael
parents: 241
diff changeset
   131
  guint ln = 0; // line number
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   132
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   133
  if (!FileLoadLogs) return;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   134
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   135
  data = g_new(char, HBB_BLOCKSIZE+32);
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   136
  if (!data) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
   137
    scr_LogPrint(LPRINT_LOGNORM, "Not enough memory to read history file");
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   138
    return;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   139
  }
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   140
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   141
  filename = user_histo_file(jid);
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   142
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   143
  fp = fopen(filename, "r");
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   144
  g_free(filename);
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   145
  if (!fp) { g_free(data); return; }
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   146
394
4617d0f029ea Update "large file" size value to 3MB
Mikael Berthe <mikael@lilotux.net>
parents: 378
diff changeset
   147
  // If file is large (> 3MB here), display a message to inform the user
197
c289e3c39c48 [/trunk] Changeset 209 by mikael
mikael
parents: 193
diff changeset
   148
  // (it can take a while...)
c289e3c39c48 [/trunk] Changeset 209 by mikael
mikael
parents: 193
diff changeset
   149
  if (!fstat(fileno(fp), &bufstat)) {
394
4617d0f029ea Update "large file" size value to 3MB
Mikael Berthe <mikael@lilotux.net>
parents: 378
diff changeset
   150
    if (bufstat.st_size > 3145728)
4617d0f029ea Update "large file" size value to 3MB
Mikael Berthe <mikael@lilotux.net>
parents: 378
diff changeset
   151
      scr_LogPrint(LPRINT_LOGNORM, "Reading <%s> history file...", jid);
197
c289e3c39c48 [/trunk] Changeset 209 by mikael
mikael
parents: 193
diff changeset
   152
  }
c289e3c39c48 [/trunk] Changeset 209 by mikael
mikael
parents: 193
diff changeset
   153
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   154
  /* See write_histo_line() for line format... */
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   155
  while (!feof(fp)) {
259
594e73bc9610 Remove support for old logfile format
mikael@frmp8452
parents: 251
diff changeset
   156
    if (fgets(data, HBB_BLOCKSIZE+27, fp) == NULL) break;
248
701651393076 [/trunk] Changeset 261 by mikael
mikael
parents: 241
diff changeset
   157
    ln++;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   158
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   159
    for (tail = data; *tail; tail++) ;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   160
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   161
    type = data[0];
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   162
    info = data[1];
241
8584f919d9b9 [/trunk] Changeset 254 by mikael
mikael
parents: 221
diff changeset
   163
395
3e4f2f98c0bf Whitespace cleanup (histolog.c)
Mikael Berthe <mikael@lilotux.net>
parents: 394
diff changeset
   164
    if ((type != 'M' && type != 'S') ||
259
594e73bc9610 Remove support for old logfile format
mikael@frmp8452
parents: 251
diff changeset
   165
        ((data[11] != 'T') || (data[20] != 'Z') ||
594e73bc9610 Remove support for old logfile format
mikael@frmp8452
parents: 251
diff changeset
   166
         (data[21] != ' ') || (data[25] != ' '))) {
193
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
   167
      if (!err) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
   168
        scr_LogPrint(LPRINT_LOGNORM, "Error in history file format (%s), l.%u",
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
   169
                     jid, ln);
193
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
   170
        err = 1;
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
   171
      }
186
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
   172
      //break;
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
   173
      continue;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   174
    }
259
594e73bc9610 Remove support for old logfile format
mikael@frmp8452
parents: 251
diff changeset
   175
    data[21] = data[25] = 0;
594e73bc9610 Remove support for old logfile format
mikael@frmp8452
parents: 251
diff changeset
   176
    timestamp = from_iso8601(&data[3], 1);
594e73bc9610 Remove support for old logfile format
mikael@frmp8452
parents: 251
diff changeset
   177
    len = (guint) atoi(&data[22]);
395
3e4f2f98c0bf Whitespace cleanup (histolog.c)
Mikael Berthe <mikael@lilotux.net>
parents: 394
diff changeset
   178
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   179
    // Some checks
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   180
    if (((type == 'M') && (info != 'S' && info != 'R')) ||
277
4d7040cff8ee Remove busy/occupied status, which does not really exist
Mikael Berthe <mikael@lilotux.net>
parents: 273
diff changeset
   181
        ((type == 'I') && (!strchr("OAIFDN", info)))) {
193
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
   182
      if (!err) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
   183
        scr_LogPrint(LPRINT_LOGNORM, "Error in history file format (%s), l.%u",
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
   184
                     jid, ln);
193
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
   185
        err = 1;
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
   186
      }
186
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
   187
      //break;
888ad9f15346 [/trunk] Changeset 198 by mikael
mikael
parents: 184
diff changeset
   188
      continue;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   189
    }
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   190
197
c289e3c39c48 [/trunk] Changeset 209 by mikael
mikael
parents: 193
diff changeset
   191
    // XXX This will fail when a message is too big
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   192
    while (len--) {
248
701651393076 [/trunk] Changeset 261 by mikael
mikael
parents: 241
diff changeset
   193
      ln++;
259
594e73bc9610 Remove support for old logfile format
mikael@frmp8452
parents: 251
diff changeset
   194
      if (fgets(tail, HBB_BLOCKSIZE+27 - (tail-data), fp) == NULL)
249
c3e6e78d1ab4 [/trunk] Changeset 262 by mikael
mikael
parents: 248
diff changeset
   195
        break;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   196
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   197
      while (*tail) tail++;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   198
    }
248
701651393076 [/trunk] Changeset 261 by mikael
mikael
parents: 241
diff changeset
   199
    // Small check for too long messages
259
594e73bc9610 Remove support for old logfile format
mikael@frmp8452
parents: 251
diff changeset
   200
    if (tail >= HBB_BLOCKSIZE+26 + data) {
249
c3e6e78d1ab4 [/trunk] Changeset 262 by mikael
mikael
parents: 248
diff changeset
   201
      // Maybe we will have a parse error on next, because this
c3e6e78d1ab4 [/trunk] Changeset 262 by mikael
mikael
parents: 248
diff changeset
   202
      // message is big (maybe too big).
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
   203
      scr_LogPrint(LPRINT_LOGNORM, "A message could be too big "
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
   204
                   "in history file...");
248
701651393076 [/trunk] Changeset 261 by mikael
mikael
parents: 241
diff changeset
   205
    }
251
806fcdd3b5da [/trunk] Changeset 264 by mikael
mikael
parents: 250
diff changeset
   206
    // Remove last CR (we keep it if the line is empty, too)
259
594e73bc9610 Remove support for old logfile format
mikael@frmp8452
parents: 251
diff changeset
   207
    if ((tail > data+26) && (*(tail-1) == '\n'))
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   208
      *(tail-1) = 0;
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   209
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   210
    if (type == 'M') {
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   211
      if (info == 'S')
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 183
diff changeset
   212
        prefix_flags = HBB_PREFIX_OUT;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   213
      else
184
b5aa2b9c425a [/trunk] Changeset 196 by mikael
mikael
parents: 183
diff changeset
   214
        prefix_flags = HBB_PREFIX_IN;
259
594e73bc9610 Remove support for old logfile format
mikael@frmp8452
parents: 251
diff changeset
   215
      hbuf_add_line(p_buddyhbuf, &data[26], timestamp,
249
c3e6e78d1ab4 [/trunk] Changeset 262 by mikael
mikael
parents: 248
diff changeset
   216
                    prefix_flags, width);
193
5cbdcccfab29 [/trunk] Changeset 205 by mikael
mikael
parents: 186
diff changeset
   217
      err = 0;
178
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   218
    }
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   219
  }
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   220
  fclose(fp);
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   221
  g_free(data);
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   222
}
cfefae4b6de9 [/trunk] Changeset 190 by mikael
mikael
parents: 177
diff changeset
   223
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   224
//  hlog_enable()
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   225
// Enable logging to files.  If root_dir is NULL, then $HOME/.mcabber is used.
177
a51ce78a0e2a [/trunk] Changeset 189 by mikael
mikael
parents: 169
diff changeset
   226
// If loadfiles is TRUE, we will try to load buddies history logs from file.
281
f562b9af2de7 Add "const" specifier in prototypes
Mikael Berthe <mikael@lilotux.net>
parents: 277
diff changeset
   227
void hlog_enable(guint enable, const char *root_dir, guint loadfiles)
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   228
{
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   229
  UseFileLogging = enable;
177
a51ce78a0e2a [/trunk] Changeset 189 by mikael
mikael
parents: 169
diff changeset
   230
  FileLoadLogs = loadfiles;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   231
177
a51ce78a0e2a [/trunk] Changeset 189 by mikael
mikael
parents: 169
diff changeset
   232
  if (enable || loadfiles) {
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   233
    if (root_dir) {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   234
      int l = strlen(root_dir);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   235
      if (l < 1) {
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
   236
        scr_LogPrint(LPRINT_LOGNORM, "Error: logging dir name too short");
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
   237
        UseFileLogging = FileLoadLogs = FALSE;
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   238
        return;
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   239
      }
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   240
      // RootDir must be slash-terminated
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   241
      if (root_dir[l-1] == '/')
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   242
        RootDir = g_strdup(root_dir);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   243
      else {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   244
        RootDir = g_new(char, l+2);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   245
        strcpy(RootDir, root_dir);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   246
        strcat(RootDir, "/");
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   247
      }
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   248
    } else {
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   249
      char *home = getenv("HOME");
169
0ed6099b5a54 [/trunk] Changeset 181 by mikael
mikael
parents: 155
diff changeset
   250
      char *dir = "/.mcabber/histo/";
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   251
      RootDir = g_new(char, strlen(home) + strlen(dir) + 1);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   252
      strcpy(RootDir, home);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   253
      strcat(RootDir, dir);
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   254
    }
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
   255
    // Check directory permissions (should not be readable by group/others)
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
   256
    if (checkset_perm(RootDir, TRUE) == -1) {
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
   257
      // The directory does not actually exists
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
   258
      g_free(RootDir);
374
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
   259
      scr_LogPrint(LPRINT_LOGNORM, "ERROR: Cannot access "
bd5638c21834 Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents: 366
diff changeset
   260
                   "history log directory, logging DISABLED");
362
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
   261
      UseFileLogging = FileLoadLogs = FALSE;
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
   262
    }
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
   263
  } else {  // Disable history logging
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
   264
    if (RootDir)
d8f147d6e872 Check directory and config file permissions
Mikael Berthe <mikael@lilotux.net>
parents: 352
diff changeset
   265
      g_free(RootDir);
110
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   266
  }
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   267
}
3d41aca3d878 [/trunk] Changeset 124 by mikael
mikael
parents:
diff changeset
   268
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
   269
inline void hlog_write_message(const char *jid, time_t timestamp, int sent,
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
   270
        const char *msg)
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
   271
{
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
   272
  write_histo_line(jid, timestamp, 'M', ((sent) ? 'S' : 'R'), msg);
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
   273
}
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
   274
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
   275
inline void hlog_write_status(const char *jid, time_t timestamp,
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 197
diff changeset
   276
        enum imstatus status, const char *status_msg)
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
   277
{
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
   278
  // #1 XXX Check status value?
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
   279
  // #2 We could add a user-readable comment
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
   280
  write_histo_line(jid, timestamp, 'S', toupper(imstatus2char[status]),
221
73f6ce668ba8 [/trunk] Changeset 233 by mikael
mikael
parents: 197
diff changeset
   281
          status_msg);
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
   282
}
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 111
diff changeset
   283