| 98 | | int log_start_logging(LOG_REC *log) |
| 99 | | { |
| 100 | | char *dir; |
| 101 | | struct flock lock; |
| 102 | | |
| 103 | | g_return_val_if_fail(log != NULL, FALSE);
|
| 104 | | |
| 105 | | if (log->handle != -1) |
| 106 | | return TRUE;
|
| 107 | | |
| 108 | | |
| 109 | | g_free_not_null(log->real_fname);
|
| 110 | | log->real_fname = log_filename(log); |
| 111 | | |
| 112 | | if (log->real_fname != NULL &&
|
| 113 | | strcmp(log->real_fname, log->fname) != 0) { |
| 114 | | |
| 115 | | |
| 116 | | dir = g_path_get_dirname(log->real_fname); |
| 117 | | mkpath(dir, log_dir_create_mode); |
| 118 | | g_free(dir); |
| 119 | | } |
| 120 | | |
| 121 | | log->handle = log->real_fname == NULL ? -1 :
|
| 122 | | open(log->real_fname, O_WRONLY | O_APPEND | O_CREAT,
|
| 123 | | log_file_create_mode); |
| 124 | | if (log->handle == -1) { |
| 125 | | signal_emit("log create failed", 1, log); |
| 126 | | log->failed = TRUE;
|
| 127 | | return FALSE;
|
| 128 | | } |
| 129 | | memset(&lock, 0, sizeof(lock)); |
| 130 | | lock.l_type = F_WRLCK;
|
| 131 | | if (fcntl(log->handle, F_SETLK, &lock) == -1 && errno == EACCES) {
|
| 132 | | close(log->handle); |
| 133 | | log->handle = -1; |
| 134 | | signal_emit("log locked", 1, log); |
| 135 | | log->failed = TRUE;
|
| 136 | | return FALSE;
|
| 137 | | } |
| 138 | | lseek(log->handle, 0, SEEK_END);
|
| 139 | | |
| 140 | | log->opened = log->last = time(NULL);
|
| 141 | | log_write_timestamp(log->handle, |
| 142 | | settings_get_str("log_open_string"), |
| 143 | | "\n", log->last); |
| 144 | | |
| 145 | | signal_emit("log started", 1, log); |
| 146 | | log->failed = FALSE;
|
| 147 | | return TRUE;
|
| 148 | | } |