Merge "res_pjsip: Add fax_detect_timeout endpoint option."
[asterisk/asterisk.git] / channels / vgrabbers.c
index 0e4e62f..ce8bb2b 100644 (file)
  *                        `->--[enc_out]
  */
 
+/*** MODULEINFO
+       <support_level>extended</support_level>
+ ***/
+
 #include "asterisk.h"
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+ASTERISK_REGISTER_FILE()
 #include <sys/ioctl.h>
 #include "asterisk/file.h"
 #include "asterisk/utils.h"    /* ast_calloc */
@@ -69,6 +73,8 @@ struct grab_x11_desc {
        struct fbuf_t   b;              /* geometry and pointer into the XImage */
 };
 
+static void *grab_x11_close(void *desc);       /* forward declaration */
+
 /*! \brief open the grabber.
  * We use the special name 'X11' to indicate this grabber.
  */
@@ -79,7 +85,8 @@ static void *grab_x11_open(const char *name, struct fbuf_t *geom, int fps)
        struct grab_x11_desc *v;
        struct fbuf_t *b;
 
-       if (strcasecmp(name, "X11"))
+       /* all names starting with X11 identify this grabber */
+       if (strncasecmp(name, "X11", 3))
                return NULL;    /* not us */
        v = ast_calloc(1, sizeof(*v));
        if (v == NULL)
@@ -126,12 +133,7 @@ static void *grab_x11_open(const char *name, struct fbuf_t *geom, int fps)
        return v;
 
 error:
-       /* XXX maybe XDestroy (v->image) ? */
-       if (v->dpy)
-               XCloseDisplay(v->dpy);
-       v->dpy = NULL;
-       ast_free(v);
-       return NULL;
+       return grab_x11_close(v);
 }
 
 static struct fbuf_t *grab_x11_read(void *desc)
@@ -169,7 +171,8 @@ static void *grab_x11_close(void *desc)
 {
        struct grab_x11_desc *v = desc;
 
-       XCloseDisplay(v->dpy);
+       if (v->dpy)
+               XCloseDisplay(v->dpy);
        v->dpy = NULL;
        v->image = NULL;
        ast_free(v);
@@ -205,6 +208,9 @@ static void *grab_v4l1_open(const char *dev, struct fbuf_t *geom, int fps)
        struct grab_v4l1_desc *v;
        struct fbuf_t *b;
 
+       /* name should be something under /dev/ */
+       if (strncmp(dev, "/dev/", 5)) 
+               return NULL;
        fd = open(dev, O_RDONLY | O_NONBLOCK);
        if (fd < 0) {
                ast_log(LOG_WARNING, "error opening camera %s\n", dev);