Package: ltsp-client-core
Version: 5.1.90-1
Severity: wishlist
Tags: patch

It would be useful if getltscfg would support wildcards, e.g.:
[00:0C:6E:*]
XSERVER = nvidia

This is very useful in order to have specific settings for a subset of
computers. E.g. when buying a large number of computers of the same
model, they will usually have one or two MAC address series which can be
matched. The alternative is to add a separate section for each
computer, which requires a lot of work.

I have attached a patch which implements this, but while it seems to
work I can't guarantee that it's 100% correct.

-- System Information:
Debian Release: squeeze/sid
  APT prefers testing
  APT policy: (900, 'testing'), (800, 'unstable')
Architecture: i386 (i686)

Kernel: Linux 2.6.26-2-686 (SMP w/1 CPU core)
Locale: LANG=nb_NO.UTF-8, LC_CTYPE=nb_NO.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash
--- getltscfg.c.orig	2009-09-18 14:16:49.000000000 +0200
+++ getltscfg.c	2009-10-13 12:24:56.000000000 +0200
@@ -28,6 +28,8 @@
 #include  <net/if.h>
 #include  <netinet/in.h>
 #include  <arpa/inet.h>
+#define _GNU_SOURCE /* need the fnmatch FNM_CASEFOLD flag */
+#include  <fnmatch.h>
 #include  "getltscfg.h"
 
 extern FILE *yyin;
@@ -191,13 +193,17 @@
 //
 // find_chain_entry(), returns TRUE if it found the entry, and FALSE otherwise
 //
-int find_chain_entry(char *name)
+int find_chain_entry(char *name, int glob)
 {
     int	fFound = FALSE;
     SECTTYPE *worksect;
     cursect = headsect;
+    int matches = FALSE;
     while( cursect && !fFound ){
-        if(strcasecmp(cursect->name,name) == 0){
+        matches = strcasecmp(cursect->name,name) == 0;
+        if (glob)
+            matches = !matches && fnmatch(cursect->name, name, FNM_CASEFOLD) == 0;
+        if(matches){
             CHAINTYPE *chainptr = (CHAINTYPE *)malloc(sizeof(CHAINTYPE));
             worksect = cursect;
             fFound = TRUE;
@@ -429,8 +435,8 @@
     // that we are interested in.  Then, walk through the linked list
     // looking for any entries that indicate we want to "inherit" entries
     // from another section.  We'll build a new linked list of those
-    // sections that we want to inherit from. Then, we'll tack the 'Default'
-    // section on the end of that.  Once we have the inheritance list, we
+    // sections that we want to inherit from. Then, we'll tack any wildcard matches
+    // and the 'Default' section on the end of that.  Once we have the inheritance list, we
     // need to walk that list backwards, building the list of
     // tuples (keyword/value pairs).
     // Finally, when we are all done, we should have all of the values that
@@ -447,7 +453,7 @@
     i = 0;
     fFound = FALSE;
     while( aWorkstationId[i] && !fFound ){
-        if(find_chain_entry(aWorkstationId[i])){
+        if(find_chain_entry(aWorkstationId[i], FALSE)){
 	    fFound = TRUE;
         }
         i++;
@@ -458,17 +464,33 @@
         curtuple = chain->sect->tuple_list;
         while(curtuple){
             if(strcasecmp(curtuple->keyword,"LIKE") == 0)
-                status = find_chain_entry(curtuple->value);
+                status = find_chain_entry(curtuple->value, FALSE);
 
             curtuple = curtuple->next;
         }
         chain = chain->next;
     }
 
+    for (i=0; aWorkstationId[i]; ++i){
+        if((status = find_chain_entry(aWorkstationId[i], TRUE))){
+            chain = headchain;
+            while(chain){
+                curtuple = chain->sect->tuple_list;
+                while(curtuple){
+                    if(strcasecmp(curtuple->keyword,"LIKE") == 0)
+                        status = find_chain_entry(curtuple->value, FALSE);
+
+                    curtuple = curtuple->next;
+                }
+                chain = chain->next;
+            }
+        }
+    }
+
     //
     // the last entry in the chain is the '[Default]' entry
     //
-    status = find_chain_entry("default");
+    status = find_chain_entry("default", FALSE);
 
 
     curchain = tailchain;

Reply via email to