I was surprised to see that "cfagent -pv" didn't show the slackware class on my Slackware machine. The code is trying to determine the version string by reading /etc/slackware-release. Modern Slackware systems use /etc/slackware-version.

The attached patch changes the behaviour so that the newer file is consulted first, and sets more classes in the same way as for other Linux distributions, eg slackware_12_0_0, slackware_12_0, slackware_12, slackware.
--- cfengine-2.2.3/src/prototypes.h	(revision 145)
+++ cfengine-2.2.3/src/prototypes.h	(working copy)
@@ -757,6 +757,7 @@
 int linux_redhat_version (void);
 int linux_mandrake_version (void);
 int linux_suse_version (void);
+int linux_slackware_version (char *filename);
 int debian_version (void);
 int lsb_version (void);
 char * UnQuote (char *name);
--- cfengine-2.2.3/src/misc.c	(revision 145)
+++ cfengine-2.2.3/src/misc.c	(working copy)
@@ -523,12 +523,22 @@
    linux_suse_version();
    }
 
-if (stat("/etc/slackware-release",&statbuf) != -1)
+#define SLACKWARE_ANCIENT_VERSION_FILENAME "/etc/slackware-release"
+#define SLACKWARE_VERSION_FILENAME "/etc/slackware-version"
+if (stat(SLACKWARE_VERSION_FILENAME,&statbuf) != -1)
    {
    Verbose("\nThis appears to be a slackware system.\n");
    AddClassToHeap("slackware");
+   linux_slackware_version(SLACKWARE_VERSION_FILENAME);
    }
+else if (stat(SLACKWARE_ANCIENT_VERSION_FILENAME,&statbuf) != -1)
+   {
+   Verbose("\nThis appears to be an ancient slackware system.\n");
+   AddClassToHeap("slackware");
+   linux_slackware_version(SLACKWARE_ANCIENT_VERSION_FILENAME);
+   }
 
+
 if (stat("/etc/generic-release",&statbuf) != -1)
    {
    Verbose("\nThis appears to be a sun cobalt system.\n");
@@ -959,6 +969,46 @@
 return 0;
 }
 
+int linux_slackware_version(char *filename)
+{
+int major = -1; 
+int minor = -1; 
+int release = -1;
+char classname[CF_MAXVARSIZE] = "";
+FILE *fp;
+
+if ((fp = fopen(filename,"r")) == NULL)
+   {
+   return 1;
+   }
+
+Verbose("Looking for Slackware version...\n");
+switch (fscanf(fp, "Slackware %d.%d.%d", &major, &minor, &release))
+    {
+    case 3:
+        Verbose("This appears to be a Slackware %u.%u.%u system.", major, minor, release);
+        snprintf(classname, CF_MAXVARSIZE, "slackware_%u_%u_%u", major, minor, release);
+        AddClassToHeap(classname);
+        /* Fall-through */
+    case 2:
+        Verbose("This appears to be a Slackware %u.%u system.", major, minor);
+        snprintf(classname, CF_MAXVARSIZE, "slackware_%u_%u", major, minor);
+        AddClassToHeap(classname);
+        /* Fall-through */
+    case 1:
+        Verbose("This appears to be a Slackware %u system.", major);
+        snprintf(classname, CF_MAXVARSIZE, "slackware_%u", major);
+        AddClassToHeap(classname);
+        break;
+    case 0:
+        Verbose("No Slackware version number found.\n");
+        fclose(fp);
+        return 2;
+    }
+fclose(fp);
+return 0;
+}
+
 /******************************************************************/
 
 int debian_version(void) /* Andrew Stribblehill */
_______________________________________________
Bug-cfengine mailing list
[email protected]
https://cfengine.org/mailman/listinfo/bug-cfengine

Reply via email to