]> err.no Git - dpkg/commitdiff
dselect/baselist.cc: don't specify SA_INTERRUPT, since it's not portable and the...
authorWichert Akkerman <wakkerma@debian.org>
Tue, 11 Jan 2000 01:11:12 +0000 (01:11 +0000)
committerWichert Akkerman <wakkerma@debian.org>
Tue, 11 Jan 2000 01:11:12 +0000 (01:11 +0000)
main/enquiry.c: include sys/termios.h (needed on Solaris)
lib/lock.c: use EACCESS instead of EWOULDBLOCK
dselect/main.cc: fix help for -D
dselect/main.cc: try to lock admindir instead of using readwrite
dselect/method.cc: switch to using fcntl for lock since that is more portable, and revamp lockingcode to reduce code duplication

ChangeLog
dselect/baselist.cc
dselect/main.cc
dselect/method.cc
lib/lock.c
main/enquiry.c
utils/Makefile.in

index 26f1afa89b5fa94c795dcf052cf2591a2fca4688..bfb681c373dac85ba01fe84c4e5e1a6448808492 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+Tue Jan 11 02:02:00 CET 2000 Wichert Akkerman <wakkerma@debian.org>
+
+  * dselect/baselist.cc: don't specify SA_INTERRUPT, since it's
+    not portable and the default behaviour
+  * main/enquiry.c: include sys/termios.h (needed on Solaris)
+  * lib/lock.c: use EACCESS instead of EWOULDBLOCK
+  * dselect/main.cc: fix help for -D
+  * dselect/main.cc: try to lock admindir instead of using readwrite
+  * dselect/method.cc: switch to using fcntl for lock since that is more
+    portable, and revamp lockingcode to reduce code duplication
+
 Sun Jan  9 16:11:39 CET 2000 Wichert Akkerman <wakkerma@debian.org>
 
   * Merge patches from Josip Rodin:
index b4d13a170a02d1a5ea78ee36d63f4d3a8f7ab862..3f326c6e5fba364ea0d54feec478a2426e541f3d 100644 (file)
@@ -77,7 +77,7 @@ void baselist::setupsigwinch() {
   memset(&nsigact,0,sizeof(nsigact));
   nsigact.sa_handler= sigwinchhandler;
   sigemptyset(&nsigact.sa_mask);
-  nsigact.sa_flags= SA_INTERRUPT;
+//nsigact.sa_flags= SA_INTERRUPT;
   if (sigaction(SIGWINCH,&nsigact,0)) ohshite(_("failed to set new SIGWINCH sigact"));
 }
 
index 59d0b00fb0d8966457c6846b74e76f1930983a17..ca30400d7c163bcf1ca90108002442971e9bc303 100644 (file)
@@ -47,6 +47,10 @@ extern "C" {
 #include "bindings.h"
 #include "pkglist.h"
 
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
 const char thisname[]= DSELECT;
 const char printforhelp[]= N_("Type dselect --help for help.");
 
@@ -94,7 +98,7 @@ static void usage(void) {
      _("Usage: dselect [options]\n"
        "       dselect [options] action ...\n"
        "Options:  --admindir <directory>  (default is /var/lib/dpkg)\n"
-       "          --help  --version  --licence  --expert  --debug <file> | -D<file> | -D\n"
+       "          --help  --version  --licence  --expert  --debug <file> | -D<file>\n"
        "Actions:  access update select install config remove quit menu\n"),
        stdout)) werr("stdout");
 }
