+static int native_set_dependon(const TCHAR *service_name, SC_HANDLE service_handle, TCHAR **dependencies, unsigned long *dependencieslen, value_t *value, int type) {\r
+ *dependencieslen = 0;\r
+ if (! value || ! value->string || ! value->string[0]) return 0;\r
+\r
+ TCHAR *string = value->string;\r
+ unsigned long buflen;\r
+ int op = 0;\r
+ switch (string[0]) {\r
+ case _T('+'): op = 1; break;\r
+ case _T('-'): op = -1; break;\r
+ case _T(':'): string++; break;\r
+ }\r
+\r
+ if (op) {\r
+ string++;\r
+ TCHAR *buffer = 0;\r
+ if (get_service_dependencies(service_name, service_handle, &buffer, &buflen, type)) return -1;\r
+ if (buffer) {\r
+ int ret;\r
+ if (op > 0) ret = append_to_dependencies(buffer, buflen, string, dependencies, dependencieslen, type);\r
+ else ret = remove_from_dependencies(buffer, buflen, string, dependencies, dependencieslen, type);\r
+ if (buflen) HeapFree(GetProcessHeap(), 0, buffer);\r
+ return ret;\r
+ }\r
+ else {\r
+ /*\r
+ No existing list.\r
+ We can't remove from an empty list so just treat an add\r
+ operation as setting a new string.\r
+ */\r
+ if (op < 0) return 0;\r
+ op = 0;\r
+ }\r
+ }\r
+\r
+ if (! op) {\r
+ TCHAR *unformatted = 0;\r
+ unsigned long newlen;\r
+ if (unformat_double_null(string, (unsigned long) _tcslen(string), &unformatted, &newlen)) return -1;\r
+\r
+ if (type == DEPENDENCY_GROUPS) {\r
+ /* Prepend group identifier. */\r
+ unsigned long missing = 0;\r
+ TCHAR *canon = unformatted;\r
+ size_t canonlen = 0;\r
+ TCHAR *s;\r
+ for (s = unformatted; *s; s++) {\r
+ if (*s != SC_GROUP_IDENTIFIER) missing++;\r
+ size_t len = _tcslen(s);\r
+ canonlen += len + 1;\r
+ s += len;\r
+ }\r
+\r
+ if (missing) {\r
+ /* Missing identifiers plus double NULL terminator. */\r
+ canonlen += missing + 1;\r
+\r
+ canon = (TCHAR *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, canonlen * sizeof(TCHAR));\r
+ if (! canon) {\r
+ print_message(stderr, NSSM_MESSAGE_OUT_OF_MEMORY, _T("canon"), _T("native_set_dependon"));\r
+ if (unformatted) HeapFree(GetProcessHeap(), 0, unformatted);\r
+ return -1;\r
+ }\r
+\r
+ size_t i = 0;\r
+ for (s = unformatted; *s; s++) {\r
+ if (*s != SC_GROUP_IDENTIFIER) canon[i++] = SC_GROUP_IDENTIFIER;\r
+ size_t len = _tcslen(s);\r
+ memmove(canon + i, s, (len + 1) * sizeof(TCHAR));\r
+ i += len + 1;\r
+ s += len;\r
+ }\r
+\r
+ HeapFree(GetProcessHeap(), 0, unformatted);\r
+ unformatted = canon;\r
+ newlen = (unsigned long) canonlen;\r
+ }\r
+ }\r
+\r
+ *dependencies = unformatted;\r
+ *dependencieslen = newlen;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r