| 1039 | } |
| 1040 | |
| 1041 | ssize_t SIPpSocket::read_message(char *buf, size_t len, struct sockaddr_storage *src) |
| 1042 | { |
| 1043 | size_t avail; |
| 1044 | |
| 1045 | if (!ss_msglen) |
| 1046 | return 0; |
| 1047 | if (ss_msglen > len) |
| 1048 | ERROR("There is a message waiting in sockfd(%d) that is bigger (%zu bytes) than the read size.", |
| 1049 | ss_fd, ss_msglen); |
| 1050 | |
| 1051 | len = ss_msglen; |
| 1052 | |
| 1053 | avail = ss_in->len - ss_in->offset; |
| 1054 | if (avail > len) { |
| 1055 | avail = len; |
| 1056 | } |
| 1057 | |
| 1058 | memcpy(buf, ss_in->buf + ss_in->offset, avail); |
| 1059 | memcpy(src, &ss_in->addr, sizeof(ss_in->addr)); |
| 1060 | |
| 1061 | /* Update our buffer and return value. */ |
| 1062 | buf[avail] = '\0'; |
| 1063 | /* For CMD Message the escape char is the end of message */ |
| 1064 | if ((ss_control) && buf[avail-1] == 27) |
| 1065 | buf[avail-1] = '\0'; |
| 1066 | |
| 1067 | ss_in->offset += avail; |
| 1068 | |
| 1069 | /* Have we emptied the buffer? */ |
| 1070 | if (ss_in->offset == ss_in->len) { |
| 1071 | struct socketbuf *next = ss_in->next; |
| 1072 | free_socketbuf(ss_in); |
| 1073 | ss_in = next; |
| 1074 | } |
| 1075 | |
| 1076 | if (int msg_len = check_for_message()) { |
| 1077 | ss_msglen = msg_len; |
| 1078 | } else { |
| 1079 | ss_msglen = 0; |
| 1080 | pending_messages--; |
| 1081 | } |
| 1082 | |
| 1083 | return avail; |
| 1084 | } |
| 1085 | |
| 1086 | void process_message(SIPpSocket *socket, char *msg, ssize_t msg_size, struct sockaddr_storage *src) |
| 1087 | { |
no test coverage detected