Changeset 5571:b46ece5b30bf in roaraudio
- Timestamp:
- 07/17/12 15:03:29 (11 years ago)
- Branch:
- default
- Phase:
- public
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
ChangeLog
r5570 r5571 5 5 * Improved tic-tac-toe plugin. 6 6 * Improved roarclientpass in execed mode. 7 * Improved support in roard for client passing. 7 8 8 9 v. 1.0beta3 - Sun Jul 15 2012 26:08 CEST -
roard/clients.c
r5567 r5571 136 136 137 137 int clients_new_from_fh(int fh, int proto, int byteorder, int update_nnode) { 138 return clients_new_from_fh2(fh, proto, byteorder, update_nnode, NULL, NULL, 0); 139 } 140 141 int clients_new_from_fh2(int fh, int proto, int byteorder, 142 int update_nnode, 143 struct roard_listen * lsock, struct sockaddr * sockaddr, socklen_t addrlen) { 144 const struct roard_proto_handle * protohandle; 145 struct roar_vio_calls vio; 138 146 struct roar_client * c; 147 int supported = 0; 139 148 int client; 140 149 141 if ( fh == -1 ) 142 return -1; 143 144 if ( proto != ROAR_PROTO_ROARAUDIO || byteorder != ROAR_BYTEORDER_NETWORK ) 145 return -1; 146 147 if ( (client = clients_new()) == -1 ) 148 return -1; 149 150 if ( clients_set_fh(client, fh) == -1 ) { 151 clients_delete(client); 152 return -1; 150 if ( fh == -1 ) { 151 roar_err_set(ROAR_ERROR_BADFH); 152 return -1; 153 } 154 155 if ( lsock == NULL ) { 156 switch (proto) { 157 case ROAR_PROTO_RSOUND: 158 case ROAR_PROTO_SIMPLE: 159 roar_err_set(ROAR_ERROR_FAULT); 160 return -1; 161 break; 162 } 163 } 164 165 if ( byteorder != ROAR_BYTEORDER_NETWORK ) 166 return -1; 167 168 169 if ( proto == ROAR_PROTO_RSOUND ) { 170 #ifndef ROAR_WITHOUT_DCOMP_EMUL_RSOUND 171 client = emul_rsound_on_connect(fh, lsock); 172 switch (client) { 173 case -1: return -1; break; 174 case -2: return 0; break; 175 default: // TODO: write error handling 176 clients_get(client, &c); 177 fh = c->fh; 178 break; 179 } 180 #else 181 roar_err_set(ROAR_ERROR_PROTONOSUP); 182 return -1; 183 #endif 184 } else { 185 client = clients_new(); 186 187 if ( client == -1 ) { 188 ROAR_DBG("clients_new_from_fh2(*) = -1 // can not create new client"); 189 return -1; 190 } 191 192 if ( clients_set_fh(client, fh) == -1 ) { 193 ROAR_ERR("clients_new_from_fh2(*): Can not set client's fh"); 194 195 clients_delete(client); 196 197 ROAR_DBG("clients_new_from_fh2(*) = -1"); 198 return -1; 199 } 153 200 } 154 201 … … 156 203 if ( clients_get(client, &c) != -1 ) { 157 204 if ( roar_nnode_free(&(c->nnode)) != -1 ) { 158 roar_nnode_new_from_fh(&(c->nnode), fh, 1); 205 if ( sockaddr != NULL && addrlen != 0 ) { 206 roar_nnode_new_from_sockaddr(&(c->nnode), sockaddr, addrlen); 207 } else { 208 roar_nnode_new_from_fh(&(c->nnode), fh, 1); 209 } 159 210 } 160 211 } 161 212 } 213 214 if ( clients_set_proto(client, proto) == -1 ) { 215 ROAR_WARN("clients_new_from_fh2(*): Setting proto(0x%.4x) of client %i failed.", proto, client); 216 clients_delete(client); 217 return -1; 218 } 219 220 switch (proto) { 221 case ROAR_PROTO_ROARAUDIO: 222 // nothing needed to be done here 223 break; 224 #ifndef ROAR_WITHOUT_DCOMP_EMUL_ESD 225 #ifdef ROAR_HAVE_H_ESD 226 case ROAR_PROTO_ESOUND: 227 ROAR_DBG("net_get_new_client(*): execing ESD CONNECT command"); 228 229 if ( roar_vio_open_fh_socket(&vio, fh) == -1 ) 230 return -1; 231 232 ROAR_DBG("net_get_new_client(*): creating VIO OK"); 233 234 if ( emul_esd_exec_command(client, ESD_PROTO_CONNECT, &vio) == -1 ) 235 return -1; 236 237 ROAR_DBG("net_get_new_client(*): CONNECT execed sucessfully"); 238 break; 239 #endif 240 #endif 241 #ifndef ROAR_WITHOUT_DCOMP_EMUL_SIMPLE 242 case ROAR_PROTO_SIMPLE: 243 if ( emul_simple_on_connect(client, lsock) == -1 ) 244 return -1; 245 break; 246 #endif 247 #ifndef ROAR_WITHOUT_DCOMP_EMUL_RSOUND 248 case ROAR_PROTO_RSOUND: // nothing to do here. 249 break; 250 #endif 251 #ifndef ROAR_WITHOUT_DCOMP_EMUL_RPLAY 252 case ROAR_PROTO_RPLAY: 253 if ( roar_vio_open_fh_socket(&vio, fh) == -1 ) 254 return -1; 255 256 if ( emul_rplay_on_status(client, NULL, &vio, NULL, 0) == -1 ) 257 return -1; 258 break; 259 #endif 260 default: 261 // OS independiend code to close the socket: 262 if ( roar_vio_open_fh_socket(&vio, fh) == -1 ) 263 return -1; 264 265 protohandle = clients_get_protohandle(proto); 266 supported = 0; 267 if ( protohandle != NULL ) { 268 switch (protohandle->type) { 269 case ROARD_PROTO_TYPE_BUILDIN: 270 //this should not end up here. 271 ROAR_WARN("net_get_new_client(lsock=%p): proto(%i) marked as buildin but isn't. BAD.", lsock, proto); 272 supported = 0; 273 break; 274 case ROARD_PROTO_TYPE_ROARDPROTO: 275 supported = 1; 276 if ( protohandle->impl.roardproto.new_client != NULL ) { 277 if ( protohandle->impl.roardproto.new_client(client, &vio, lsock) == -1 ) { 278 supported = 0; 279 } 280 } 281 break; 282 } 283 } 284 285 if ( !supported ) { 286 clients_delete(client); 287 //roar_vio_close(&vio); 288 return -1; 289 } 290 break; 291 } 292 162 293 163 294 return 0; -
roard/include/client.h
r5567 r5571 111 111 int clients_new (void); 112 112 int clients_new_from_fh(int fh, int proto, int byteorder, int update_nnode); 113 int clients_new_from_fh2(int fh, int proto, int byteorder, 114 int update_nnode, 115 struct roard_listen * lsock, struct sockaddr * sockaddr, socklen_t addrlen); 113 116 int clients_delete (int id); 114 117 int clients_close (int id, int nocheck_exec); -
roard/network.c
r5567 r5571 70 70 71 71 int net_get_new_client (struct roard_listen * lsock) { 72 const struct roard_proto_handle * proto ;72 const struct roard_proto_handle * protohandle; 73 73 int fh; 74 74 int client; … … 79 79 socklen_t addrlen = sizeof(addr); 80 80 int supported = 0; 81 int proto = lsock->proto; 81 82 82 83 if ( roar_vio_ctl(&(lsock->sock), ROAR_VIO_CTL_GET_FH, &socket) == -1 ) { … … 95 96 return -1; 96 97 97 #ifndef ROAR_WITHOUT_DCOMP_EMUL_RSOUND 98 if ( lsock->proto == ROAR_PROTO_RSOUND ) { 99 client = emul_rsound_on_connect(fh, lsock); 100 switch (client) { 101 case -1: return -1; break; 102 case -2: return 0; break; 103 default: // TODO: write error handling 104 clients_get(client, &c); 105 fh = c->fh; 106 break; 98 if ( clients_new_from_fh2(fh, lsock->proto, ROAR_BYTEORDER_NETWORK, 1, lsock, (struct sockaddr*)&addr, &addrlen) == -1 ) { 99 if ( roar_vio_open_fh_socket(&vio, fh) == -1 ) { 100 close(fh); 101 return -1; 107 102 } 108 } else { 109 #endif 110 111 client = clients_new(); 112 113 if ( client == -1 ) { 114 ROAR_DBG("net_get_new_client(void) = -1 // can not create new client"); 115 close(fh); 103 roar_vio_close(&vio); 116 104 return -1; 117 105 } 118 119 if ( clients_set_fh(client, fh) == -1 ) {120 ROAR_ERR("net_get_new_client(void): Can not set client's fh");121 122 clients_delete(client);123 close(fh);124 125 ROAR_DBG("net_get_new_client(void) = -1");126 return -1;127 }128 #ifndef ROAR_WITHOUT_DCOMP_EMUL_RSOUND129 }130 #endif131 132 if ( clients_get(client, &c) != -1 ) {133 if ( roar_nnode_free(&(c->nnode)) == -1 )134 return -1;135 136 if ( roar_nnode_new_from_sockaddr(&(c->nnode), (struct sockaddr*)&addr, addrlen) == -1 )137 return -1;138 }139 140 ROAR_DBG("net_get_new_client(*): proto=0x%.4x", lsock->proto);141 142 if ( clients_set_proto(client, lsock->proto) == -1 ) {143 ROAR_WARN("net_get_new_client(*): Setting proto(0x%.4x) of client %i failed.", lsock->proto, client);144 return -1;145 }146 147 switch (lsock->proto) {148 case ROAR_PROTO_ROARAUDIO:149 // nothing needed to be done here150 break;151 #ifndef ROAR_WITHOUT_DCOMP_EMUL_ESD152 #ifdef ROAR_HAVE_H_ESD153 case ROAR_PROTO_ESOUND:154 ROAR_DBG("net_get_new_client(*): execing ESD CONNECT command");155 156 if ( roar_vio_open_fh_socket(&vio, fh) == -1 )157 return -1;158 159 ROAR_DBG("net_get_new_client(*): creating VIO OK");160 161 if ( emul_esd_exec_command(client, ESD_PROTO_CONNECT, &vio) == -1 )162 return -1;163 164 ROAR_DBG("net_get_new_client(*): CONNECT execed sucessfully");165 break;166 #endif167 #endif168 #ifndef ROAR_WITHOUT_DCOMP_EMUL_SIMPLE169 case ROAR_PROTO_SIMPLE:170 if ( emul_simple_on_connect(client, lsock) == -1 )171 return -1;172 break;173 #endif174 #ifndef ROAR_WITHOUT_DCOMP_EMUL_RSOUND175 case ROAR_PROTO_RSOUND: // nothing to do here.176 break;177 #endif178 #ifndef ROAR_WITHOUT_DCOMP_EMUL_RPLAY179 case ROAR_PROTO_RPLAY: // nothing to do here.180 181 if ( roar_vio_open_fh_socket(&vio, fh) == -1 )182 return -1;183 184 if ( emul_rplay_on_status(client, NULL, &vio, NULL, 0) == -1 )185 return -1;186 break;187 #endif188 default:189 // OS independiend code to close the socket:190 if ( roar_vio_open_fh_socket(&vio, fh) == -1 )191 return -1;192 193 proto = clients_get_protohandle(lsock->proto);194 supported = 0;195 if ( proto != NULL ) {196 switch (proto->type) {197 case ROARD_PROTO_TYPE_BUILDIN:198 //this should not end up here.199 ROAR_WARN("net_get_new_client(lsock=%p): proto(%i) marked as buildin but isn't. BAD.", lsock, lsock->proto);200 supported = 0;201 break;202 case ROARD_PROTO_TYPE_ROARDPROTO:203 supported = 1;204 if ( proto->impl.roardproto.new_client != NULL ) {205 if ( proto->impl.roardproto.new_client(client, &vio, lsock) == -1 ) {206 supported = 0;207 }208 }209 break;210 }211 }212 213 if ( !supported ) {214 clients_delete(client);215 //roar_vio_close(&vio);216 return -1;217 }218 break;219 }220 221 // close(fh);222 106 223 107 return 0;
Note: See TracChangeset
for help on using the changeset viewer.