diff --git a/src/zm_stream.cpp b/src/zm_stream.cpp index 3bab38f86..908256638 100644 --- a/src/zm_stream.cpp +++ b/src/zm_stream.cpp @@ -321,9 +321,48 @@ void StreamBase::openComms() snprintf( loc_sock_path, sizeof(loc_sock_path), "%s/zms-%06ds.sock", config.path_socks, connkey ); unlink( loc_sock_path ); + unsigned int length = snprintf( sock_path_lock, sizeof(sock_path_lock), "%s/zms-%06d.lock", config.path_socks, connkey); + if ( length >= sizeof(sock_path_lock) ) { + Warning("Socket lock path was truncated."); + length = sizeof(sock_path_lock)-1; + } + + lock_fd = open(sock_path_lock, O_CREAT|O_WRONLY, S_IRUSR | S_IWUSR); + if ( lock_fd <= 0 ) + { + Error("Unable to open sock lock file %s: %s", sock_path_lock, strerror(errno) ); + lock_fd = 0; + } + else if ( flock(lock_fd, LOCK_EX) != 0 ) + { + Error("Unable to lock sock lock file %s: %s", sock_path_lock, strerror(errno) ); + close(lock_fd); + lock_fd = 0; + } + else + { + Debug( 1, "We have obtained a lock on %s fd: %d", sock_path_lock, lock_fd); + } + + sd = socket( AF_UNIX, SOCK_DGRAM, 0 ); + if ( sd < 0 ) + { + Fatal( "Can't create socket: %s", strerror(errno) ); + } + + length = snprintf( loc_sock_path, sizeof(loc_sock_path), "%s/zms-%06ds.sock", config.path_socks, connkey ); + if ( length >= sizeof(loc_sock_path) ) { + Warning("Socket path was truncated."); + length = sizeof(loc_sock_path)-1; + } + unlink( loc_sock_path ); + if ( sizeof(loc_addr.sun_path) < length ) { + Error("Not enough space %d in loc_addr.sun_path for socket file %s", sizeof(loc_addr.sun_path), loc_sock_path ); + } + strncpy( loc_addr.sun_path, loc_sock_path, sizeof(loc_addr.sun_path) ); loc_addr.sun_family = AF_UNIX; - if ( bind( sd, (struct sockaddr *)&loc_addr, strlen(loc_addr.sun_path)+sizeof(loc_addr.sun_family)) < 0 ) + if ( bind( sd, (struct sockaddr *)&loc_addr, strlen(loc_addr.sun_path)+sizeof(loc_addr.sun_family))+1 < 0 ) { Fatal( "Can't bind: %s", strerror(errno) ); } @@ -331,7 +370,7 @@ void StreamBase::openComms() snprintf( rem_sock_path, sizeof(rem_sock_path), "%s/zms-%06dw.sock", config.path_socks, connkey ); strncpy( rem_addr.sun_path, rem_sock_path, sizeof(rem_addr.sun_path) ); rem_addr.sun_family = AF_UNIX; - } + } // end if connKey > 0 } void StreamBase::closeComms() diff --git a/web/api/app/Controller/ServersController.php b/web/api/app/Controller/ServersController.php index b9afe0033..88a5bec90 100644 --- a/web/api/app/Controller/ServersController.php +++ b/web/api/app/Controller/ServersController.php @@ -19,7 +19,7 @@ class ServersController extends AppController { public function beforeFilter() { parent::beforeFilter(); - $canView = $this->Session->Read('systemPermission'); + $canView = $this->Session->Read('streamPermission'); if ($canView =='None') { throw new UnauthorizedException(__('Insufficient Privileges')); return; diff --git a/web/includes/Frame.php b/web/includes/Frame.php index d47e73159..5973cd1bf 100644 --- a/web/includes/Frame.php +++ b/web/includes/Frame.php @@ -86,20 +86,15 @@ class Frame { if ( $limit ) { $sql .= ' LIMIT ' . $limit; } -Error("sql:$sql ". implode(",", $values)); $results = dbFetchAll( $sql, NULL, $values ); if ( $results ) { -Error("results" . sizeof($results) ); return array_map( function($id){ return new Frame($id); }, $results ); } -Error("No results"); - } public static function find_one( $parameters = array() ) { $results = Frame::find( $parameters, 1 ); if ( ! sizeof( $results ) ) { -Debug("No Frame found"); return; } return $results[0]; diff --git a/web/includes/Server.php b/web/includes/Server.php index 0f4c43f57..dfce67eb8 100644 --- a/web/includes/Server.php +++ b/web/includes/Server.php @@ -53,5 +53,32 @@ class Server { #call_user_func_array( $this->{$fn}, $args); } } + public static function find( $parameters = array(), $limit = NULL ) { + $sql = 'SELECT * FROM Servers'; + $values = array(); + if ( sizeof($parameters) ) { + $sql .= ' WHERE ' . implode( ' AND ', array_map( + function($v){ return $v.'=?'; }, + array_keys( $parameters ) + ) ); + $values = array_values( $parameters ); + } + if ( $limit ) { + $sql .= ' LIMIT ' . $limit; + } + $results = dbFetchAll( $sql, NULL, $values ); + if ( $results ) { + return array_map( function($id){ return new Server($id); }, $results ); + } + } + + public static function find_one( $parameters = array() ) { + $results = Server::find( $parameters, 1 ); + if ( ! sizeof( $results ) ) { + return; + } + return $results[0]; + } + } ?>