diff options
Diffstat (limited to 'src/lib/libcrypto/bio/bss_rtcp.c')
| -rw-r--r-- | src/lib/libcrypto/bio/bss_rtcp.c | 294 |
1 files changed, 160 insertions, 134 deletions
diff --git a/src/lib/libcrypto/bio/bss_rtcp.c b/src/lib/libcrypto/bio/bss_rtcp.c index 7dae485564..84d01e58b4 100644 --- a/src/lib/libcrypto/bio/bss_rtcp.c +++ b/src/lib/libcrypto/bio/bss_rtcp.c | |||
| @@ -73,31 +73,32 @@ | |||
| 73 | 73 | ||
| 74 | typedef unsigned short io_channel; | 74 | typedef unsigned short io_channel; |
| 75 | /*************************************************************************/ | 75 | /*************************************************************************/ |
| 76 | struct io_status { short status, count; long flags; }; | 76 | struct io_status { short status, count; |
| 77 | long flags; | ||
| 78 | }; | ||
| 77 | 79 | ||
| 78 | struct rpc_msg { /* Should have member alignment inhibited */ | 80 | struct rpc_msg { /* Should have member alignment inhibited */ |
| 79 | char channel; /* 'A'-app data. 'R'-remote client 'G'-global */ | 81 | char channel; /* 'A'-app data. 'R'-remote client 'G'-global */ |
| 80 | char function; /* 'G'-get, 'P'-put, 'C'-confirm, 'X'-close */ | 82 | char function; /* 'G'-get, 'P'-put, 'C'-confirm, 'X'-close */ |
| 81 | unsigned short int length; /* Amount of data returned or max to return */ | 83 | unsigned short int length; /* Amount of data returned or max to return */ |
| 82 | char data[4092]; /* variable data */ | 84 | char data[4092]; /* variable data */ |
| 83 | }; | 85 | }; |
| 84 | #define RPC_HDR_SIZE (sizeof(struct rpc_msg) - 4092) | 86 | #define RPC_HDR_SIZE (sizeof(struct rpc_msg) - 4092) |
| 85 | 87 | ||
| 86 | struct rpc_ctx { | 88 | struct rpc_ctx { |
| 87 | int filled, pos; | 89 | int filled, pos; |
| 88 | struct rpc_msg msg; | 90 | struct rpc_msg msg; |
| 89 | }; | 91 | }; |
| 90 | 92 | ||
| 91 | static int rtcp_write(BIO *h,const char *buf,int num); | 93 | static int rtcp_write(BIO *h, const char *buf, int num); |
| 92 | static int rtcp_read(BIO *h,char *buf,int size); | 94 | static int rtcp_read(BIO *h, char *buf, int size); |
| 93 | static int rtcp_puts(BIO *h,const char *str); | 95 | static int rtcp_puts(BIO *h, const char *str); |
| 94 | static int rtcp_gets(BIO *h,char *str,int size); | 96 | static int rtcp_gets(BIO *h, char *str, int size); |
| 95 | static long rtcp_ctrl(BIO *h,int cmd,long arg1,void *arg2); | 97 | static long rtcp_ctrl(BIO *h, int cmd, long arg1, void *arg2); |
| 96 | static int rtcp_new(BIO *h); | 98 | static int rtcp_new(BIO *h); |
| 97 | static int rtcp_free(BIO *data); | 99 | static int rtcp_free(BIO *data); |
| 98 | 100 | ||
| 99 | static BIO_METHOD rtcp_method= | 101 | static BIO_METHOD rtcp_method = { |
| 100 | { | ||
| 101 | BIO_TYPE_FD, | 102 | BIO_TYPE_FD, |
| 102 | "RTCP", | 103 | "RTCP", |
| 103 | rtcp_write, | 104 | rtcp_write, |
| @@ -108,12 +109,13 @@ static BIO_METHOD rtcp_method= | |||
| 108 | rtcp_new, | 109 | rtcp_new, |
| 109 | rtcp_free, | 110 | rtcp_free, |
| 110 | NULL, | 111 | NULL, |
| 111 | }; | 112 | }; |
| 112 | 113 | ||
| 113 | BIO_METHOD *BIO_s_rtcp(void) | 114 | BIO_METHOD |
| 114 | { | 115 | *BIO_s_rtcp(void) |
| 115 | return(&rtcp_method); | 116 | { |
| 116 | } | 117 | return (&rtcp_method); |
| 118 | } | ||
| 117 | /*****************************************************************************/ | 119 | /*****************************************************************************/ |
| 118 | /* Decnet I/O routines. | 120 | /* Decnet I/O routines. |
| 119 | */ | 121 | */ |
| @@ -123,25 +125,28 @@ BIO_METHOD *BIO_s_rtcp(void) | |||
| 123 | #pragma message disable DOLLARID | 125 | #pragma message disable DOLLARID |
| 124 | #endif | 126 | #endif |
| 125 | 127 | ||
| 126 | static int get ( io_channel chan, char *buffer, int maxlen, int *length ) | 128 | static int get(io_channel chan, char *buffer, int maxlen, int *length) |
| 127 | { | 129 | { |
| 128 | int status; | 130 | int status; |
| 129 | struct io_status iosb; | 131 | struct io_status iosb; |
| 130 | status = sys$qiow ( 0, chan, IO$_READVBLK, &iosb, 0, 0, | 132 | status = sys$qiow(0, chan, IO$_READVBLK, &iosb, 0, 0, buffer, maxlen, |
| 131 | buffer, maxlen, 0, 0, 0, 0 ); | 133 | 0, 0, 0, 0 ); |
| 132 | if ( (status&1) == 1 ) status = iosb.status; | 134 | if ((status & 1) == 1) |
| 133 | if ( (status&1) == 1 ) *length = iosb.count; | 135 | status = iosb.status; |
| 134 | return status; | 136 | if ((status & 1) == 1 ) |
| 137 | *length = iosb.count; | ||
| 138 | return status; | ||
| 135 | } | 139 | } |
| 136 | 140 | ||
| 137 | static int put ( io_channel chan, char *buffer, int length ) | 141 | static int put(io_channel chan, char *buffer, int length) |
| 138 | { | 142 | { |
| 139 | int status; | 143 | int status; |
| 140 | struct io_status iosb; | 144 | struct io_status iosb; |
| 141 | status = sys$qiow ( 0, chan, IO$_WRITEVBLK, &iosb, 0, 0, | 145 | status = sys$qiow ( 0, chan, IO$_WRITEVBLK, &iosb, 0, 0, buffer, |
| 142 | buffer, length, 0, 0, 0, 0 ); | 146 | length, 0, 0, 0, 0 ); |
| 143 | if ( (status&1) == 1 ) status = iosb.status; | 147 | if ((status & 1) == 1) |
| 144 | return status; | 148 | status = iosb.status; |
| 149 | return status; | ||
| 145 | } | 150 | } |
| 146 | 151 | ||
| 147 | #ifdef __DECC | 152 | #ifdef __DECC |
| @@ -150,109 +155,127 @@ static int put ( io_channel chan, char *buffer, int length ) | |||
| 150 | 155 | ||
| 151 | /***************************************************************************/ | 156 | /***************************************************************************/ |
| 152 | 157 | ||
| 153 | static int rtcp_new(BIO *bi) | 158 | static int |
| 159 | rtcp_new(BIO *bi) | ||
| 154 | { | 160 | { |
| 155 | struct rpc_ctx *ctx; | 161 | struct rpc_ctx *ctx; |
| 156 | bi->init=1; | 162 | bi->init = 1; |
| 157 | bi->num=0; | 163 | bi->num = 0; |
| 158 | bi->flags = 0; | 164 | bi->flags = 0; |
| 159 | bi->ptr=OPENSSL_malloc(sizeof(struct rpc_ctx)); | 165 | bi->ptr = OPENSSL_malloc(sizeof(struct rpc_ctx)); |
| 160 | ctx = (struct rpc_ctx *) bi->ptr; | 166 | ctx = (struct rpc_ctx *)bi->ptr; |
| 161 | ctx->filled = 0; | 167 | ctx->filled = 0; |
| 162 | ctx->pos = 0; | 168 | ctx->pos = 0; |
| 163 | return(1); | 169 | return (1); |
| 164 | } | 170 | } |
| 165 | 171 | ||
| 166 | static int rtcp_free(BIO *a) | 172 | static int |
| 173 | rtcp_free(BIO *a) | ||
| 167 | { | 174 | { |
| 168 | if (a == NULL) return(0); | 175 | if (a == NULL) |
| 169 | if ( a->ptr ) OPENSSL_free ( a->ptr ); | 176 | return (0); |
| 177 | if (a->ptr) | ||
| 178 | OPENSSL_free(a->ptr); | ||
| 170 | a->ptr = NULL; | 179 | a->ptr = NULL; |
| 171 | return(1); | 180 | return (1); |
| 172 | } | 181 | } |
| 173 | 182 | ||
| 174 | static int rtcp_read(BIO *b, char *out, int outl) | 183 | static int |
| 184 | rtcp_read(BIO *b, char *out, int outl) | ||
| 175 | { | 185 | { |
| 176 | int status, length; | 186 | int status, length; |
| 177 | struct rpc_ctx *ctx; | 187 | struct rpc_ctx *ctx; |
| 178 | /* | 188 | /* |
| 179 | * read data, return existing. | 189 | * read data, return existing. |
| 180 | */ | 190 | */ |
| 181 | ctx = (struct rpc_ctx *) b->ptr; | 191 | ctx = (struct rpc_ctx *)b->ptr; |
| 182 | if ( ctx->pos < ctx->filled ) { | 192 | if (ctx->pos < ctx->filled) { |
| 183 | length = ctx->filled - ctx->pos; | 193 | length = ctx->filled - ctx->pos; |
| 184 | if ( length > outl ) length = outl; | 194 | if (length > outl) |
| 185 | memmove ( out, &ctx->msg.data[ctx->pos], length ); | 195 | length = outl; |
| 186 | ctx->pos += length; | 196 | memmove(out, &ctx->msg.data[ctx->pos], length); |
| 187 | return length; | 197 | ctx->pos += length; |
| 188 | } | 198 | return length; |
| 189 | /* | 199 | } |
| 190 | * Requst more data from R channel. | 200 | /* |
| 191 | */ | 201 | * Requst more data from R channel. |
| 192 | ctx->msg.channel = 'R'; | 202 | */ |
| 193 | ctx->msg.function = 'G'; | 203 | ctx->msg.channel = 'R'; |
| 194 | ctx->msg.length = sizeof(ctx->msg.data); | 204 | ctx->msg.function = 'G'; |
| 195 | status = put ( b->num, (char *) &ctx->msg, RPC_HDR_SIZE ); | 205 | ctx->msg.length = sizeof(ctx->msg.data); |
| 196 | if ( (status&1) == 0 ) { | 206 | status = put(b->num, (char *)&ctx->msg, RPC_HDR_SIZE); |
| 197 | return -1; | 207 | if ((status & 1) == 0 ) { |
| 198 | } | 208 | return -1; |
| 199 | /* | 209 | } |
| 200 | * Read. | 210 | /* |
| 201 | */ | 211 | * Read. |
| 202 | ctx->pos = ctx->filled = 0; | 212 | */ |
| 203 | status = get ( b->num, (char *) &ctx->msg, sizeof(ctx->msg), &length ); | 213 | ctx->pos = ctx->filled = 0; |
| 204 | if ( (status&1) == 0 ) length = -1; | 214 | status = get(b->num, (char *)&ctx->msg, sizeof(ctx->msg), &length); |
| 205 | if ( ctx->msg.channel != 'R' || ctx->msg.function != 'C' ) { | 215 | if ((status & 1) == 0) |
| 206 | length = -1; | 216 | length = -1; |
| 207 | } | 217 | if (ctx->msg.channel != 'R' || ctx->msg.function != 'C') { |
| 208 | ctx->filled = length - RPC_HDR_SIZE; | 218 | length = -1; |
| 209 | 219 | } | |
| 210 | if ( ctx->pos < ctx->filled ) { | 220 | ctx->filled = length - RPC_HDR_SIZE; |
| 211 | length = ctx->filled - ctx->pos; | 221 | |
| 212 | if ( length > outl ) length = outl; | 222 | if (ctx->pos < ctx->filled) { |
| 213 | memmove ( out, ctx->msg.data, length ); | 223 | length = ctx->filled - ctx->pos; |
| 214 | ctx->pos += length; | 224 | if (length > outl) |
| 215 | return length; | 225 | length = outl; |
| 216 | } | 226 | memmove(out, ctx->msg.data, length); |
| 227 | ctx->pos += length; | ||
| 228 | return length; | ||
| 229 | } | ||
| 217 | 230 | ||
| 218 | return length; | 231 | return length; |
| 219 | } | 232 | } |
| 220 | 233 | ||
| 221 | static int rtcp_write(BIO *b, const char *in, int inl) | 234 | static int |
| 235 | rtcp_write(BIO *b, const char *in, int inl) | ||
| 222 | { | 236 | { |
| 223 | int status, i, segment, length; | 237 | int status, i, segment, length; |
| 224 | struct rpc_ctx *ctx; | 238 | struct rpc_ctx *ctx; |
| 225 | /* | 239 | /* |
| 226 | * Output data, send in chunks no larger that sizeof(ctx->msg.data). | 240 | * Output data, send in chunks no larger that sizeof(ctx->msg.data). |
| 227 | */ | 241 | */ |
| 228 | ctx = (struct rpc_ctx *) b->ptr; | 242 | ctx = (struct rpc_ctx *)b->ptr; |
| 229 | for ( i = 0; i < inl; i += segment ) { | 243 | for (i = 0; i < inl; i += segment) { |
| 230 | segment = inl - i; | 244 | segment = inl - i; |
| 231 | if ( segment > sizeof(ctx->msg.data) ) segment = sizeof(ctx->msg.data); | 245 | if (segment > sizeof(ctx->msg.data)) |
| 232 | ctx->msg.channel = 'R'; | 246 | segment = sizeof(ctx->msg.data); |
| 233 | ctx->msg.function = 'P'; | 247 | ctx->msg.channel = 'R'; |
| 234 | ctx->msg.length = segment; | 248 | ctx->msg.function = 'P'; |
| 235 | memmove ( ctx->msg.data, &in[i], segment ); | 249 | ctx->msg.length = segment; |
| 236 | status = put ( b->num, (char *) &ctx->msg, segment + RPC_HDR_SIZE ); | 250 | memmove(ctx->msg.data, &in[i], segment); |
| 237 | if ((status&1) == 0 ) { i = -1; break; } | 251 | status = put(b->num, (char *) &ctx->msg, |
| 252 | segment + RPC_HDR_SIZE); | ||
| 253 | if ((status & 1) == 0) { | ||
| 254 | i = -1; | ||
| 255 | break; | ||
| 256 | } | ||
| 238 | 257 | ||
| 239 | status = get ( b->num, (char *) &ctx->msg, sizeof(ctx->msg), &length ); | 258 | status = get(b->num, (char *)&ctx->msg, sizeof(ctx->msg), |
| 240 | if ( ((status&1) == 0) || (length < RPC_HDR_SIZE) ) { i = -1; break; } | 259 | &length ); |
| 241 | if ( (ctx->msg.channel != 'R') || (ctx->msg.function != 'C') ) { | 260 | if (((status&1) == 0) || (length < RPC_HDR_SIZE)) { |
| 242 | printf("unexpected response when confirming put %c %c\n", | 261 | i = -1; |
| 243 | ctx->msg.channel, ctx->msg.function ); | 262 | break; |
| 263 | } | ||
| 264 | if ((ctx->msg.channel != 'R') || (ctx->msg.function != 'C')) { | ||
| 265 | printf("unexpected response when confirming put %c %c\n", | ||
| 266 | ctx->msg.channel, ctx->msg.function ); | ||
| 244 | 267 | ||
| 268 | } | ||
| 245 | } | 269 | } |
| 246 | } | 270 | return (i); |
| 247 | return(i); | ||
| 248 | } | 271 | } |
| 249 | 272 | ||
| 250 | static long rtcp_ctrl(BIO *b, int cmd, long num, void *ptr) | 273 | static long |
| 251 | { | 274 | rtcp_ctrl(BIO *b, int cmd, long num, void *ptr) |
| 252 | long ret=1; | 275 | { |
| 276 | long ret = 1; | ||
| 253 | 277 | ||
| 254 | switch (cmd) | 278 | switch (cmd) { |
| 255 | { | ||
| 256 | case BIO_CTRL_RESET: | 279 | case BIO_CTRL_RESET: |
| 257 | case BIO_CTRL_EOF: | 280 | case BIO_CTRL_EOF: |
| 258 | ret = 1; | 281 | ret = 1; |
| @@ -260,11 +283,11 @@ static long rtcp_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 260 | case BIO_C_SET_FD: | 283 | case BIO_C_SET_FD: |
| 261 | b->num = num; | 284 | b->num = num; |
| 262 | ret = 1; | 285 | ret = 1; |
| 263 | break; | 286 | break; |
| 264 | case BIO_CTRL_SET_CLOSE: | 287 | case BIO_CTRL_SET_CLOSE: |
| 265 | case BIO_CTRL_FLUSH: | 288 | case BIO_CTRL_FLUSH: |
| 266 | case BIO_CTRL_DUP: | 289 | case BIO_CTRL_DUP: |
| 267 | ret=1; | 290 | ret = 1; |
| 268 | break; | 291 | break; |
| 269 | case BIO_CTRL_GET_CLOSE: | 292 | case BIO_CTRL_GET_CLOSE: |
| 270 | case BIO_CTRL_INFO: | 293 | case BIO_CTRL_INFO: |
| @@ -272,23 +295,26 @@ static long rtcp_ctrl(BIO *b, int cmd, long num, void *ptr) | |||
| 272 | case BIO_CTRL_PENDING: | 295 | case BIO_CTRL_PENDING: |
| 273 | case BIO_CTRL_WPENDING: | 296 | case BIO_CTRL_WPENDING: |
| 274 | default: | 297 | default: |
| 275 | ret=0; | 298 | ret = 0; |
| 276 | break; | 299 | break; |
| 277 | } | ||
| 278 | return(ret); | ||
| 279 | } | ||
| 280 | |||
| 281 | static int rtcp_gets(BIO *bp, char *buf, int size) | ||
| 282 | { | ||
| 283 | return(0); | ||
| 284 | } | 300 | } |
| 301 | return (ret); | ||
| 302 | } | ||
| 285 | 303 | ||
| 286 | static int rtcp_puts(BIO *bp, const char *str) | 304 | static int |
| 305 | rtcp_gets(BIO *bp, char *buf, int size) | ||
| 287 | { | 306 | { |
| 288 | int length; | 307 | return (0); |
| 289 | if (str == NULL) return(0); | ||
| 290 | length = strlen ( str ); | ||
| 291 | if ( length == 0 ) return (0); | ||
| 292 | return rtcp_write ( bp,str, length ); | ||
| 293 | } | 308 | } |
| 294 | 309 | ||
| 310 | static int | ||
| 311 | rtcp_puts(BIO *bp, const char *str) | ||
| 312 | { | ||
| 313 | int length; | ||
| 314 | if (str == NULL) | ||
| 315 | return (0); | ||
| 316 | length = strlen(str); | ||
| 317 | if (length == 0) | ||
| 318 | return (0); | ||
| 319 | return rtcp_write(bp, str, length); | ||
| 320 | } | ||
