Contents of /trunk/hal/patches/hal-0.5.7.1-indirection-fix.patch
Parent Directory | Revision Log
Revision 144 -
(show annotations)
(download)
Tue May 8 20:06:05 2007 UTC (17 years, 5 months ago) by niro
File size: 4548 byte(s)
Tue May 8 20:06:05 2007 UTC (17 years, 5 months ago) by niro
File size: 4548 byte(s)
-import
1 | diff -uNr hal-0.5.7.orig/hald/device_info.c hal-0.5.7/hald/device_info.c |
2 | --- hal-0.5.7.orig/hald/device_info.c 2006-01-21 07:36:51.000000000 +0100 |
3 | +++ hal-0.5.7/hald/device_info.c 2006-10-26 23:00:26.000000000 +0200 |
4 | @@ -1114,56 +1114,22 @@ |
5 | pc->merge_type, pc->merge_type)); |
6 | break; |
7 | } |
8 | - } else if (pc->curelem == CURELEM_APPEND && pc->match_ok && |
9 | + } else if ((pc->curelem == CURELEM_APPEND || pc->curelem == CURELEM_PREPEND) && pc->match_ok && |
10 | (hal_device_property_get_type (pc->device, pc->merge_key) == HAL_PROPERTY_TYPE_STRING || |
11 | hal_device_property_get_type (pc->device, pc->merge_key) == HAL_PROPERTY_TYPE_STRLIST || |
12 | hal_device_property_get_type (pc->device, pc->merge_key) == HAL_PROPERTY_TYPE_INVALID)) { |
13 | char buf[256]; |
14 | char buf2[256]; |
15 | |
16 | - /* As soon as we are appending, we have matched the device... */ |
17 | + /* As soon as we are appending/prepending, we have matched the device... */ |
18 | pc->device_matched = TRUE; |
19 | |
20 | if (pc->merge_type == MERGE_TYPE_STRLIST) { |
21 | - hal_device_property_strlist_append (pc->device, pc->merge_key, pc->cdata_buf); |
22 | - } else { |
23 | - const char *existing_string; |
24 | - |
25 | - switch (pc->merge_type) { |
26 | - case MERGE_TYPE_STRING: |
27 | - strncpy (buf, pc->cdata_buf, sizeof (buf)); |
28 | - break; |
29 | - |
30 | - case MERGE_TYPE_COPY_PROPERTY: |
31 | - hal_device_property_get_as_string (pc->device, pc->cdata_buf, buf, sizeof (buf)); |
32 | - break; |
33 | - |
34 | - default: |
35 | - HAL_ERROR (("Unknown merge_type=%d='%c'", pc->merge_type, pc->merge_type)); |
36 | - break; |
37 | - } |
38 | - |
39 | - existing_string = hal_device_property_get_string (pc->device, pc->merge_key); |
40 | - if (existing_string != NULL) { |
41 | - strncpy (buf2, existing_string, sizeof (buf2)); |
42 | - strncat (buf2, buf, sizeof (buf2) - strlen(buf2)); |
43 | + if (pc->curelem == CURELEM_APPEND){ |
44 | + hal_device_property_strlist_append (pc->device, pc->merge_key, pc->cdata_buf); |
45 | } else { |
46 | - strncpy (buf2, buf, sizeof (buf2)); |
47 | + hal_device_property_strlist_prepend (pc->device, pc->merge_key, pc->cdata_buf); |
48 | } |
49 | - hal_device_property_set_string (pc->device, pc->merge_key, buf2); |
50 | - } |
51 | - } else if (pc->curelem == CURELEM_PREPEND && pc->match_ok && |
52 | - (hal_device_property_get_type (pc->device, pc->merge_key) == HAL_PROPERTY_TYPE_STRING || |
53 | - hal_device_property_get_type (pc->device, pc->merge_key) == HAL_PROPERTY_TYPE_STRLIST || |
54 | - hal_device_property_get_type (pc->device, pc->merge_key) == HAL_PROPERTY_TYPE_INVALID)) { |
55 | - char buf[256]; |
56 | - char buf2[256]; |
57 | - |
58 | - /* As soon as we are prepending, we have matched the device... */ |
59 | - pc->device_matched = TRUE; |
60 | - |
61 | - if (pc->merge_type == MERGE_TYPE_STRLIST) { |
62 | - hal_device_property_strlist_prepend (pc->device, pc->merge_key, pc->cdata_buf); |
63 | } else { |
64 | const char *existing_string; |
65 | |
66 | @@ -1173,8 +1139,34 @@ |
67 | break; |
68 | |
69 | case MERGE_TYPE_COPY_PROPERTY: |
70 | - hal_device_property_get_as_string (pc->device, pc->cdata_buf, buf, sizeof (buf)); |
71 | + { |
72 | + char udi_to_merge_from[256]; |
73 | + char prop_to_merge[256]; |
74 | + |
75 | + /* Resolve key paths like 'someudi/foo/bar/baz:prop.name' |
76 | + * '@prop.here.is.an.udi:with.prop.name' |
77 | + */ |
78 | + if (!resolve_udiprop_path (pc->cdata_buf, |
79 | + pc->device->udi, |
80 | + udi_to_merge_from, sizeof (udi_to_merge_from), |
81 | + prop_to_merge, sizeof (prop_to_merge))) { |
82 | + HAL_ERROR (("Could not resolve keypath '%s' on udi '%s'", pc->cdata_buf, pc->device->udi)); |
83 | + } else { |
84 | + HalDevice *d; |
85 | + |
86 | + d = hal_device_store_find (hald_get_gdl (), udi_to_merge_from); |
87 | + if (d == NULL) { |
88 | + d = hal_device_store_find (hald_get_tdl (), udi_to_merge_from); |
89 | + } |
90 | + if (d == NULL) { |
91 | + HAL_ERROR (("Could not find device with udi '%s'", udi_to_merge_from)); |
92 | + } else { |
93 | + hal_device_property_get_as_string (d, prop_to_merge, buf, sizeof (buf)); |
94 | + } |
95 | + } |
96 | + |
97 | break; |
98 | + } |
99 | |
100 | default: |
101 | HAL_ERROR (("Unknown merge_type=%d='%c'", pc->merge_type, pc->merge_type)); |
102 | @@ -1183,8 +1175,13 @@ |
103 | |
104 | existing_string = hal_device_property_get_string (pc->device, pc->merge_key); |
105 | if (existing_string != NULL) { |
106 | - strncpy (buf2, buf, sizeof (buf2)); |
107 | - strncat (buf2, existing_string, sizeof (buf2) - strlen(buf2)); |
108 | + if (pc->curelem == CURELEM_APPEND){ |
109 | + strncpy (buf2, existing_string, sizeof (buf2)); |
110 | + strncat (buf2, buf, sizeof (buf2) - strlen(buf2)); |
111 | + } else { |
112 | + strncpy (buf2, buf, sizeof (buf2)); |
113 | + strncat (buf2, existing_string, sizeof (buf2) - strlen(buf2)); |
114 | + } |
115 | } else { |
116 | strncpy (buf2, buf, sizeof (buf2)); |
117 | } |