| #include <psxabi/sys_sysapi.h> |
| #include <psxabi/sys_errno.h> |
| #include <psxxfi/xfi_base.h> |
| |
| #include <ntux/ntux.h> |
| #include "ntux_driver_impl.h" |
| #include "ntux_nolibc_impl.h" |
| #include "ntux_errinfo_impl.h" |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <unistd.h> |
| |
| int ntux_dprintf(int fd, const char * fmt, ...) |
| { |
| int ret; |
| int cnt; |
| int size; |
| va_list ap; |
| char * ch; |
| char * buf; |
| char chbuf[2048]; |
| |
| va_start(ap,fmt); |
| |
| size = sizeof(chbuf); |
| buf = ((cnt = __xfi_vsnprintf(chbuf,size,fmt,ap)) < size) |
| ? chbuf : calloc(1, cnt + 1); |
| |
| va_end(ap); |
| |
| if (buf == chbuf) { |
| (void)0; |
| |
| } else if (buf) { |
| va_start(ap,fmt); |
| __xfi_vsprintf(buf,fmt,ap); |
| va_end(ap); |
| |
| } else { |
| return -1; |
| } |
| |
| ret = 0; |
| ch = buf; |
| |
| for (; cnt && ret>=0; ) { |
| ret = __sys_write(fd,ch,cnt); |
| |
| while ((ret < 0) && (ret == -EINTR)) |
| ret = __sys_write(fd,ch,cnt); |
| |
| ch += ret; |
| cnt -= ret; |
| } |
| |
| ret = (ret < 0) ? -1 : ch - buf; |
| |
| if (buf != chbuf) |
| free(buf); |
| |
| return ret; |
| } |