]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Included a reliable version of read/write (that read/write will return
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Sun, 26 Mar 2000 14:10:41 +0000 (14:10 +0000)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Sun, 26 Mar 2000 14:10:41 +0000 (14:10 +0000)
exactly the bytes specified).

src/gnutls.c
src/gnutls.h
src/gnutls_buffers.c
src/gnutls_buffers.h

index 89f3491d2dd18158091c5fb5205546e256a46d11..fcc2ef851e33e89937b92f386913152875bad9bb 100644 (file)
@@ -233,8 +233,8 @@ int _gnutls_send_alert(int cd, GNUTLS_STATE state, AlertLevel level,
 
 }
 
-int gnutls_send_int(int cd, GNUTLS_STATE state, ContentType type,
-                   char *data, int sizeofdata)
+ssize_t gnutls_send_int(int cd, GNUTLS_STATE state, ContentType type,
+                   char *data, size_t sizeofdata)
 {
        GNUTLSPlaintext *gtxt;
        GNUTLSCompressed *gcomp;
@@ -286,20 +286,20 @@ int gnutls_send_int(int cd, GNUTLS_STATE state, ContentType type,
                _gnutls_freeTLSCompressed(gcomp);
 fprintf(stderr, "size: %d\ntype: %d\n", gcipher->length, type);
 
-               if (write(cd, &gcipher->type, sizeof(ContentType)) !=
+               if (Write(cd, &gcipher->type, sizeof(ContentType)) !=
                    sizeof(ContentType)) {
                        state->gnutls_internals.valid_connection =
                            VALID_FALSE;
                        state->gnutls_internals.resumable = RESUME_FALSE;
                        return GNUTLS_E_UNABLE_SEND_DATA;
                }
-               if (write(cd, &gcipher->version.major, 1) != 1) {
+               if (Write(cd, &gcipher->version.major, 1) != 1) {
                        state->gnutls_internals.valid_connection =
                            VALID_FALSE;
                        state->gnutls_internals.resumable = RESUME_FALSE;
                        return GNUTLS_E_UNABLE_SEND_DATA;
                }
-               if (write(cd, &gcipher->version.minor, 1) != 1) {
+               if (Write(cd, &gcipher->version.minor, 1) != 1) {
                        state->gnutls_internals.valid_connection =
                            VALID_FALSE;
                        state->gnutls_internals.resumable = RESUME_FALSE;
@@ -311,14 +311,14 @@ fprintf(stderr, "size: %d\ntype: %d\n", gcipher->length, type);
 #else
                length = byteswap16(gcipher->length);
 #endif
-               if (write(cd, &length, sizeof(uint16)) != sizeof(uint16)) {
+               if (Write(cd, &length, sizeof(uint16)) != sizeof(uint16)) {
                        state->gnutls_internals.valid_connection =
                            VALID_FALSE;
                        state->gnutls_internals.resumable = RESUME_FALSE;
                        return GNUTLS_E_UNABLE_SEND_DATA;
                }
 
-               if (write(cd, gcipher->fragment, gcipher->length) !=
+               if (Write(cd, gcipher->fragment, gcipher->length) !=
                    gcipher->length) {
                        state->gnutls_internals.valid_connection =
                            VALID_FALSE;
@@ -364,32 +364,32 @@ fprintf(stderr, "size: %d\ntype: %d\n", gcipher->length, type);
 #else
                length = byteswap16(gcipher->length);
 #endif
-               if (write(cd, &gcipher->type, sizeof(ContentType)) !=
+               if (Write(cd, &gcipher->type, sizeof(ContentType)) !=
                    sizeof(ContentType)) {
                        state->gnutls_internals.valid_connection =
                            VALID_FALSE;
                        state->gnutls_internals.resumable = RESUME_FALSE;
                        return GNUTLS_E_UNABLE_SEND_DATA;
                }
-               if (write(cd, &gcipher->version.major, 1) != 1) {
+               if (Write(cd, &gcipher->version.major, 1) != 1) {
                        state->gnutls_internals.valid_connection =
                            VALID_FALSE;
                        state->gnutls_internals.resumable = RESUME_FALSE;
                        return GNUTLS_E_UNABLE_SEND_DATA;
                }
-               if (write(cd, &gcipher->version.minor, 1) != 1) {
+               if (Write(cd, &gcipher->version.minor, 1) != 1) {
                        state->gnutls_internals.valid_connection =
                            VALID_FALSE;
                        state->gnutls_internals.resumable = RESUME_FALSE;
                        return GNUTLS_E_UNABLE_SEND_DATA;
                }
-               if (write(cd, &length, sizeof(uint16)) != sizeof(uint16)) {
+               if (Write(cd, &length, sizeof(uint16)) != sizeof(uint16)) {
                        state->gnutls_internals.valid_connection =
                            VALID_FALSE;
                        state->gnutls_internals.resumable = RESUME_FALSE;
                        return GNUTLS_E_UNABLE_SEND_DATA;
                }
-               if (write(cd, gcipher->fragment, gcipher->length) !=
+               if (Write(cd, gcipher->fragment, gcipher->length) !=
                    gcipher->length) {
                        state->gnutls_internals.valid_connection =
                            VALID_FALSE;
@@ -406,8 +406,8 @@ fprintf(stderr, "size: %d\ntype: %d\n", gcipher->length, type);
 }
 
 
-int gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type,
-                   char *data, int sizeofdata)
+ssize_t gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type,
+                   char *data, size_t sizeofdata)
 {
        GNUTLSPlaintext *gtxt;
        GNUTLSCompressed *gcomp;
@@ -423,7 +423,7 @@ int gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type,
 
        while (gnutls_getDataBufferSize(type, state) < sizeofdata) {
 
-               if (read(cd, &gcipher.type, sizeof(ContentType)) !=
+               if (Read(cd, &gcipher.type, sizeof(ContentType)) !=
                    sizeof(ContentType)) {
                        _gnutls_send_alert(cd, state, GNUTLS_FATAL,
                                           GNUTLS_INTERNAL_ERROR);
@@ -432,7 +432,7 @@ int gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type,
                        state->gnutls_internals.resumable = RESUME_FALSE;
                        return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
                }
-               if (read(cd, &gcipher.version.major, 1) != 1) {
+               if (Read(cd, &gcipher.version.major, 1) != 1) {
                        _gnutls_send_alert(cd, state, GNUTLS_FATAL,
                                           GNUTLS_INTERNAL_ERROR);
                        state->gnutls_internals.valid_connection =
@@ -440,7 +440,7 @@ int gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type,
                        state->gnutls_internals.resumable = RESUME_FALSE;
                        return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
                }
-               if (read(cd, &gcipher.version.minor, 1) != 1) {
+               if (Read(cd, &gcipher.version.minor, 1) != 1) {
                        _gnutls_send_alert(cd, state, GNUTLS_FATAL,
                                           GNUTLS_INTERNAL_ERROR);
                        state->gnutls_internals.valid_connection =
@@ -456,7 +456,7 @@ int gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type,
                        return GNUTLS_E_UNSUPPORTED_VERSION_PACKET;
                }
 
-               if (read(cd, &gcipher.length, 2) != 2) {
+               if (Read(cd, &gcipher.length, 2) != 2) {
                        _gnutls_send_alert(cd, state, GNUTLS_FATAL,
                                           GNUTLS_INTERNAL_ERROR);
                        state->gnutls_internals.valid_connection =
@@ -479,7 +479,7 @@ int gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type,
                gcipher.fragment = gnutls_malloc(gcipher.length);
 
                /* read ciphertext */
-               if (ret=read(cd, gcipher.fragment, gcipher.length) !=
+               if (ret=Read(cd, gcipher.fragment, gcipher.length) !=
                    gcipher.length) {
                        fprintf(stderr, "Received packet with length: %d\nExpecting %d\n", ret, gcipher.length);
                        gnutls_free(gcipher.fragment);
index 73cef390093e8d578be0e1925adfac8062c32308..b4ed204e3a9aa8d7496cdd6935fe6663cd1818bc 100644 (file)
@@ -14,8 +14,8 @@ typedef struct GNUTLS_STATE_INT* GNUTLS_STATE;
 
 int gnutls_init(GNUTLS_STATE * state, ConnectionEnd con_end);
 int gnutls_deinit(GNUTLS_STATE * state);
-int gnutls_send_int(int cd, GNUTLS_STATE state, ContentType type, char* data, int sizeofdata);
-int gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type, char* data, int sizeofdata);
+ssize_t gnutls_send_int(int cd, GNUTLS_STATE state, ContentType type, char* data, size_t sizeofdata);
+ssize_t gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type, char* data, size_t sizeofdata);
 int gnutls_handshake(int cd, GNUTLS_STATE state);
 
 #define gnutls_send( x, y, z, w) gnutls_send_int( x, y, GNUTLS_APPLICATION_DATA, z, w)
index 59bc3faa2e5d3269227ac4c58b21934565f176fe..2629362b027c635ad694bb402544b1379fa759bc 100644 (file)
@@ -4,31 +4,82 @@
 
 int gnutls_insertDataBuffer(GNUTLS_STATE state, char *data, int length)
 {
-       int old_buffer=state->gnutls_internals.bufferSize;
-       
-       state->gnutls_internals.bufferSize+=length;
-       state->gnutls_internals.buffer = gnutls_realloc( state->gnutls_internals.buffer, state->gnutls_internals.bufferSize);
-       memmove( &state->gnutls_internals.buffer[old_buffer], data, length);
+       int old_buffer = state->gnutls_internals.bufferSize;
+
+       state->gnutls_internals.bufferSize += length;
+       state->gnutls_internals.buffer =
+           gnutls_realloc(state->gnutls_internals.buffer,
+                          state->gnutls_internals.bufferSize);
+       memmove(&state->gnutls_internals.buffer[old_buffer], data, length);
 
        return 0;
-       
+
 }
 
-int gnutls_getDataBufferSize(ContentType type, GNUTLS_STATE state) {
-       if (type==GNUTLS_APPLICATION_DATA) return state->gnutls_internals.bufferSize;
+int gnutls_getDataBufferSize(ContentType type, GNUTLS_STATE state)
+{
+       if (type == GNUTLS_APPLICATION_DATA)
+               return state->gnutls_internals.bufferSize;
        return -1;
 }
 
 int gnutls_getDataFromBuffer(GNUTLS_STATE state, char *data, int length)
 {
        length = state->gnutls_internals.bufferSize;
-       
-       state->gnutls_internals.bufferSize-=length;
-       memmove( data, state->gnutls_internals.buffer, length);
-               
+
+       state->gnutls_internals.bufferSize -= length;
+       memmove(data, state->gnutls_internals.buffer, length);
+
        /* overwrite buffer */
-       memmove( state->gnutls_internals.buffer, &state->gnutls_internals.buffer[length], state->gnutls_internals.bufferSize);
-       state->gnutls_internals.buffer = gnutls_realloc( state->gnutls_internals.buffer, state->gnutls_internals.bufferSize);
+       memmove(state->gnutls_internals.buffer,
+               &state->gnutls_internals.buffer[length],
+               state->gnutls_internals.bufferSize);
+       state->gnutls_internals.buffer =
+           gnutls_realloc(state->gnutls_internals.buffer,
+                          state->gnutls_internals.bufferSize);
 
        return length;
 }
+
+ssize_t Read(int fd, void *iptr, size_t sizeOfPtr)
+{
+       size_t left;
+       ssize_t i=0;
+       char *ptr = iptr;
+
+       left = sizeOfPtr;
+       while (left > 0) {
+               i = read(fd, &ptr[i], left);
+               if (i < 0) {
+                       return -1;
+               } else {
+                       if (i == 0)
+                               break;  /* EOF */
+               }
+
+               left -= i;
+
+       }
+
+       return (sizeOfPtr - left);
+}
+
+
+ssize_t Write(int fd, const void *iptr, size_t n)
+{
+       size_t left;
+       ssize_t i = 0;
+       const char *ptr = iptr;
+
+       left = n;
+       while (left > 0) {
+               i = write(fd, &ptr[i], left);
+               if (i <= 0) {
+                       return -1;
+               }
+               left -= i;
+       }
+
+       return n;
+
+}
index 78d63581f51f37d8d281dbbb9f82f444e4aed476..24ad57b8789d167767d43d7666fc7f26a6c4fcb2 100644 (file)
@@ -1,3 +1,5 @@
 int gnutls_insertDataBuffer(GNUTLS_STATE state, char *data, int length);
 int gnutls_getDataBufferSize(ContentType type, GNUTLS_STATE state);
 int gnutls_getDataFromBuffer(GNUTLS_STATE state, char *data, int length);
+ssize_t Read(int fd, void *iptr, size_t n);
+ssize_t Write(int fd, const void *iptr, size_t n);