@@ -26,32 +26,57 @@ srs_read_t _srs_read_fn = ::read;
2626srs_lseek_t _srs_lseek_fn = ::lseek;
2727srs_close_t _srs_close_fn = ::close;
2828
29+ srs_fopen_t _srs_fopen_fn = ::fopen;
30+ srs_fwrite_t _srs_fwrite_fn = ::fwrite;
31+ srs_fread_t _srs_fread_fn = ::fread;
32+ srs_fseek_t _srs_fseek_fn = ::fseek;
33+ srs_fclose_t _srs_fclose_fn = ::fclose;
34+ srs_ftell_t _srs_ftell_fn = ::ftell;
35+ srs_setvbuf_t _srs_setvbuf_fn = ::setvbuf;
36+
2937SrsFileWriter::SrsFileWriter ()
3038{
31- fd = -1 ;
39+ fp_ = NULL ;
40+ buf_ = NULL ;
3241}
3342
3443SrsFileWriter::~SrsFileWriter ()
3544{
3645 close ();
46+ srs_freepa (buf_);
47+ }
48+
49+ srs_error_t SrsFileWriter::set_iobuf_size (int size)
50+ {
51+ srs_error_t err = srs_success;
52+
53+ if (fp_ == NULL ) {
54+ return srs_error_new (ERROR_SYSTEM_FILE_NOT_OPEN, " file %s is not opened" , path_.c_str ());
55+ }
56+
57+ srs_freepa (buf_);
58+ buf_ = size > 0 ? new char [size] : NULL ;
59+ int r0 = _srs_setvbuf_fn (fp_, buf_, _IOFBF, size);
60+ if (r0) {
61+ return srs_error_new (ERROR_SYSTEM_FILE_SETVBUF, " setvbuf err, file=%s, r0=%d" , path_.c_str (), r0);
62+ }
63+
64+ return err;
3765}
3866
3967srs_error_t SrsFileWriter::open (string p)
4068{
4169 srs_error_t err = srs_success;
4270
43- if (fd > 0 ) {
71+ if (fp_ != NULL ) {
4472 return srs_error_new (ERROR_SYSTEM_FILE_ALREADY_OPENED, " file %s already opened" , p.c_str ());
4573 }
4674
47- int flags = O_CREAT|O_WRONLY|O_TRUNC;
48- mode_t mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH;
49-
50- if ((fd = _srs_open_fn (p.c_str (), flags, mode)) < 0 ) {
75+ if ((fp_ = _srs_fopen_fn (p.c_str (), " wb" )) == NULL ) {
5176 return srs_error_new (ERROR_SYSTEM_FILE_OPENE, " open file %s failed" , p.c_str ());
5277 }
5378
54- path = p;
79+ path_ = p;
5580
5681 return err;
5782}
@@ -60,70 +85,70 @@ srs_error_t SrsFileWriter::open_append(string p)
6085{
6186 srs_error_t err = srs_success;
6287
63- if (fd > 0 ) {
64- return srs_error_new (ERROR_SYSTEM_FILE_ALREADY_OPENED, " file %s already opened" , path .c_str ());
88+ if (fp_ != NULL ) {
89+ return srs_error_new (ERROR_SYSTEM_FILE_ALREADY_OPENED, " file %s already opened" , p .c_str ());
6590 }
6691
67- int flags = O_CREAT|O_APPEND|O_WRONLY;
68- mode_t mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH;
69-
70- if ((fd = _srs_open_fn (p.c_str (), flags, mode)) < 0 ) {
92+ if ((fp_ = _srs_fopen_fn (p.c_str (), " ab" )) == NULL ) {
7193 return srs_error_new (ERROR_SYSTEM_FILE_OPENE, " open file %s failed" , p.c_str ());
7294 }
7395
74- path = p;
96+ path_ = p;
7597
7698 return err;
7799}
78100
79101void SrsFileWriter::close ()
80102{
81- if (fd < 0 ) {
103+ if (fp_ == NULL ) {
82104 return ;
83105 }
84106
85- if (_srs_close_fn (fd ) < 0 ) {
86- srs_warn (" close file %s failed" , path .c_str ());
107+ if (_srs_fclose_fn (fp_ ) < 0 ) {
108+ srs_warn (" close file %s failed" , path_ .c_str ());
87109 }
88- fd = - 1 ;
110+ fp_ = NULL ;
89111
90112 return ;
91113}
92114
93115bool SrsFileWriter::is_open ()
94116{
95- return fd > 0 ;
117+ return fp_ != NULL ;
96118}
97119
98120void SrsFileWriter::seek2 (int64_t offset)
99121{
100- off_t r0 = _srs_lseek_fn (fd, (off_t )offset, SEEK_SET);
122+ srs_assert (is_open ());
123+
124+ int r0 = _srs_fseek_fn (fp_, (long )offset, SEEK_SET);
101125 srs_assert (r0 != -1 );
102126}
103127
104128int64_t SrsFileWriter::tellg ()
105129{
106- return (int64_t )_srs_lseek_fn (fd, 0 , SEEK_CUR);
130+ srs_assert (is_open ());
131+
132+ return _srs_ftell_fn (fp_);
107133}
108134
109135srs_error_t SrsFileWriter::write (void * buf, size_t count, ssize_t * pnwrite)
110136{
111137 srs_error_t err = srs_success;
112-
113- ssize_t nwrite;
114- // TODO: FIXME: use st_write.
115- #ifdef _WIN32
116- if ((nwrite = ::_write (fd, buf, (unsigned int )count)) < 0 ) {
117- #else
118- if ((nwrite = _srs_write_fn (fd, buf, count)) < 0 ) {
119- #endif
120- return srs_error_new (ERROR_SYSTEM_FILE_WRITE, " write to file %s failed" , path.c_str ());
138+
139+ if (fp_ == NULL ) {
140+ return srs_error_new (ERROR_SYSTEM_FILE_NOT_OPEN, " file %s is not opened" , path_.c_str ());
121141 }
122142
143+ size_t n = _srs_fwrite_fn (buf, 1 , count, fp_);
144+ if (n != count) {
145+ return srs_error_new (ERROR_SYSTEM_FILE_WRITE, " write to file %s failed" , path_.c_str ());
146+ }
147+
123148 if (pnwrite != NULL ) {
124- *pnwrite = nwrite ;
149+ *pnwrite = ( ssize_t )n ;
125150 }
126-
151+
127152 return err;
128153}
129154
@@ -136,29 +161,30 @@ srs_error_t SrsFileWriter::writev(const iovec* iov, int iovcnt, ssize_t* pnwrite
136161 const iovec* piov = iov + i;
137162 ssize_t this_nwrite = 0 ;
138163 if ((err = write (piov->iov_base , piov->iov_len , &this_nwrite)) != srs_success) {
139- return srs_error_wrap (err, " write file " );
164+ return srs_error_wrap (err, " writev " );
140165 }
141166 nwrite += this_nwrite;
142167 }
143-
168+
144169 if (pnwrite) {
145170 *pnwrite = nwrite;
146171 }
147-
172+
148173 return err;
149174}
150175
151176srs_error_t SrsFileWriter::lseek (off_t offset, int whence, off_t * seeked)
152177{
153- off_t sk = _srs_lseek_fn (fd, offset, whence);
154- if (sk < 0 ) {
178+ srs_assert (is_open ());
179+
180+ if (_srs_fseek_fn (fp_, (long )offset, whence) == -1 ) {
155181 return srs_error_new (ERROR_SYSTEM_FILE_SEEK, " seek file" );
156182 }
157-
183+
158184 if (seeked) {
159- *seeked = sk ;
185+ *seeked = _srs_ftell_fn (fp_) ;
160186 }
161-
187+
162188 return srs_success;
163189}
164190
0 commit comments