87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering/***
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering This file is part of systemd.
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering Copyright 2011 Lennart Poettering
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering systemd is free software; you can redistribute it and/or modify it
5430f7f2bc7330f3088b894166bf3524a067e3d8Lennart Poettering under the terms of the GNU Lesser General Public License as published by
5430f7f2bc7330f3088b894166bf3524a067e3d8Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering (at your option) any later version.
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering systemd is distributed in the hope that it will be useful, but
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2bc7330f3088b894166bf3524a067e3d8Lennart Poettering Lesser General Public License for more details.
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
5430f7f2bc7330f3088b894166bf3524a067e3d8Lennart Poettering You should have received a copy of the GNU Lesser General Public License
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering***/
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering#include <fcntl.h>
0ac38b707212e9aa40e25d65ffbae648cc9116f5Lennart Poettering#include <unistd.h>
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
0284adc6a60ce0af1107cb0b50041a65d731f39eLennart Poettering#include "journal-authenticate.h"
cf0fbc49e67b55f8d346fc94de28c90113505297Thomas Hindoe Paaboel Andersen#include "journal-file.h"
0284adc6a60ce0af1107cb0b50041a65d731f39eLennart Poettering#include "journal-vacuum.h"
cf0fbc49e67b55f8d346fc94de28c90113505297Thomas Hindoe Paaboel Andersen#include "log.h"
cf0fbc49e67b55f8d346fc94de28c90113505297Thomas Hindoe Paaboel Andersen#include "rm-rf.h"
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmekstatic bool arg_keep = false;
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmekstatic void test_non_empty(void) {
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering dual_timestamp ts;
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering JournalFile *f;
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering struct iovec iovec;
3c1668da6202f1ead3d4d3981b89e9da1a0e98e3Lennart Poettering static const char test[] = "TEST1=1", test2[] = "TEST2=2";
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering Object *o;
de190aef08bb267b645205a747762df573b36834Lennart Poettering uint64_t p;
95ea1b90cc61f464f3b9bc147119dee4ba9620b8Lennart Poettering char t[] = "/tmp/journal-XXXXXX";
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering log_set_max_level(LOG_DEBUG);
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
95ea1b90cc61f464f3b9bc147119dee4ba9620b8Lennart Poettering assert_se(mkdtemp(t));
95ea1b90cc61f464f3b9bc147119dee4ba9620b8Lennart Poettering assert_se(chdir(t) >= 0);
0ac38b707212e9aa40e25d65ffbae648cc9116f5Lennart Poettering
16e9f408fa9a9626059bdd6c89dc175e06b9e976Lennart Poettering assert_se(journal_file_open("test.journal", O_RDWR|O_CREAT, 0666, true, true, NULL, NULL, NULL, &f) == 0);
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering dual_timestamp_get(&ts);
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering iovec.iov_base = (void*) test;
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering iovec.iov_len = strlen(test);
c2373f848dddcc1827cf715c5ef778dc8d475761Lennart Poettering assert_se(journal_file_append_entry(f, &ts, &iovec, 1, NULL, NULL, NULL) == 0);
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering iovec.iov_base = (void*) test2;
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering iovec.iov_len = strlen(test2);
c2373f848dddcc1827cf715c5ef778dc8d475761Lennart Poettering assert_se(journal_file_append_entry(f, &ts, &iovec, 1, NULL, NULL, NULL) == 0);
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering iovec.iov_base = (void*) test;
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering iovec.iov_len = strlen(test);
c2373f848dddcc1827cf715c5ef778dc8d475761Lennart Poettering assert_se(journal_file_append_entry(f, &ts, &iovec, 1, NULL, NULL, NULL) == 0);
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
feb12d3ed2c7f9132c64773c7c41b9e3a608a814Lennart Poettering#ifdef HAVE_GCRYPT
b0af6f41ea67c97b8beb16fd1d63042379bbf103Lennart Poettering journal_file_append_tag(f);
feb12d3ed2c7f9132c64773c7c41b9e3a608a814Lennart Poettering#endif
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering journal_file_dump(f);
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
f534928ad7aaeec0bec2d653b4a50e79b0fc8418Michal Schmidt assert_se(journal_file_next_entry(f, 0, DIRECTION_DOWN, &o, &p) == 1);
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(le64toh(o->entry.seqnum) == 1);
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
f534928ad7aaeec0bec2d653b4a50e79b0fc8418Michal Schmidt assert_se(journal_file_next_entry(f, p, DIRECTION_DOWN, &o, &p) == 1);
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(le64toh(o->entry.seqnum) == 2);
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
f534928ad7aaeec0bec2d653b4a50e79b0fc8418Michal Schmidt assert_se(journal_file_next_entry(f, p, DIRECTION_DOWN, &o, &p) == 1);
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(le64toh(o->entry.seqnum) == 3);
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
f534928ad7aaeec0bec2d653b4a50e79b0fc8418Michal Schmidt assert_se(journal_file_next_entry(f, p, DIRECTION_DOWN, &o, &p) == 0);
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
f534928ad7aaeec0bec2d653b4a50e79b0fc8418Michal Schmidt assert_se(journal_file_next_entry(f, 0, DIRECTION_DOWN, &o, &p) == 1);
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(le64toh(o->entry.seqnum) == 1);
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(journal_file_find_data_object(f, test, strlen(test), NULL, &p) == 1);
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_DOWN, &o, NULL) == 1);
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(le64toh(o->entry.seqnum) == 1);
de190aef08bb267b645205a747762df573b36834Lennart Poettering
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_UP, &o, NULL) == 1);
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(le64toh(o->entry.seqnum) == 3);
de190aef08bb267b645205a747762df573b36834Lennart Poettering
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(journal_file_find_data_object(f, test2, strlen(test2), NULL, &p) == 1);
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_UP, &o, NULL) == 1);
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(le64toh(o->entry.seqnum) == 2);
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_DOWN, &o, NULL) == 1);
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(le64toh(o->entry.seqnum) == 2);
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(journal_file_find_data_object(f, "quux", 4, NULL, &p) == 0);
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(journal_file_move_to_entry_by_seqnum(f, 1, DIRECTION_DOWN, &o, NULL) == 1);
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(le64toh(o->entry.seqnum) == 1);
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(journal_file_move_to_entry_by_seqnum(f, 3, DIRECTION_DOWN, &o, NULL) == 1);
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(le64toh(o->entry.seqnum) == 3);
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(journal_file_move_to_entry_by_seqnum(f, 2, DIRECTION_DOWN, &o, NULL) == 1);
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(le64toh(o->entry.seqnum) == 2);
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
787784c4c1b24a13207d18b415d60483cfbdeaa3Ronny Chevalier assert_se(journal_file_move_to_entry_by_seqnum(f, 10, DIRECTION_DOWN, &o, NULL) == 0);
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
7560fffcd2531786b9c1ca657667a43e90331326Lennart Poettering journal_file_rotate(&f, true, true);
7560fffcd2531786b9c1ca657667a43e90331326Lennart Poettering journal_file_rotate(&f, true, true);
0ac38b707212e9aa40e25d65ffbae648cc9116f5Lennart Poettering
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering journal_file_close(f);
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek log_info("Done...");
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek if (arg_keep)
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek log_info("Not removing %s", t);
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek else {
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering journal_directory_vacuum(".", 3000000, 0, 0, NULL, true);
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek
c6878637502b1717a110a9a7e8bba32a8583fcdfLennart Poettering assert_se(rm_rf(t, REMOVE_ROOT|REMOVE_PHYSICAL) >= 0);
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek }
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek puts("------------------------------------------------------------");
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek}
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmekstatic void test_empty(void) {
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek JournalFile *f1, *f2, *f3, *f4;
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek char t[] = "/tmp/journal-XXXXXX";
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek log_set_max_level(LOG_DEBUG);
0ac38b707212e9aa40e25d65ffbae648cc9116f5Lennart Poettering
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek assert_se(mkdtemp(t));
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek assert_se(chdir(t) >= 0);
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek assert_se(journal_file_open("test.journal", O_RDWR|O_CREAT, 0666, false, false, NULL, NULL, NULL, &f1) == 0);
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek assert_se(journal_file_open("test-compress.journal", O_RDWR|O_CREAT, 0666, true, false, NULL, NULL, NULL, &f2) == 0);
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek assert_se(journal_file_open("test-seal.journal", O_RDWR|O_CREAT, 0666, false, true, NULL, NULL, NULL, &f3) == 0);
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek assert_se(journal_file_open("test-seal-compress.journal", O_RDWR|O_CREAT, 0666, true, true, NULL, NULL, NULL, &f4) == 0);
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek journal_file_print_header(f1);
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek puts("");
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek journal_file_print_header(f2);
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek puts("");
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek journal_file_print_header(f3);
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek puts("");
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek journal_file_print_header(f4);
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek puts("");
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek log_info("Done...");
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek if (arg_keep)
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek log_info("Not removing %s", t);
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek else {
8580d1f73db36e9383e674e388b4fb55828c0c66Lennart Poettering journal_directory_vacuum(".", 3000000, 0, 0, NULL, true);
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek
c6878637502b1717a110a9a7e8bba32a8583fcdfLennart Poettering assert_se(rm_rf(t, REMOVE_ROOT|REMOVE_PHYSICAL) >= 0);
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek }
510b857f7d1e7e8d38912890536342dd5dd647ddLennart Poettering
510b857f7d1e7e8d38912890536342dd5dd647ddLennart Poettering journal_file_close(f1);
510b857f7d1e7e8d38912890536342dd5dd647ddLennart Poettering journal_file_close(f2);
510b857f7d1e7e8d38912890536342dd5dd647ddLennart Poettering journal_file_close(f3);
510b857f7d1e7e8d38912890536342dd5dd647ddLennart Poettering journal_file_close(f4);
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek}
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmekint main(int argc, char *argv[]) {
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek arg_keep = argc > 1;
6ad1d1c30621280bfad3e63fcc1c7ceb7d8ffa98Lennart Poettering
143bfdaf0b890fa7acadf02d1eafacaef1b696bdHolger Hans Peter Freyther /* journal_file_open requires a valid machine id */
143bfdaf0b890fa7acadf02d1eafacaef1b696bdHolger Hans Peter Freyther if (access("/etc/machine-id", F_OK) != 0)
143bfdaf0b890fa7acadf02d1eafacaef1b696bdHolger Hans Peter Freyther return EXIT_TEST_SKIP;
143bfdaf0b890fa7acadf02d1eafacaef1b696bdHolger Hans Peter Freyther
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek test_non_empty();
6eb7a9a0010d035e5bdbbf70227088ce02b2120eZbigniew Jędrzejewski-Szmek test_empty();
95ea1b90cc61f464f3b9bc147119dee4ba9620b8Lennart Poettering
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering return 0;
87d2c1ff6a7375f03476767e6f59454bcc5cd04bLennart Poettering}