1/* gzlog.h 2 Copyright (C) 2004, 2008 Mark Adler, all rights reserved 3 version 2.0, 25 Apr 2008 4 5 This software is provided 'as-is', without any express or implied 6 warranty. In no event will the author be held liable for any damages 7 arising from the use of this software. 8 9 Permission is granted to anyone to use this software for any purpose, 10 including commercial applications, and to alter it and redistribute it 11 freely, subject to the following restrictions: 12 13 1. The origin of this software must not be misrepresented; you must not 14 claim that you wrote the original software. If you use this software 15 in a product, an acknowledgment in the product documentation would be 16 appreciated but is not required. 17 2. Altered source versions must be plainly marked as such, and must not be 18 misrepresented as being the original software. 19 3. This notice may not be removed or altered from any source distribution. 20 21 Mark Adler madler@alumni.caltech.edu 22 */ 23 24/* Version History: 25 1.0 26 Nov 2004 First version 26 2.0 25 Apr 2008 Complete redesign for recovery of interrupted operations 27 Interface changed slightly in that now path is a prefix 28 Compression now occurs as needed during gzlog_write() 29 gzlog_write() now always leaves the log file as valid gzip 30 */ 31 32/* 33 The gzlog object allows writing short messages to a gzipped log file, 34 opening the log file locked for small bursts, and then closing it. The log 35 object works by appending stored (uncompressed) data to the gzip file until 36 1 MB has been accumulated. At that time, the stored data is compressed, and 37 replaces the uncompressed data in the file. The log file is truncated to 38 its new size at that time. After each write operation, the log file is a 39 valid gzip file that can decompressed to recover what was written. 40 41 The gzlog operations can be interupted at any point due to an application or 42 system crash, and the log file will be recovered the next time the log is 43 opened with gzlog_open(). 44 */ 45 46#ifndef GZLOG_H 47#define GZLOG_H 48 49/* gzlog object type */ 50typedef void gzlog; 51 52/* Open a gzlog object, creating the log file if it does not exist. Return 53 NULL on error. Note that gzlog_open() could take a while to complete if it 54 has to wait to verify that a lock is stale (possibly for five minutes), or 55 if there is significant contention with other instantiations of this object 56 when locking the resource. path is the prefix of the file names created by 57 this object. If path is "foo", then the log file will be "foo.gz", and 58 other auxiliary files will be created and destroyed during the process: 59 "foo.dict" for a compression dictionary, "foo.temp" for a temporary (next) 60 dictionary, "foo.add" for data being added or compressed, "foo.lock" for the 61 lock file, and "foo.repairs" to log recovery operations performed due to 62 interrupted gzlog operations. A gzlog_open() followed by a gzlog_close() 63 will recover a previously interrupted operation, if any. */ 64gzlog *gzlog_open(char *path); 65 66/* Write to a gzlog object. Return zero on success, -1 if there is a file i/o 67 error on any of the gzlog files (this should not happen if gzlog_open() 68 succeeded, unless the device has run out of space or leftover auxiliary 69 files have permissions or ownership that prevent their use), -2 if there is 70 a memory allocation failure, or -3 if the log argument is invalid (e.g. if 71 it was not created by gzlog_open()). This function will write data to the 72 file uncompressed, until 1 MB has been accumulated, at which time that data 73 will be compressed. The log file will be a valid gzip file upon successful 74 return. */ 75int gzlog_write(gzlog *log, void *data, size_t len); 76 77/* Force compression of any uncompressed data in the log. This should be used 78 sparingly, if at all. The main application would be when a log file will 79 not be appended to again. If this is used to compress frequently while 80 appending, it will both significantly increase the execution time and 81 reduce the compression ratio. The return codes are the same as for 82 gzlog_write(). */ 83int gzlog_compress(gzlog *log); 84 85/* Close a gzlog object. Return zero on success, -3 if the log argument is 86 invalid. The log object is freed, and so cannot be referenced again. */ 87int gzlog_close(gzlog *log); 88 89#endif 90