@@ -233,6 +237,9 @@ void dme(int i, int so) {
 
 int refreshmenu(void) {
   char buf[2048];
+  static int l,lockfd;
+  static char *lockfile;
+
   curseson(); cbreak(); noecho(); nonl(); keypad(stdscr,TRUE);
 
   int y,x;
@@ -257,10 +264,14 @@ int refreshmenu(void) {
   sprintf(buf,gettext(copyrightstring),DPKG_VERSION_ARCH);
   addstr(buf);
 
-  if (!readwrite) { 
-  addstr(_("\n\n"
-         "Read-only access: only preview of selections is available!"));
-  }
+  l = strlen(admindir);
+  lockfile = new char[l+sizeof(LOCKFILE)+2];
+  strcpy(lockfile,admindir);
+  strcpy(lockfile+l, "/" LOCKFILE);
+  lockfd = open(lockfile, O_RDWR|O_CREAT|O_TRUNC, 0660);
+  if (errno == EACCES || errno == EPERM)
+    addstr(_("\n\n"
+             "Read-only access: only preview of selections is available!"));
 
   return i;
 }
index 69b372f8fafd9e1abfc3c96aa47a81a7b2543d7a..01756a34d9e4dd888afa1a5e39e30c5fdddd3b7c 100644 (file)
@@ -55,11 +55,27 @@ static const char *const methoddirectories[]= {
 static char *methodlockfile= 0;
 static int methlockfd= -1;
 
+void sthfailed(const char * reasoning) {
+  char buf[2048];
+
+  curseson();
+  clear();
+  sprintf(buf,_("\n\n%s: %s\n"),DSELECT,reasoning);
+  addstr(buf);
+  attrset(A_BOLD);
+  addstr(_("\nPress <enter> to continue."));
+  attrset(A_NORMAL);
+  refresh(); getch();
+}
+
 static void cu_unlockmethod(int, void**) {
+  struct flock fl;
+
   assert(methodlockfile);
   assert(methlockfd);
-  if (flock(methlockfd,LOCK_UN))
-    ohshite(_("unable to unlock access method area"));
+  fl.l_type=F_UNLCK; fl.l_whence= SEEK_SET; fl.l_start=fl.l_len=0;
+  if (fcntl(methlockfd,F_SETLK,&fl) == -1)
+    sthfailed("unable to unlock access method area");
 }
 
 static enum urqresult ensureoptions(void) {
@@ -73,10 +89,7 @@ static enum urqresult ensureoptions(void) {
     for (ccpp= methoddirectories; *ccpp; ccpp++)
       readmethods(*ccpp, &newoptions, &nread);
     if (!newoptions) {
-      curseson();
-      addstr(_("No access methods are available.\n\n"
-             "Press <enter> to continue."));
-      refresh(); getch();
+      sthfailed("no access methods are available");
       return urqr_fail;
     }
     options= newoptions;
@@ -85,20 +98,9 @@ static enum urqresult ensureoptions(void) {
   return urqr_normal;
 }
 
-static void lockfailed(const char * reasoning) {
-  char buf[2048];
-
-  curseson();
-  clear();
-  sprintf(buf,_("\n\n%s: %s\n"),DSELECT,reasoning);
-  addstr(buf);
-  attrset(A_BOLD);
-  addstr(_("\nPress <enter> to continue."));
-  attrset(A_NORMAL);
-  refresh(); getch();
-}
-
 static enum urqresult lockmethod(void) {
+  struct flock fl;
+
   if (!methodlockfile) {
     int l;
     l= strlen(admindir);
@@ -110,19 +112,20 @@ static enum urqresult lockmethod(void) {
     methlockfd= open(methodlockfile, O_RDWR|O_CREAT|O_TRUNC, 0660);
     if (methlockfd == -1) {
       if ((errno == EPERM) || (errno == EACCES)) {
-        lockfailed("requested operation requires superuser privilege");
+        sthfailed("requested operation requires superuser privilege");
         return urqr_fail;
       }
-      lockfailed("unable to open/create access method lockfile");
+      sthfailed("unable to open/create access method lockfile");
       return urqr_fail;
     }
   }
-  if (flock(methlockfd,LOCK_EX|LOCK_NB)) {
+  fl.l_type=F_WRLCK; fl.l_whence=SEEK_SET; fl.l_start=fl.l_len=0;
+  if (fcntl(methlockfd,F_SETLK,&fl) == -1) {
     if (errno == EWOULDBLOCK || errno == EAGAIN) {
-      lockfailed("the access method area is already locked");
+      sthfailed("the access method area is already locked");
       return urqr_fail;
       }
-    lockfailed("unable to lock access method area");
+    sthfailed("unable to lock access method area");
     return urqr_fail;
   }
   push_cleanup(cu_unlockmethod,~0, 0,0, 0);
@@ -219,10 +222,7 @@ static urqresult runscript(const char *exepath, const char *name) {
       };
     ur= falliblesubprocess(coption->meth->path,name,fallibleargs);
   } else {
-    curseson();
-    addstr(_("No access method is selected/configured.\n\n"
-           "Press <enter> to continue."));
-    refresh(); getch();
+    sthfailed("no access method is selected/configured");
     ur= urqr_fail;
   }
   pop_cleanup(ehflag_normaltidy);
index b4b0e601a3d3978c68b1d44d8bac1ab3356e6eda..ae95df34f4af7993cbc9cbe3c28b1bccff02da75 100644 (file)
@@ -74,8 +74,8 @@ void lockdatabase(const char *admindir) {
   fl.l_start= 0;
   fl.l_len= 0;
   if (fcntl(dblockfd,F_SETLK,&fl) == -1) {
-    if (errno == EWOULDBLOCK || errno == EAGAIN)
-      ohshit(_("status database area is locked - another dpkg/dselect is running"));
+    if (errno == EACCES || errno == EAGAIN)
+      ohshit(_("status database area is locked by another process"));
     ohshite(_("unable to lock dpkg status database"));
   }
   push_cleanup(cu_unlockdb,~0, 0,0, 0);
index af502ba0ad9953baf49a3d285b19061fc1613bf7..296cba6c698e9922e89a1e4d61624bc865e6b55b 100644 (file)
@@ -30,6 +30,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
+#include <sys/termios.h>
 #include <fcntl.h>
 
 #include <config.h>
index 09cbf46433a6e250ceaac499ed0cbbd11be0c8e7..b55ff42083c085c9faebffbb3a2ab0b0947f0930 100644 (file)
@@ -5,7 +5,7 @@ top_srcdir      = @top_srcdir@
 
 include ../Makefile.conf
 
-CFLAGS                 += $(top_srcdir)/optlib
+CFLAGS                 += -I$(top_srcdir)/optlib
 
 SSD_SOURCES            = start-stop-daemon.c
 SSD_OBJECTS            = $(patsubst %.c, %.o, $(SSD_SOURCES))