Subject: Collected Debian patches for the AFS Perl module
Author: Simon Wilkinson <sxw@inf.ed.ac.uk>
Author: Russ Allbery <rra@debian.org>

This patch collects multiple Debian fixes to the AFS Perl module.

There are various build system fixes for builds on Debian's platforms
and to increase the use of the PIC versions of libafsauthent and
libafsrpc.  src/Makefile.PL has also been patched to allow bypassing
detection of the AFS sysname by setting AFS_SYSNAME.

Added by Simon Wilkinson are additions of bos addhost, bos removehost,
bos adduser, bos removeuser, bos setrestart, and bos setcellname to the
BOS module.

All Debian changes are collected into a single patch because the packaging
is done in Git.  For more detailed change history and separate change
sets, clone the Git repository.  See the Vcs-Git header in the source
package for the URL.
--- libafs-perl-2.6.2.orig/src/Makefile.PL
+++ libafs-perl-2.6.2/src/Makefile.PL
@@ -92,7 +92,10 @@ if ($AFSPath eq 'unknown') {
 # determine the alpha_sys value
 #my $alpha_sys = 'i386_linux24';
 my $alpha_sys = 'unknown';
-if (-e "$AFSPath/bin/fs") {
+if ($ENV{AFS_SYSNAME}) {
+    $alpha_sys = $ENV{AFS_SYSNAME};
+}
+elsif (-e "$AFSPath/bin/fs") {
     my $fs_sysname = `$AFSPath/bin/fs sysname 2>&1`;
     if ($fs_sysname =~ s/Current sysname is:? //) {
         $fs_sysname =~ s/list? //;
@@ -186,6 +189,7 @@ elsif ($v_numb =~ /1.1/)   { $m_version
 elsif ($v_numb =~ /1.2/)   { $m_version = 'OpenAFS 1.2'; }
 elsif ($v_numb =~ /1.3/)   { $m_version = 'OpenAFS 1.3'; }
 elsif ($v_numb =~ /1.4/)   { $m_version = 'OpenAFS 1.4'; }
+elsif ($v_numb =~ /1.5/)   { $m_version = 'OpenAFS 1.5'; }
 elsif ($v_numb =~ /devel/) { $m_version = 'OpenAFS devel'; }
 
 # set the different compiler flags according to the AFS version
@@ -270,8 +274,8 @@ $command = "\'s#-lcom_err#$AFSPath/lib/a
 system("perl -p -i.bak -e $command Makefile");
 
 # change the library name of the AFS system library "-lafsrpc"
-if ($alpha_sys =~ /amd64_linux2/) {
-    $command = "\'s#-lutil -lafsrpc -lutil#$AFSPath/lib/libafsrpc_pic.a#\'";
+if ($alpha_sys =~ /linux/ && $alpha_sys !~ /i386_linux2/) {
+    $command = "\'s#-lutil -lafsrpc -lutil#$AFSPath/lib/libafsrpc_pic.a#; s#-lafsrpc#-lafsrpc_pic#\'";
 }
 else {
     $command = "\'s#-lutil -lafsrpc -lutil#$AFSPath/lib/libafsrpc.a#\'";
@@ -279,8 +283,8 @@ else {
 system("perl -p -i.bak -e $command Makefile");
 
 # change the library name of the AFS system library "-lafsauthent"
-if ($alpha_sys =~ /amd64_linux2/) {
-    $command = "\'s#-lutil -lafsauthent -lutil#$AFSPath/lib/libafsauthent_pic.a#\'";
+if ($alpha_sys =~ /linux/ && $alpha_sys !~ /i386_linux2/) {
+    $command = "\'s#-lutil -lafsauthent -lutil#$AFSPath/lib/libafsauthent_pic.a#; s#-lafsauthent#-lafsauthent_pic#\'";
 }
 else {
     $command = "\'s#-lutil -lafsauthent -lutil#$AFSPath/lib/libafsauthent.a#\'";
--- libafs-perl-2.6.2.orig/src/AFS.xs
+++ libafs-perl-2.6.2/src/AFS.xs
@@ -8047,25 +8047,28 @@ bos_addhost(self, object, clone=0)
         int clone
     PREINIT:
         int32 code = 0;
-    CODE:
-    {
-        not_here("AFS::BOS::addhost");
-
-        RETVAL = 0;
-        if (SvTYPE(SvRV(object)) == SVt_PVAV) {
             int len, i;
             AV *av;
             SV *sv;
             char *host;
             STRLEN namelen;
+    CODE:
+    {
         
+        RETVAL = 0;
+        if (!SvROK(object)) {
+            av = newAV();
+            av_push(av,object);
+        }
+        else if (SvTYPE(SvRV(object)) == SVt_PVAV) {
             av = (AV *) SvRV(object);
+        }
+
             len = av_len(av);
             if (len != -1) {
                 for (i = 0; i <= len; i++) {
                     sv = *av_fetch(av, i, 0);
-                    if (sv) {
-                        host = (char *) safemalloc(MAXHOSTCHARS);
+                 if (sv && !SvROK(sv)) {
                         host = SvPV(sv, namelen);
                         if (clone) {
                             char name[MAXHOSTCHARS];
@@ -8092,7 +8095,6 @@ bos_addhost(self, object, clone=0)
                     }
                 }                       /* for loop */
             }
-        }                               /* object is array ref */
         SETCODE(code);
         RETVAL = (code == 0);
         
@@ -8109,28 +8111,25 @@ bos_removehost(self, object)
     PREINIT:
         int32 code = 0;
         char *host;
+        int len, i;
+        AV *av;
+        SV *sv;
     CODE:
     {
-        not_here("AFS::BOS::removehost");
-
         if (!SvROK(object)) {
-            host = (char *) SvPV_nolen(object);
-            code = BOZO_DeleteCellHost(self, host);
+            av = newAV();
+            av_push(av,object);
         }
         else if (SvTYPE(SvRV(object)) == SVt_PVAV) {
-            int len, i;
-            AV *av;
-            SV *sv;
-            STRLEN namelen;
-        
             av = (AV *) SvRV(object);
+        }
+
             len = av_len(av);
             if (len != -1) {
                 for (i = 0; i <= len; i++) {
                     sv = *av_fetch(av, i, 0);
-                    if (sv) {
-                        host = (char *) safemalloc(MAXHOSTCHARS);
-                        host = SvPV(sv, namelen);
+                if (sv && !SvROK(sv)) {
+                    host = SvPV_nolen(sv);
                         code = BOZO_DeleteCellHost(self, host);
                         if (code) {
                             char buffer[240];
@@ -8141,11 +8140,8 @@ bos_removehost(self, object)
                     }
                 }                       /* for loop */
             }
-        }                               /* object is array ref */
         SETCODE(code);
         RETVAL = (code == 0);
-        if (host)
-            Safefree(host);
     }
     OUTPUT:
         RETVAL
@@ -8197,28 +8193,25 @@ bos_adduser(self, object)
     PREINIT:
         int32 code = 0;
         char *name;
+        int len, i;
+        AV *av;
+        SV *sv;
     CODE:
     {
-        not_here("AFS::BOS::adduser");
-
         if (!SvROK(object)) {
-            name = (char *) SvPV_nolen(object);
-            code = BOZO_AddSUser(self, name);
+            av = newAV();
+            av_push(av,object);
         }
         else if (SvTYPE(SvRV(object)) == SVt_PVAV) {
-            int len, i;
-            AV *av;
-            SV *sv;
-            STRLEN namelen;
-        
             av = (AV *) SvRV(object);
+        }
+
             len = av_len(av);
             if (len != -1) {
                 for (i = 0; i <= len; i++) {
                     sv = *av_fetch(av, i, 0);
-                    if (sv) {
-                        name = (char *) safemalloc(BOZO_BSSIZE);
-                        name = SvPV(sv, namelen);
+                if (sv && !SvROK(sv)) {
+                    name = SvPV_nolen(sv);
                         code = BOZO_AddSUser(self, name);
                         if (code) {
                             char buffer[240];
@@ -8229,11 +8222,8 @@ bos_adduser(self, object)
                     }
                 }                       /* for loop */
             }
-        }
         SETCODE(code);
         RETVAL = (code == 0);
-        if (name)
-            Safefree(name);
     }
     OUTPUT:
         RETVAL
@@ -8245,37 +8235,25 @@ bos_removeuser(self, object)
     PREINIT:
         int32 code = 0;
         char *name;
+        int len, i;
+        AV *av;
+        SV *sv;
     CODE:
     {
-        not_here("AFS::BOS::removeuser");
-
         if (!SvROK(object)) {
-            name = (char *) SvPV_nolen(object);
-            code = BOZO_DeleteSUser(self, name);
-            if (code) {
-                char buffer[240];
-                sprintf(buffer, "AFS::BOS: failed to delete user");
-                if (code == ENOENT)
-                    sprintf(buffer, "%s (no such user)\n", buffer);
-                else
-                    sprintf(buffer, "%s (%s)\n", em(code), buffer);
-                BSETCODE(code, buffer);
-            }
+            av = newAV();
+            av_push(av,object);
         }
         else if (SvTYPE(SvRV(object)) == SVt_PVAV) {
-            int len, i;
-            AV *av;
-            SV *sv;
-            STRLEN namelen;
-        
             av = (AV *) SvRV(object);
+        }
+
             len = av_len(av);
             if (len != -1) {
                 for (i = 0; i <= len; i++) {
                     sv = *av_fetch(av, i, 0);
-                    if (sv) {
-                        name = (char *) safemalloc(BOZO_BSSIZE);
-                        name = SvPV(sv, namelen);
+                if (sv && !SvROK(sv)) {
+                    name = SvPV_nolen(sv);
                         code = BOZO_DeleteSUser(self, name);
                         if (code) {
                             char buffer[240];
@@ -8289,10 +8267,7 @@ bos_removeuser(self, object)
                     }
                 }                       /* for loop */
             }
-        }
         RETVAL = (code == 0);
-        if (name)
-            Safefree(name);
     }
     OUTPUT:
         RETVAL
@@ -8571,8 +8546,6 @@ bos_setrestart(self, time, general=0, ne
         afs_int32 type;
     CODE:
     {
-        not_here("AFS::BOS::setrestart");
-
         if (general) {
             count++;
             type = 1;
@@ -9116,8 +9089,6 @@ bos_setcellname(self, name)
         int32 code = 0;   
     CODE:
     {
-        not_here("AFS::BOS::setcellname");
-
         code = BOZO_SetCellName(self, name);
         if (code) {
             char buffer[240];
