blob: 03fe2b8866de7ce310b8d6416a1085b3b574ae01 [file] [log] [blame]
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <stdarg.h>
#include "pub_debug_info.h"
#define DEBUG_INFO_MAX_TOTAL_LEN (140)
//#define DEBUG_INFO_MAX_DATA_LEN (128)
//#define DEBUG_INFO_MEM_HEAD_LEN (8)
ssize_t safe_write(int fd, const void *buf, size_t count)
{
ssize_t n;
for (;;) {
n = write(fd, buf, count);
if (n >= 0 || errno != EINTR)
break;
/* Some callers set errno=0, are upset when they see EINTR.
* Returning EINTR is wrong since we retry write(),
* the "error" was transient.
*/
errno = 0;
/* repeat the write() */
}
return n;
}
int sc_debug_info_record(char *id, const char *format, ...)
{
int fd = -1;
ssize_t writelen;
int len;
va_list args;
char str_buf[DEBUG_INFO_MAX_TOTAL_LEN] __attribute__((aligned(4)));
char *ptmpstr = str_buf;
/* args是一个char*类型指针,指向format之后的第一个参数*/
if( id == NULL)
return -1;
len = snprintf((char *)ptmpstr, DEBUG_INFO_MAX_TOTAL_LEN, "[%s]",id);
ptmpstr += len;
va_start(args, format);
len += vsnprintf(ptmpstr, DEBUG_INFO_MAX_TOTAL_LEN - len, format, args);
va_end(args);
if (len < 0)
{
printf("[libdebug_info]: vsnprintf format error, %s.\n", strerror(errno));
return -1;
}
fd = open(DEBUG_INFO_DEV_PATH, O_WRONLY);
if (fd < 0)
{
printf("[libdebug_info]: sc_debug_info_record, open debug_info error, %s\n", strerror(errno));
return -1;
}
writelen = safe_write(fd, (char *)str_buf, len);
if (writelen < 0)
{
printf("[libdebug_info]: sc_debug_info_record, write debug_info error, %s\n", strerror(errno));
return -1;
}
if (fd >= 0)
{
close(fd);
}
return writelen;
}