diff -u chkconfig-1.3.34/alternatives.c chkconfig-1.3.34.patched/alternatives.c
--- chkconfig-1.3.34/alternatives.c	2006-09-07 20:58:40.000000000 +0200
+++ chkconfig-1.3.34.patched/alternatives.c	2007-08-03 18:26:31.000000000 +0200
@@ -376,20 +376,47 @@
 }
 
 static int makeLinks(struct linkSet * l, const char * altDir, int flags) {
-    char * sl;
+    char * sl, * sol;
     struct stat sb;
+    int stlen;
+    
+    stlen = strlen(altDir) + strlen(l->title) + 2;
+
+    sl = alloca(stlen);
+    sol = alloca(stlen+1);
 
-    sl = alloca(strlen(altDir) + strlen(l->title) + 2);
     sprintf(sl, "%s/%s", altDir, l->title);
-    if (lstat(l->facility, &sb)) {
+    
+    if (lstat(l->facility, &sb) || S_ISLNK(sb.st_mode)) {
+
 	    if (FL_TEST(flags)) {
 		    printf(_("would link %s -> %s\n"), l->facility, sl);
 	    } else {
-
-		    if (symlink(sl, l->facility)) {
+	            if (S_ISLNK(sb.st_mode)) {
+		       if ((stlen=readlink(l->facility,sol,stlen)) == -1)
+	                    fprintf(stderr, _("failed to read link %s: %s\n"),
+		                    l->facility, strerror(errno));
+                       sol[stlen]='\0';   
+
+		       if (strcmp(sl,sol)) {
+		          /* symlink is not correct, reset it */
+     	                  if (unlink(l->facility) && errno != ENOENT){
+	                    fprintf(stderr, _("failed to remove link %s: %s\n"),
+		                    l->facility, strerror(errno));
+	                    return 1;
+	                  }			  
+  		          if (symlink(sl, l->facility)) {
 			    fprintf(stderr, _("failed to link %s -> %s: %s\n"),
 				    l->facility, sl, strerror(errno));
 			    return 1;
+			  }    
+		       }
+		    } else {
+  		       if (symlink(sl, l->facility)) {
+			    fprintf(stderr, _("failed to link %s -> %s: %s\n"),
+				    l->facility, sl, strerror(errno));
+			    return 1;
+		       }
 		    }
 	    }
     }
@@ -637,7 +664,7 @@
 	    set.numAlts++;
     }
     
-    if (writeState(&set, altDir, stateDir, 0, flags)) return 2;
+    if (writeState(&set, altDir, stateDir, 1, flags)) return 2;
 
     return 0;
 }
