Home | History | Annotate | Download | only in android
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /*
     18  * Contains helper routines dealing with syncronous access to a non-blocking
     19  * sokets.
     20  */
     21 
     22 #ifndef ANDROID_SYNC_UTILS_H
     23 #define ANDROID_SYNC_UTILS_H
     24 
     25 #include "android/android.h"
     26 #include "android/sockets.h"
     27 
     28 /* Descriptor for a connected non-blocking socket providing synchronous I/O */
     29 typedef struct SyncSocket SyncSocket;
     30 
     31 /*
     32  * Connect to a non-blocking socket for further synchronous I/O.
     33  * Note: this routine will explicitly call socket_set_nonblock on the fd passed
     34  * to this routine.
     35  * Param:
     36  *  fd - File descriptor for the socket, created with socket_create_xxx routine.
     37  *  sockaddr - Address of the socket to connect to.
     38  *  timeout - Time out (in milliseconds) to wait for the connection to occur.
     39  * Return:
     40  *  Initialized SyncSocket descriptor on success, or NULL on failure.
     41  */
     42 SyncSocket* syncsocket_connect(int fd, SockAddress* sockaddr, int timeout);
     43 
     44 /*
     45  * Initializes a non-blocking socket for further synchronous I/O.
     46  * Note: this routine will explicitly call socket_set_nonblock on the fd passed
     47  * to this routine.
     48  * Param:
     49  *  fd - File descriptor for the already connected socket.
     50  * Return:
     51  *  Initialized SyncSocket descriptor on success, or NULL on failure.
     52  */
     53 SyncSocket* syncsocket_init(int fd);
     54 
     55 /*
     56  * Closes SyncSocket descriptor obtained from syncsocket_connect routine.
     57  * Param:
     58  *  ssocket - SyncSocket descriptor obtained from syncsocket_connect routine.
     59  */
     60 void syncsocket_close(SyncSocket* ssocket);
     61 
     62 /*
     63  * Frees memory allocated for SyncSocket descriptor obtained from
     64  * syncsocket_connect routine. Note that this routine will also close socket
     65  * connection.
     66  * Param:
     67  *  ssocket - SyncSocket descriptor obtained from syncsocket_connect routine.
     68  */
     69 void syncsocket_free(SyncSocket* ssocket);
     70 
     71 /*
     72  * Prepares the socket for read.
     73  * Note: this routine must be called before calling into syncsocket_read_xxx
     74  * routines.
     75  * Param:
     76  *  ssocket - SyncSocket descriptor obtained from syncsocket_connect routine.
     77  * Return:
     78  *  0 on success, or -1 on failure.
     79  */
     80 int syncsocket_start_read(SyncSocket* ssocket);
     81 
     82 /*
     83  * Clears the socket after reading.
     84  * Note: this routine must be called after all expected data has been read from
     85  * the socket.
     86  * Param:
     87  *  ssocket - SyncSocket descriptor obtained from syncsocket_connect routine.
     88  * Return:
     89  *  0 on success, or -1 on failure.
     90  */
     91 int syncsocket_stop_read(SyncSocket* ssocket);
     92 
     93 /*
     94  * Prepares the socket for write.
     95  * Note: this routine must be called before calling into syncsocket_write_xxx
     96  * routines.
     97  * Param:
     98  *  ssocket - SyncSocket descriptor obtained from syncsocket_connect routine.
     99  * Return:
    100  *  0 on success, or -1 on failure.
    101  */
    102 int syncsocket_start_write(SyncSocket* ssocket);
    103 
    104 /*
    105  * Clears the socket after writing.
    106  * Note: this routine must be called after all data has been written to the
    107  * socket.
    108  * Param:
    109  *  ssocket - SyncSocket descriptor obtained from syncsocket_connect routine.
    110  * Return:
    111  *  0 on success, or -1 on failure.
    112  */
    113 int syncsocket_stop_write(SyncSocket* ssocket);
    114 
    115 /*
    116  * Synchronously reads from the socket.
    117  * Note: syncsocket_start_read must be called before first call to this routine.
    118  * Once syncsocket_start_read has been called, multiple syncsocket_read_xxx can
    119  * be called to read all necessary data from the socket. When all necessary data
    120  * has been read, syncsocket_stop_read must be called.
    121  * Param:
    122  *  ssocket - SyncSocket descriptor obtained from syncsocket_connect routine.
    123  *  buf - Buffer where to read data.
    124  *  size - Number of bytes to read.
    125  *  deadline - Absoulte deadline time to complete the reading.
    126  * Return:
    127  *  Number of bytes read on success, or -1 on failure.
    128  */
    129 ssize_t syncsocket_read_absolute(SyncSocket* ssocket,
    130                                  void* buf,
    131                                  size_t size,
    132                                  int64_t deadline);
    133 
    134 /*
    135  * Synchronously reads from the socket.
    136  * Note: syncsocket_start_read must be called before first call to this routine.
    137  * Once syncsocket_start_read has been called, multiple syncsocket_read_xxx can
    138  * be called to read all necessary data from the socket. When all necessary data
    139  * has been read, syncsocket_stop_read must be called.
    140  * Param:
    141  *  ssocket - SyncSocket descriptor obtained from syncsocket_connect routine.
    142  *  buf - Buffer where to read data.
    143  *  size - Number of bytes to read.
    144  *  timeout - Timeout (in milliseconds) to complete the reading.
    145  * Return:
    146  *  Number of bytes read on success, or -1 on failure.
    147  */
    148 ssize_t syncsocket_read(SyncSocket* ssocket, void* buf, size_t size, int timeout);
    149 
    150 /*
    151  * Synchronously writes to the socket.
    152  * Note: syncsocket_start_write must be called before first call to this routine.
    153  * Once syncsocket_start_write has been called, multiple syncsocket_write_xxx can
    154  * be called to write all necessary data to the socket. When all necessary data
    155  * has been written, syncsocket_stop_write must be called.
    156  * Param:
    157  *  ssocket - SyncSocket descriptor obtained from syncsocket_connect routine.
    158  *  buf - Buffer containing data to write.
    159  *  size - Number of bytes to write.
    160  *  deadline - Absoulte deadline time to complete the writing.
    161  * Return:
    162  *  Number of bytes written on success,or -1 on failure.
    163  */
    164 ssize_t syncsocket_write_absolute(SyncSocket* ssocket,
    165                                   const void* buf,
    166                                   size_t size,
    167                                   int64_t deadline);
    168 
    169 /*
    170  * Synchronously writes to the socket.
    171  * Note: syncsocket_start_write must be called before first call to this routine.
    172  * Once syncsocket_start_write has been called, multiple syncsocket_write_xxx can
    173  * be called to write all necessary data to the socket. When all necessary data
    174  * has been written, syncsocket_stop_write must be called.
    175  * Param:
    176  *  ssocket - SyncSocket descriptor obtained from syncsocket_connect routine.
    177  *  buf - Buffer containing data to write.
    178  *  size - Number of bytes to write.
    179  *  timeout - Timeout (in milliseconds) to complete the writing.
    180  * Return:
    181  *  Number of bytes written on success, or -1 on failure.
    182  */
    183 ssize_t syncsocket_write(SyncSocket* ssocket,
    184                          const void* buf,
    185                          size_t size,
    186                          int timeout);
    187 
    188 /*
    189  * Synchronously reads a line terminated with '\n' from the socket.
    190  * Note: syncsocket_start_read must be called before first call to this routine.
    191  * Param:
    192  *  ssocket - SyncSocket descriptor obtained from syncsocket_connect routine.
    193  *  buffer - Buffer where to read line.
    194  *  size - Number of characters the buffer can contain.
    195  *  deadline - Absoulte deadline time to complete the reading.
    196  * Return:
    197  *  Number of chracters read on success, 0 on deadline expiration,
    198  *  or -1 on failure.
    199  */
    200 ssize_t syncsocket_read_line_absolute(SyncSocket* ssocket,
    201                                       char* buffer,
    202                                       size_t size,
    203                                       int64_t deadline);
    204 
    205 /*
    206  * Synchronously reads a line terminated with '\n' from the socket.
    207  * Note: syncsocket_start_read must be called before first call to this routine.
    208  * Param:
    209  *  ssocket - SyncSocket descriptor obtained from syncsocket_connect routine.
    210  *  buffer - Buffer where to read line.
    211  *  size - Number of characters the buffer can contain.
    212  *  timeout - Timeout (in milliseconds) to complete the reading.
    213  * Return:
    214  *  Number of chracters read on success, 0 on deadline expiration,
    215  *  or -1 on failure.
    216  */
    217 ssize_t syncsocket_read_line(SyncSocket* ssocket,
    218                              char* buffer,
    219                              size_t size,
    220                              int timeout);
    221 
    222 /* Gets socket descriptor associated with the sync socket.
    223  * Param:
    224  *  ssocket - SyncSocket descriptor obtained from syncsocket_connect routine.
    225  * Return
    226  *  Socket descriptor associated with the sync socket.
    227  */
    228 int syncsocket_get_socket(SyncSocket* ssocket);
    229 
    230 /* Converts syncsocket_xxx operation status into success / failure result.
    231  * Param:
    232  *  status - syncsocket_xxx operation status to convert.
    233  * Return:
    234  *  0 if status passed to this routine indicated a success, or < 0 if status
    235  *  indicated a failure.
    236  */
    237 static inline int
    238 syncsocket_result(int status)
    239 {
    240     if (status == 0) {
    241         // Status 0 returned from syncsocket_xxx means "disconnection", which is
    242         // a failure.
    243         status = -1;
    244     } else if (status > 0) {
    245         // Status > 0 means success.
    246         status = 0;
    247     }
    248     return status;
    249 }
    250 
    251 #endif  // ANDROID_SYNC_UTILS_H
    252