bio_file.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifdef HAVE_CONFIG_H
00030 # include <config.h>
00031 #endif
00032
00033 #define DISABLE_DEBUGLOG
00034
00035
00036 #include "bio_file_p.h"
00037 #include <gwenhywfar/misc.h>
00038 #include <gwenhywfar/text.h>
00039 #include <stdlib.h>
00040 #ifdef HAVE_UNISTD_H
00041 # include <unistd.h>
00042 #endif
00043 #include <string.h>
00044 #include <errno.h>
00045
00046 #include <gwenhywfar/debug.h>
00047
00048
00049 GWEN_INHERIT(GWEN_BUFFEREDIO, GWEN_BUFFEREDIO_FILE)
00050
00051
00052
00053
00054 GWEN_BUFFEREDIO_FILE *GWEN_BufferedIO_File_Table__new() {
00055 GWEN_BUFFEREDIO_FILE *bft;
00056
00057 GWEN_NEW_OBJECT(GWEN_BUFFEREDIO_FILE, bft);
00058 bft->fd=-1;
00059 return bft;
00060 }
00061
00062
00063
00064 void GWEN_BufferedIO_File_Table__free(GWEN_BUFFEREDIO_FILE *bft) {
00065 GWEN_FREE_OBJECT(bft);
00066 }
00067
00068
00069
00070 int GWEN_BufferedIO_File__Read(GWEN_BUFFEREDIO *dm,
00071 char *buffer,
00072 int *size,
00073 int timeout){
00074 int rv;
00075 GWEN_BUFFEREDIO_FILE *bft;
00076
00077 assert(dm);
00078 bft=GWEN_INHERIT_GETDATA(GWEN_BUFFEREDIO, GWEN_BUFFEREDIO_FILE, dm);
00079 assert(bft);
00080
00081 if (*size<1) {
00082 DBG_WARN(GWEN_LOGDOMAIN, "Nothing to read");
00083 *size=0;
00084 return 0;
00085 }
00086 rv=read(bft->fd, buffer, *size);
00087 if (rv==0) {
00088 DBG_DEBUG(GWEN_LOGDOMAIN, "EOF met");
00089 *size=0;
00090 return 0;
00091 }
00092 if (rv<0) {
00093 DBG_ERROR(GWEN_LOGDOMAIN, "Could not read (%s)",
00094 strerror(errno));
00095 return GWEN_ERROR_READ;
00096 }
00097 *size=rv;
00098 return 0;
00099 }
00100
00101
00102
00103 int GWEN_BufferedIO_File__Write(GWEN_BUFFEREDIO *dm,
00104 const char *buffer,
00105 int *size,
00106 int timeout){
00107 int rv;
00108 GWEN_BUFFEREDIO_FILE *bft;
00109
00110 assert(dm);
00111 bft=GWEN_INHERIT_GETDATA(GWEN_BUFFEREDIO, GWEN_BUFFEREDIO_FILE, dm);
00112 assert(bft);
00113
00114 if (*size<1) {
00115 DBG_WARN(GWEN_LOGDOMAIN, "Nothing to write");
00116 *size=0;
00117 return 0;
00118 }
00119
00120 rv=write(bft->fd, buffer, *size);
00121 if (rv<1) {
00122 DBG_ERROR(GWEN_LOGDOMAIN, "Could not write (%s)",
00123 strerror(errno));
00124 return GWEN_ERROR_WRITE;
00125 }
00126 *size=rv;
00127 return 0;
00128 }
00129
00130
00131
00132 int GWEN_BufferedIO_File__Close(GWEN_BUFFEREDIO *dm){
00133 GWEN_BUFFEREDIO_FILE *bft;
00134
00135 assert(dm);
00136 bft=GWEN_INHERIT_GETDATA(GWEN_BUFFEREDIO, GWEN_BUFFEREDIO_FILE, dm);
00137 assert(bft);
00138 if (bft->fd<3) {
00139
00140 return 0;
00141 }
00142 if (close(bft->fd)) {
00143 DBG_ERROR(GWEN_LOGDOMAIN, "Could not close (%s)",
00144 strerror(errno));
00145 return GWEN_ERROR_CLOSE;
00146 }
00147 return 0;
00148 }
00149
00150
00151
00152 void GWENHYWFAR_CB GWEN_BufferedIO_File_FreeData(void *bp, void *p) {
00153 GWEN_BUFFEREDIO_FILE *bft;
00154
00155 bft=(GWEN_BUFFEREDIO_FILE*)p;
00156 GWEN_BufferedIO_File_Table__free(bft);
00157 }
00158
00159
00160
00161 GWEN_BUFFEREDIO *GWEN_BufferedIO_File_new(int fd){
00162 GWEN_BUFFEREDIO *bt;
00163 GWEN_BUFFEREDIO_FILE *bft;
00164
00165 bt=GWEN_BufferedIO_new();
00166 bft=GWEN_BufferedIO_File_Table__new();
00167 bft->fd=fd;
00168
00169 GWEN_INHERIT_SETDATA(GWEN_BUFFEREDIO, GWEN_BUFFEREDIO_FILE,
00170 bt, bft,
00171 GWEN_BufferedIO_File_FreeData);
00172 GWEN_BufferedIO_SetReadFn(bt, GWEN_BufferedIO_File__Read);
00173 GWEN_BufferedIO_SetWriteFn(bt, GWEN_BufferedIO_File__Write);
00174 GWEN_BufferedIO_SetCloseFn(bt, GWEN_BufferedIO_File__Close);
00175 GWEN_BufferedIO_SetTimeout(bt, GWEN_BUFFEREDIO_FILE_TIMEOUT);
00176
00177 return bt;
00178 }
00179
00180
00181
00182
00183