Unveil discussion: save_dir

<[email protected]>
Newsgroups gmane.comp.web.dillo.devel
Message-ID <[email protected]>
Hi, 

I have managed to get dillo.cc to use the 'save_dir' preference to set
which download path is unveiled. This was done by moving the unveil
call to a point after which prefs are initialized and dillorc is
parsed. Here is what the patch looks like:

--- dillo.cc	Sat Jun 29 16:33:08 2024
+++ dillo.cc	Tue Jul 30 14:18:28 2024
@@ -23,6 +23,7 @@
 
 #include <stdio.h>
 #include <unistd.h>
+#include <err.h>
 #include <stdlib.h>
 #include <time.h>
 #include <sys/types.h>
@@ -463,6 +464,58 @@ int main(int argc, char **argv)
    }
    dLib_show_messages(prefs.show_msg);
 
+   // Use unveil on OpenBSD
+   #ifdef __OpenBSD__
+   if (unveil("/usr/local/share/fonts", "r") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/usr/local/share/icons", "r") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/usr/X11R6/share/X11/locale", "r") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/usr/X11R6/lib/X11/fonts", "r") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/usr/local/etc/dillo", "r") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/tmp", "rwc") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/usr/local/bin/dpid", "x") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/etc/fonts", "r") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/etc/resolv.conf", "r") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/etc/ssl/cert.pem", "r") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil(prefs.save_dir, "rwc") == -1) {
+       err(1, "unveil failed");
+   }
+   char *dil_loc = dStrconcat(dGethomedir(), "/.dillo", NULL);
+   if (unveil(dil_loc, "rwc") == -1) {
+       err(1, "unveil failed");
+   }
+   dFree(dil_loc);
+   char *icons_loc = dStrconcat(dGethomedir(), "/.icons", NULL);      
+   if (unveil(icons_loc, "r") == -1) {
+       err(1, "unveil failed");
+   }
+   dFree(icons_loc);
+   char *xauth_loc = dStrconcat(dGethomedir(), "/.Xauthority", NULL);
    
+   if (unveil(xauth_loc, "r") == -1) {
+       err(1, "unveil failed");
+   }
+   dFree(xauth_loc);
+   #endif
+   
    // initialize internal modules
    a_Dpi_init();
    a_Dns_init();


I have tried to do the same for downloads.cc, but haven't quite got it
yet. Since prefs are not initialized in downloads.cc, I tried to copy
that from dillo.cc, but am getting some linker errors when compliling.
I probably missed something obvious. Any ideas?

ld: error: undefined symbol: a_Prefs_init
>>> referenced by downloads.cc
>>>               downloads_dpi-downloads.o:(main)
mv -f .deps/vsource.Tpo .deps/vsource.Po

ld: error: undefined symbol: Paths::init()
>>> referenced by downloads.cc
>>>               downloads_dpi-downloads.o:(main)

ld: error: undefined symbol: Paths::getPrefsFP(char const*)
>>> referenced by downloads.cc
>>>               downloads_dpi-downloads.o:(main)

ld: error: undefined symbol: PrefsParser::parse(__sFILE*)
>>> referenced by downloads.cc
>>>               downloads_dpi-downloads.o:(main)

ld: error: undefined symbol: prefs
>>> referenced by downloads.cc
>>>               downloads_dpi-downloads.o:(main)
c++: error: linker command failed with exit code 1 (use -v to see
invocation)

Here is what I tried:

--- downloads.cc	Sat Jun 29 16:33:08 2024
+++ downloads.cc	Tue Jul 30 15:07:04 2024
@@ -18,6 +18,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <err.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <ctype.h>
@@ -42,6 +43,9 @@
 #include <FL/Fl_Box.H>
 #include <FL/Fl_Button.H>
 
+#include "../src/paths.hh"
+#include "../src/prefs.h"
+#include "../src/prefsparser.hh"
 #include "config.h"
 #include "dpiutil.h"
 #include "../dpip/dpip.h"
@@ -1104,6 +1108,48 @@ static void custLabelMeasure(const Fl_Label* o,
int& W
 int main()
 {
    int ww = 420, wh = 85;
+   FILE *fp;
+
+   // set the default values for the preferences
+   a_Prefs_init();
+
+   // create ~/.dillo if not present
+   Paths::init();
+
+   // parse dillorc
+   if ((fp = Paths::getPrefsFP(PATHS_RC_PREFS))) {
+      PrefsParser::parse(fp);
+   }
+
+   /* Use unveil on OpenBSD */
+   #ifdef __OpenBSD__
+   if (unveil("/tmp", "rwc") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/etc/fonts", "r") == -1) {
+       err(1, "unveil failed");
+   }
+   if (unveil("/usr/local/bin/wget", "x") == -1) {
+       err(1, "unveil failed");
+   }
+   char *xauth_loc = dStrconcat(dGethomedir(), "/.Xauthority", NULL);
+   if (unveil(xauth_loc, "r") == -1) {
+       err(1, "unveil failed");
+   }
+   dFree(xauth_loc);
+   if (unveil("/usr/local/share/fonts", "r") == -1) {
+       err(1, "unveil failed");
+   }
+   char *dil_loc = dStrconcat(dGethomedir(), "/.dillo", NULL);
+   if (unveil(dil_loc, "rwc") == -1) {
+       err(1, "unveil failed");
+   }
+   dFree(dil_loc);
+   if (unveil(prefs.save_dir, "rwc") == -1) {
+       err(1, "unveil failed");
+   }
+   unveil(NULL, NULL);
+   #endif
 
    Fl::lock();

Finally, I tried to also get ftp.c to use the 'save_dir' preference, 
but had less luck. I think the issue comes from the fact that this is a
C program, and the others are C++. 

I'm wondering, is this whole unveil idea realistic at this point? Maybe
I'm just too inexperienced to be doing this work. I am quite willing to
keep going, but it will probably involve many more messages to the list
with problems similar to the ones above. I don't want to overwhelm the
list and devs with my beginner programming mistakes, it feels like I'm
placing an unfair burden on you.  

Regards,
Alex
_______________________________________________
Dillo-dev mailing list -- dillo-dev-lx9mn2B4QYRWk0Htik3J/[email protected]
To unsubscribe send an email to dillo-dev-leave-lx9mn2B4QYRWk0Htik3J/[email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.