/** * Sets the message logging callback. * \param cb message callback, or NULL to clear * \param data data pointer for the message callback */ void vlc_LogSet(libvlc_int_t *vlc, vlc_log_cb cb, void *opaque) { vlc_logger_t *logger = libvlc_priv(vlc)->logger; if (unlikely(logger == NULL)) return; module_t *module; void *sys; if (cb == NULL) cb = vlc_vaLogDiscard; vlc_rwlock_wrlock(&logger->lock); sys = logger->sys; module = logger->module; logger->log = cb; logger->sys = opaque; logger->module = NULL; vlc_rwlock_unlock(&logger->lock); if (module != NULL) vlc_module_unload(module, vlc_logger_unload, sys); /* Announce who we are */ msg_Dbg (vlc, "VLC media player - %s", VERSION_MESSAGE); msg_Dbg (vlc, "%s", COPYRIGHT_MESSAGE); msg_Dbg (vlc, "revision %s", psz_vlc_changeset); msg_Dbg (vlc, "configured with %s", CONFIGURE_LINE); }
/** * Allocates a client's TLS credentials and shakes hands through the network. * This is a blocking network operation. * * @param fd stream socket through which to establish the secure communication * layer. * @param psz_hostname Server Name Indication to pass to the server, or NULL. * * @return NULL on error. **/ vlc_tls_t * vlc_tls_ClientCreate (vlc_object_t *obj, int fd, const char *hostname) { vlc_tls_t *cl = vlc_custom_create (obj, sizeof (*cl), "tls client"); if (unlikely(cl == NULL)) return NULL; cl->u.module = vlc_module_load (cl, "tls client", NULL, false, tls_client_start, cl, fd, hostname); if (cl->u.module == NULL) { msg_Err (cl, "TLS client plugin not available"); vlc_object_release (cl); return NULL; } /* TODO: do this directly in the TLS plugin */ int val; do val = cl->handshake (cl); while (val > 0); if (val != 0) { msg_Err (cl, "TLS client session handshake error"); vlc_module_unload (cl->u.module, tls_client_stop, cl); vlc_object_release (cl); return NULL; } msg_Dbg (cl, "TLS client session initialized"); return cl; }
/** * Releases data allocated with vlc_tls_ClientCreate(). * It is your job to close the underlying socket. */ void vlc_tls_ClientDelete (vlc_tls_t *cl) { if (cl == NULL) return; vlc_module_unload (cl->u.module, tls_client_stop, cl); vlc_object_release (cl); }
/** * Releases data allocated with vlc_tls_ClientCreate() or * vlc_tls_ServerCreate(). * @param srv TLS server object to be destroyed, or NULL */ void vlc_tls_Delete (vlc_tls_creds_t *crd) { if (crd == NULL) return; vlc_module_unload (crd->module, tls_unload, crd); vlc_object_release (crd); }
/** * Allocates a client's TLS credentials and shakes hands through the network. * This is a blocking network operation. * * @param fd stream socket through which to establish the secure communication * layer. * @param psz_hostname Server Name Indication to pass to the server, or NULL. * * @return NULL on error. **/ vlc_tls_t * vlc_tls_ClientCreate (vlc_object_t *obj, int fd, const char *hostname) { vlc_tls_t *cl = vlc_custom_create (obj, sizeof (*cl), "tls client"); if (unlikely(cl == NULL)) return NULL; cl->u.module = vlc_module_load (cl, "tls client", NULL, false, tls_client_start, cl, fd, hostname); if (cl->u.module == NULL) { msg_Err (cl, "TLS client plugin not available"); vlc_object_release (cl); return NULL; } mtime_t deadline = mdate (); deadline += var_InheritInteger (obj, "ipv4-timeout") * 1000; struct pollfd ufd[1]; ufd[0].fd = fd; int val; while ((val = cl->handshake (cl)) > 0) { mtime_t now = mdate (); if (now > deadline) now = deadline; assert (val <= 2); ufd[0] .events = (val == 1) ? POLLIN : POLLOUT; if (poll (ufd, 1, (deadline - now) / 1000) == 0) { msg_Err (cl, "TLS client session handshake timeout"); val = -1; break; } } if (val != 0) { msg_Err (cl, "TLS client session handshake error"); vlc_module_unload (cl->u.module, tls_client_stop, cl); vlc_object_release (cl); return NULL; } msg_Dbg (cl, "TLS client session initialized"); return cl; }
void vout_window_Delete(vout_window_t *window) { if (!window) return; window_t *w = (window_t *)window; if (w->inhibit) { vlc_inhibit_Set (w->inhibit, VLC_INHIBIT_NONE); vlc_inhibit_Destroy (w->inhibit); } vlc_module_unload(w->module, vout_window_stop, window); vlc_object_release(window); }
void vlc_LogDeinit(libvlc_int_t *vlc) { vlc_logger_t *logger = libvlc_priv(vlc)->logger; if (unlikely(logger == NULL)) return; if (logger->module != NULL) vlc_module_unload(logger->module, vlc_logger_unload, logger->sys); else /* Flush early log messages (corner case: no call to vlc_LogInit()) */ if (logger->log == vlc_vaLogEarly) { logger->log = vlc_vaLogDiscard; vlc_LogEarlyClose(logger, logger->sys); } vlc_rwlock_destroy(&logger->lock); vlc_object_release(logger); libvlc_priv(vlc)->logger = NULL; }