Handle too-short write(3)s in mod_json_cdr

write(3) can write fewer bytes than was requested for any number of
reasons.  The correct behavior is to retry unless there is an error.

If there is an error, try to unlink the file; no sense in leaving
corrupted data laying around.
This commit is contained in:
Travis Cross 2014-03-02 22:14:51 +00:00
parent e3bae77645
commit 3bd9c60f8e

View File

@ -244,12 +244,15 @@ static switch_status_t my_on_reporting(switch_core_session_t *session)
#else
if ((fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)) > -1) {
#endif
int wrote;
wrote = write(fd, json_text, (unsigned) strlen(json_text));
close(fd);
fd = -1;
if(wrote < 0) {
switch_size_t json_len = strlen(json_text);
switch_ssize_t wrote = 0, x;
do { x = write(fd, json_text, json_len);
} while (!(x<0) && json_len > (wrote += x));
close(fd); fd = -1;
if (x < 0) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error writing [%s]\n",path);
if (0 > unlink(path))
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error unlinking [%s]\n",path);
}
} else {
char ebuf[512] = { 0 };