Changeset 2530:921f7ac0be31 in roaraudio for roard/roard.c
- Timestamp:
- 09/02/09 00:50:34 (15 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
roard/roard.c
r2511 r2530 26 26 27 27 #ifdef ROAR_SUPPORT_LISTEN 28 char * server = ROAR_DEFAULT_SOCK_GLOBAL; // global server address28 char * server[ROAR_MAX_LISTEN_SOCKETS]; 29 29 #endif 30 30 … … 32 32 #define SUPPORT_PIDFILE 33 33 char * pidfile = NULL; 34 #endif 35 36 #if defined(ROAR_HAVE_SETGID) || defined(ROAR_HAVE_SETUID) 37 int setids = 0; 34 38 #endif 35 39 … … 137 141 " -b --bind - IP/Hostname to bind to\n" 138 142 " --sock - Filename for UNIX Domain Socket\n" 143 " --proto PROTO - Use PROTO as protocol on Socket\n" 144 " --new-sock - Parameters for new socket follows\n" 139 145 #ifdef ROAR_HAVE_LIBSLP 140 146 " --slp - Enable OpenSLP support\n" … … 232 238 } 233 239 240 #ifdef ROAR_SUPPORT_LISTEN 241 int init_listening (void) { 242 int i; 243 244 for (i = 0; i < ROAR_MAX_LISTEN_SOCKETS; i++) { 245 g_listen_socket[i] = -1; 246 g_listen_proto[i] = ROAR_PROTO_ROARAUDIO; 247 server[i] = NULL; 248 } 249 250 return 0; 251 } 252 253 int get_proto (char * proto) { 254 if ( !strcasecmp(proto, "roar") ) { 255 return ROAR_PROTO_ROARAUDIO; 256 } else if ( !strcasecmp(proto, "roaraudio") ) { 257 return ROAR_PROTO_ROARAUDIO; 258 } else if ( !strcasecmp(proto, "esd") ) { 259 return ROAR_PROTO_ESOUND; 260 } else if ( !strcasecmp(proto, "esound") ) { 261 return ROAR_PROTO_ESOUND; 262 } 263 264 return -1; 265 } 266 267 int add_listen (char * addr, int port, int sock_type, char * user, char * group, int proto) { 268 #if defined(ROAR_HAVE_SETGID) && defined(ROAR_HAVE_IO_POSIX) 269 struct group * grp = NULL; 270 #endif 271 #if defined(ROAR_HAVE_SETUID) && defined(ROAR_HAVE_IO_POSIX) 272 struct passwd * pwd = NULL; 273 #endif 274 #ifdef ROAR_HAVE_UNIX 275 char * env_roar_proxy_backup; 276 #endif 277 int sockid = -1; 278 int sock; 279 int i; 280 281 if ( *addr != 0 ) { 282 for (i = 0; i < ROAR_MAX_LISTEN_SOCKETS; i++) { 283 if ( g_listen_socket[i] == -1 ) { 284 sockid = i; 285 break; 286 } 287 } 288 289 if ( sockid == -1 ) 290 return -1; 291 292 g_listen_proto[sockid] = proto; 293 294 ROAR_DBG("add_listen(*): proto=0x%.4x", proto); 295 296 if ( (g_listen_socket[sockid] = roar_socket_listen(sock_type, addr, port)) == -1 ) { 297 #ifdef ROAR_HAVE_UNIX 298 if ( *addr == '/' ) { 299 if ( (env_roar_proxy_backup = getenv("ROAR_PROXY")) != NULL ) { 300 env_roar_proxy_backup = strdup(env_roar_proxy_backup); 301 unsetenv("ROAR_PROXY"); 302 } 303 if ( (sock = roar_socket_connect(addr, port)) != -1 ) { 304 close(sock); 305 ROAR_ERR("Can not open listen socket!"); 306 return 1; 307 } else { 308 unlink(addr); 309 if ( (g_listen_socket[sockid] = roar_socket_listen(sock_type, addr, port)) == -1 ) { 310 ROAR_ERR("Can not open listen socket!"); 311 return 1; 312 } 313 } 314 if ( env_roar_proxy_backup != NULL ) { 315 setenv("ROAR_PROXY", env_roar_proxy_backup, 0); 316 free(env_roar_proxy_backup); 317 } 318 #else 319 if (0) { // noop 320 #endif 321 } else { 322 ROAR_ERR("Can not open listen socket!"); 323 return 1; 324 } 325 } 326 327 #if defined(ROAR_HAVE_SETGID) && defined(ROAR_HAVE_IO_POSIX) 328 if ( (grp = getgrnam(group)) == NULL ) { 329 ROAR_ERR("Can not get GID for group %s: %s", group, strerror(errno)); 330 } 331 #endif 332 #if defined(ROAR_HAVE_SETUID) && defined(ROAR_HAVE_IO_POSIX) 333 if ( user || (setids & R_SETUID) ) { 334 if ( (pwd = getpwnam(user)) == NULL ) { 335 ROAR_ERR("Can not get UID for user %s: %s", user, strerror(errno)); 336 } 337 } 338 #endif 339 340 #if defined(ROAR_HAVE_IO_POSIX) && defined(ROAR_HAVE_UNIX) 341 if ( *addr == '/' ) { 342 if ( grp ) { 343 if ( pwd ) { 344 if ( chown(addr, pwd->pw_uid, grp->gr_gid) == -1 ) 345 return 1; 346 } else { 347 if ( chown(addr, -1, grp->gr_gid) == -1 ) 348 return 1; 349 } 350 #ifdef ROAR_HAVE_GETUID 351 if ( getuid() == 0 ) 352 if ( chmod(addr, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) == -1 ) 353 return 1; 354 #endif 355 } 356 } 357 #endif 358 } 359 360 return 0; 361 } 362 #endif 363 234 364 int update_stream_flags (char * str) { 235 365 int dir; … … 686 816 // char * server = ROAR_DEFAULT_SOCK_GLOBAL; 687 817 #ifdef ROAR_SUPPORT_LISTEN 688 int port = ROAR_DEFAULT_PORT; 818 int port = ROAR_DEFAULT_PORT; 819 char * sock_addr = NULL; 820 int sock_proto = ROAR_PROTO_ROARAUDIO; 689 821 #endif 690 822 int drvid; … … 715 847 char * chrootdir = NULL; 716 848 #endif 717 #if defined(ROAR_HAVE_SETGID) || defined(ROAR_HAVE_SETUID)718 int setids = 0;719 #endif720 #ifdef ROAR_HAVE_UNIX721 char * env_roar_proxy_backup;722 #endif723 849 #if defined(ROAR_HAVE_SETGID) && defined(ROAR_HAVE_IO_POSIX) 724 850 struct group * grp = NULL; … … 744 870 #ifdef ROAR_SUPPORT_LISTEN 745 871 g_no_listen = 0; 746 g_listen_socket = -1;747 872 #else 748 873 g_terminate = 1; … … 766 891 } 767 892 893 #ifdef ROAR_SUPPORT_LISTEN 894 if ( init_listening() == -1 ) { 895 ROAR_ERR("Can not init listening sockets!"); 896 return 1; 897 } 898 #endif 899 768 900 #ifndef ROAR_WITHOUT_DCOMP_MIDI 769 901 if ( midi_init_config() == -1 ) { … … 781 913 782 914 #ifdef ROAR_SUPPORT_LISTEN 915 sock_addr = ROAR_DEFAULT_SOCK_GLOBAL; 783 916 #ifdef ROAR_HAVE_GETUID 784 917 if ( getuid() != 0 && getenv("HOME") != NULL ) { 785 918 snprintf(user_sock, 79, "%s/%s", (char*)getenv("HOME"), ROAR_DEFAULT_SOCK_USER); 786 s erver = user_sock;919 sock_addr = user_sock; 787 920 } 788 921 #endif 789 922 790 923 if ( getenv("ROAR_SERVER") != NULL ) 791 s erver = getenv("ROAR_SERVER");924 sock_addr = getenv("ROAR_SERVER"); 792 925 #endif 793 926 … … 831 964 } else if ( strcmp(k, "--restart") == 0 ) { 832 965 #ifdef ROAR_SUPPORT_LISTEN 833 if ( restart_server(s erver, 1) == -1 ) {834 ROAR_WARN("Can not terminate old server (not running at %s?), tring to continue anyway", s erver);966 if ( restart_server(sock_addr, 1) == -1 ) { 967 ROAR_WARN("Can not terminate old server (not running at %s?), tring to continue anyway", sock_addr); 835 968 } 836 969 #else … … 839 972 } else if ( strcmp(k, "--shutdown") == 0 ) { 840 973 #ifdef ROAR_SUPPORT_LISTEN 841 if ( restart_server(s erver, 1) == -1 ) {842 ROAR_WARN("Can not terminate old server (not running at %s?)", s erver);974 if ( restart_server(sock_addr, 1) == -1 ) { 975 ROAR_WARN("Can not terminate old server (not running at %s?)", sock_addr); 843 976 return 1; 844 977 } … … 850 983 } else if ( strcmp(k, "--stop") == 0 ) { 851 984 #ifdef ROAR_SUPPORT_LISTEN 852 if ( restart_server(s erver, 0) == -1 ) {853 ROAR_WARN("Can not stop old server (not running at %s?)", s erver);985 if ( restart_server(sock_addr, 0) == -1 ) { 986 ROAR_WARN("Can not stop old server (not running at %s?)", sock_addr); 854 987 return 1; 855 988 } … … 1042 1175 // This is only usefull in INET not UNIX mode. 1043 1176 #ifdef ROAR_SUPPORT_LISTEN 1044 if ( *s erver == '/' )1045 s erver = ROAR_DEFAULT_HOST;1177 if ( *sock_addr == '/' ) 1178 sock_addr = ROAR_DEFAULT_HOST; 1046 1179 1047 1180 errno = 0; … … 1064 1197 } else if ( strcmp(k, "-b") == 0 || strcmp(k, "--bind") == 0 || strcmp(k, "--sock") == 0 ) { 1065 1198 #ifdef ROAR_SUPPORT_LISTEN 1066 server = argv[++i]; 1199 sock_addr = argv[++i]; 1200 #endif 1201 1202 } else if ( strcmp(k, "--proto") == 0 ) { 1203 #ifdef ROAR_SUPPORT_LISTEN 1204 if ( (sock_proto = get_proto(argv[++i])) == -1 ) { 1205 ROAR_ERR("Unknown protocol: %s", argv[i]); 1206 return 1; 1207 } 1067 1208 #endif 1068 1209 … … 1072 1213 sock_type = ROAR_SOCKET_TYPE_TCP; 1073 1214 1074 if ( *s erver == '/' )1075 s erver = ROAR_DEFAULT_HOST;1215 if ( *sock_addr == '/' ) 1216 sock_addr = ROAR_DEFAULT_HOST; 1076 1217 #endif 1077 1218 … … 1079 1220 #ifdef ROAR_SUPPORT_LISTEN 1080 1221 sock_type = ROAR_SOCKET_TYPE_TCP; 1081 if ( *s erver == '/' )1082 s erver = ROAR_DEFAULT_HOST;1222 if ( *sock_addr == '/' ) 1223 sock_addr = ROAR_DEFAULT_HOST; 1083 1224 #endif 1084 1225 } else if ( strcmp(k, "-6") == 0 ) { … … 1086 1227 #ifdef PF_INET6 1087 1228 sock_type = ROAR_SOCKET_TYPE_TCP6; 1088 if ( *s erver == '/' )1089 s erver = ROAR_DEFAULT_HOST;1229 if ( *sock_addr == '/' ) 1230 sock_addr = ROAR_DEFAULT_HOST; 1090 1231 #else 1091 1232 ROAR_ERR("No IPv6 support compiled in!"); … … 1105 1246 port = ROAR_DEFAULT_NUM; 1106 1247 strcpy(decnethost, ROAR_DEFAULT_LISTEN_OBJECT); 1107 s erver = decnethost;1248 sock_addr = decnethost; 1108 1249 sock_type = ROAR_SOCKET_TYPE_DECNET; 1109 1250 #else … … 1111 1252 return 1; 1112 1253 #endif 1254 #endif 1255 } else if ( strcmp(k, "--new-sock") == 0 ) { 1256 #ifdef ROAR_SUPPORT_LISTEN 1257 if ( add_listen(sock_addr, port, sock_type, sock_user, sock_grp, sock_proto) != 0 ) { 1258 ROAR_ERR("Can not open listen socket!"); 1259 return 1; 1260 } 1113 1261 #endif 1114 1262 … … 1128 1276 } else if ( strcmp(k, "--no-listen") == 0 ) { 1129 1277 #ifdef ROAR_SUPPORT_LISTEN 1130 s erver= "";1278 sock_addr = ""; 1131 1279 g_terminate = 1; 1132 1280 g_no_listen = 1; … … 1188 1336 1189 1337 #ifdef ROAR_SUPPORT_LISTEN 1190 if ( *server != 0 ) { 1191 if ( (g_listen_socket = roar_socket_listen(sock_type, server, port)) == -1 ) { 1192 #ifdef ROAR_HAVE_UNIX 1193 if ( *server == '/' ) { 1194 if ( (env_roar_proxy_backup = getenv("ROAR_PROXY")) != NULL ) { 1195 env_roar_proxy_backup = strdup(env_roar_proxy_backup); 1196 unsetenv("ROAR_PROXY"); 1197 } 1198 if ( (i = roar_socket_connect(server, port)) != -1 ) { 1199 close(i); 1200 ROAR_ERR("Can not open listen socket!"); 1201 return 1; 1202 } else { 1203 unlink(server); 1204 if ( (g_listen_socket = roar_socket_listen(sock_type, server, port)) == -1 ) { 1205 ROAR_ERR("Can not open listen socket!"); 1206 return 1; 1207 } 1208 } 1209 if ( env_roar_proxy_backup != NULL ) { 1210 setenv("ROAR_PROXY", env_roar_proxy_backup, 0); 1211 free(env_roar_proxy_backup); 1212 } 1213 #else 1214 if (0) { // noop 1215 #endif 1216 } else { 1217 ROAR_ERR("Can not open listen socket!"); 1218 return 1; 1219 } 1220 } 1221 1222 #if defined(ROAR_HAVE_SETGID) && defined(ROAR_HAVE_IO_POSIX) 1223 if ( (grp = getgrnam(sock_grp)) == NULL ) { 1224 ROAR_ERR("Can not get GID for group %s: %s", sock_grp, strerror(errno)); 1225 } 1226 #endif 1227 #if defined(ROAR_HAVE_SETUID) && defined(ROAR_HAVE_IO_POSIX) 1228 if ( sock_user || (setids & R_SETUID) ) { 1229 if ( (pwd = getpwnam(sock_user)) == NULL ) { 1230 ROAR_ERR("Can not get UID for user %s: %s", sock_user, strerror(errno)); 1231 } 1232 } 1233 #endif 1234 1235 #if defined(ROAR_HAVE_IO_POSIX) && defined(ROAR_HAVE_UNIX) 1236 if ( *server == '/' ) { 1237 if ( grp ) { 1238 if ( pwd ) { 1239 if ( chown(server, pwd->pw_uid, grp->gr_gid) == -1 ) 1240 return 1; 1241 } else { 1242 if ( chown(server, -1, grp->gr_gid) == -1 ) 1243 return 1; 1244 } 1245 #ifdef ROAR_HAVE_GETUID 1246 if ( getuid() == 0 ) 1247 if ( chmod(server, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) == -1 ) 1248 return 1; 1249 #endif 1250 } 1251 } 1252 #endif 1338 if ( add_listen(sock_addr, port, sock_type, sock_user, sock_grp, sock_proto) != 0 ) { 1339 ROAR_ERR("Can not open listen socket!"); 1340 return 1; 1253 1341 } 1254 1342 #endif … … 1389 1477 #ifdef ROAR_HAVE_LIBSLP 1390 1478 if ( reg_slp ) { 1391 register_slp(0, s erver);1479 register_slp(0, sock_addr); 1392 1480 } 1393 1481 #endif … … 1405 1493 1406 1494 void cleanup_listen_socket (int terminate) { 1495 int i; 1496 1407 1497 // Deregister from SLP: 1408 1498 #ifdef ROAR_HAVE_LIBSLP … … 1411 1501 1412 1502 #ifdef ROAR_SUPPORT_LISTEN 1413 if ( g_listen_socket != -1 ) { 1503 for (i = 0; i < ROAR_MAX_LISTEN_SOCKETS; i++) { 1504 if ( g_listen_socket[i] != -1 ) { 1414 1505 #ifdef ROAR_HAVE_IO_POSIX 1415 close(g_listen_socket);1506 close(g_listen_socket[i]); 1416 1507 #endif // #else is useless because we are in void context. 1417 1508 1418 g_listen_socket= -1;1509 g_listen_socket[i] = -1; 1419 1510 1420 1511 #ifdef ROAR_HAVE_UNIX 1421 if ( *server == '/' ) 1422 unlink(server); 1423 #endif 1512 if ( server[i] != NULL ) 1513 if ( *(server[i]) == '/' ) 1514 unlink(server[i]); 1515 #endif 1516 } 1424 1517 } 1425 1518
Note: See TracChangeset
for help on using the changeset viewer.