<!DOCTYPE html><html><head><title></title><style type="text/css">p.MsoNormal,p.MsoNoSpacing{margin:0}</style></head><body><div><br></div><div><br></div><div>On Wed, Jan 8, 2020, at 14:48, Rémi Denis-Courmont wrote:<br></div><blockquote type="cite" id="qt"><div>This has nothing to do with the raw TCP protocol. By that logic why don't you merge tcp.c with file.c which is essentially doing the same thing except on Open...?<br></div><div><br></div><div>This makes no architectural sense. A separate protocol is a separate modulew especially if it's niche, so it can be left out.<br></div></blockquote><div><br></div><div>I don't have strong opinions about that but I still tend to prefer having both module into one.<br></div><div><br></div><div>I can revert and merge the initial patch tomorrow, if you all agree with Rémi.<br></div><div><br></div><blockquote type="cite" id="qt"><div><br></div><div class="qt-gmail_quote"><div>Le 7 janvier 2020 04:18:46 GMT+09:00, Vincenzo Nicosia <katolaz@freaknet.org> a écrit :<br></div><blockquote style="margin-top:0pt;margin-right:0pt;margin-bottom:0pt;margin-left:0.8ex;border-left-color:rgb(204, 204, 204);border-left-style:solid;border-left-width:1px;padding-left:1ex;" class="qt-gmail_quote"><pre class="qt-k9mail"><div>Hi All,<br></div><div><br></div><div>please find attached the patch to add gopher support as a submodule of<br></div><div>tcp.c, instead of being an independent module. This would invalidate<br></div><div>the previous "[PATCH] access: add gopher input module".<br></div><div><br></div><div>Comments are welcome. <br></div><div><br></div><div>Thanks<hr> modules/access/tcp.c | 79 ++++++++++++++++++++++++++++++++++++++++++++<br></div><div> src/input/item.c     |  1 +<br></div><div> 2 files changed, 80 insertions(+)<br></div><div><br></div><div>diff --git a/modules/access/tcp.c b/modules/access/tcp.c<br></div><div>index 214a5853be..53a0821f87 100644<br></div><div>--- a/modules/access/tcp.c<br></div><div>+++ b/modules/access/tcp.c<br></div><div>@@ -2,8 +2,10 @@<br></div><div>  * tcp.c: TCP input module<br></div><div>  *****************************************************************************<br></div><div>  * Copyright (C) 2003-2004 VLC authors and VideoLAN<br></div><div>+ * Copyright (C) 2020 Vincenzo "KatolaZ" Nicosia<br></div><div>  *<br></div><div>  * Authors: Laurent Aimar <fenrir@via.ecp.fr><br></div><div>+ *          Vincenzo "KatolaZ" Nicosia <katolaz@freaknet.org> (gopher sub-module)<br></div><div>  *<br></div><div>  * This program is free software; you can redistribute it and/or modify it<br></div><div>  * under the terms of the GNU Lesser General Public License as published by<br></div><div>@@ -29,9 +31,13 @@<br></div><div> #include <vlc_common.h><br></div><div> #include <vlc_plugin.h><br></div><div> #include <vlc_access.h><br></div><div>+#include <vlc_messages.h><br></div><div> #include <vlc_url.h><br></div><div> #include <vlc_tls.h><br></div><div> <br></div><div>+#include <stdlib.h><br></div><div>+#include <string.h><br></div><div>+<br></div><div> static ssize_t Read(stream_t *access, void *buf, size_t len)<br></div><div> {<br></div><div>     return vlc_tls_Read(access->p_sys, buf, len, false);<br></div><div>@@ -106,6 +112,69 @@ static void Close( vlc_object_t *p_this )<br></div><div>     vlc_tls_SessionDelete(access->p_sys);<br></div><div> }<br></div><div> <br></div><div>+static int GopherOpen(vlc_object_t *obj)<br></div><div>+{<br></div><div>+    char *psz_path = NULL;<br></div><div>+    stream_t *access = (stream_t *)obj;<br></div><div>+    vlc_tls_t *sock;<br></div><div>+    vlc_url_t url;<br></div><div>+<br></div><div>+<br></div><div>+    if (vlc_UrlParse(&url, access->psz_url) || url.psz_host == NULL){<br></div><div>+        msg_Err(access, "invalid location: %s", access->psz_location);<br></div><div>+        vlc_UrlClean(&url);<br></div><div>+        return VLC_EGENERIC;<br></div><div>+    }<br></div><div>+<br></div><div>+    if (url.i_port <= 0){<br></div><div>+        url.i_port = 70;<br></div><div>+    }<br></div><div>+    sock = vlc_tls_SocketOpenTCP(obj, url.psz_host, url.i_port);<br></div><div>+<br></div><div>+    if (unlikely(sock == NULL)){<br></div><div>+        msg_Err(access, "cannot connect to %s:%d", url.psz_host, url.i_port);<br></div><div>+        vlc_UrlClean(&url);<br></div><div>+        return VLC_EGENERIC;<br></div><div>+    }<br></div><div>+<br></div><div>+    if (url.psz_path == NULL || strlen(url.psz_path) <= 3){<br></div><div>+        /* If no resource type is specified, look for the root resource */<br></div><div>+        if (asprintf(&psz_path, "\r\n") == -1){<br></div><div>+            vlc_UrlClean(&url);<br></div><div>+            vlc_tls_SessionDelete(sock);<br></div><div>+            return VLC_EGENERIC;<br></div><div>+        }<br></div><div>+        msg_Info(access, "path set to root resource");<br></div><div>+    }<br></div><div>+    else { /* strip resource type from URL */<br></div><div>+        if(asprintf(&psz_path, "%s\r\n", url.psz_path+2) == -1){<br></div><div>+            vlc_UrlClean(&url);<br></div><div>+            vlc_tls_SessionDelete(sock);<br></div><div>+            return VLC_EGENERIC;<br></div><div>+        }<br></div><div>+        msg_Info(access, "stripped resource type from path");<br></div><div>+    }<br></div><div>+    vlc_UrlClean(&url);<br></div><div>+<br></div><div>+    access->p_sys = sock;<br></div><div>+    access->pf_read = Read;<br></div><div>+    access->pf_block = NULL;<br></div><div>+    access->pf_control = Control;<br></div><div>+    access->pf_seek = NULL;<br></div><div>+<br></div><div>+    msg_Info(access, "requesting resource: %s", psz_path);<br></div><div>+    if (vlc_tls_Write(access->p_sys, psz_path, strlen(psz_path)) < 0){<br></div><div>+        vlc_tls_SessionDelete(access->p_sys);<br></div><div>+        free(psz_path);<br></div><div>+        return VLC_EGENERIC;<br></div><div>+    }<br></div><div>+<br></div><div>+    free(psz_path);<br></div><div>+    return VLC_SUCCESS;<br></div><div>+}<br></div><div>+<br></div><div>+<br></div><div>+<br></div><div> /*****************************************************************************<br></div><div>  * Module descriptor<br></div><div>  *****************************************************************************/<br></div><div>@@ -118,4 +187,14 @@ vlc_module_begin ()<br></div><div>     set_capability( "access", 0 )<br></div><div>     add_shortcut( "tcp" )<br></div><div>     set_callbacks( Open, Close )<br></div><div>+<br></div><div>+/* Gopher submodule */<br></div><div>+    add_submodule ()<br></div><div>+        set_description( N_("Gopher input") )<br></div><div>+        set_capability( "access", 0 )<br></div><div>+        set_shortname( "gopher" )<br></div><div>+        set_category( CAT_INPUT )<br></div><div>+        set_subcategory( SUBCAT_INPUT_ACCESS )<br></div><div>+        add_shortcut( "gopher" )<br></div><div>+        set_callbacks( GopherOpen, Close )<br></div><div> vlc_module_end ()<br></div><div>diff --git a/src/input/item.c b/src/input/item.c<br></div><div>index 9c3442d5c7..1a8a2bdb3f 100644<br></div><div>--- a/src/input/item.c<br></div><div>+++ b/src/input/item.c<br></div><div>@@ -1187,6 +1187,7 @@ static enum input_item_type_e GuessType( const input_item_t *p_item, bool *p_net<br></div><div>         { "fd",     ITEM_TYPE_UNKNOWN, false },<br></div><div>         { "file",   ITEM_TYPE_FILE, false },<br></div><div>         { "ftp",    ITEM_TYPE_FILE, true },<br></div><div>+        { "gopher", ITEM_TYPE_STREAM, true },<br></div><div>         { "http",   ITEM_TYPE_FILE, true },<br></div><div>         { "icyx",   ITEM_TYPE_STREAM, true },<br></div><div>         { "imem",   ITEM_TYPE_UNKNOWN, false },<br></div></pre></blockquote></div><div><br></div><div>-- <br></div><div>Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté. <br></div><div>_______________________________________________<br></div><div>vlc-devel mailing list<br></div><div>To unsubscribe or modify your subscription options:<br></div><div>https://mailman.videolan.org/listinfo/vlc-devel<br></div></blockquote><div><br></div></body></html>