+static char *parm_valstr(TALLOC_CTX *ctx, struct parm_struct *parm,
+ struct share_params *share)
+{
+ char *valstr = NULL;
+ int i = 0;
+ void *ptr = parm->ptr;
+
+ if (parm->p_class == P_LOCAL && share->service >= 0) {
+ ptr = lp_local_ptr(share->service, ptr);
+ }
+
+ switch (parm->type) {
+ case P_CHAR:
+ valstr = talloc_asprintf(ctx, "%c", *(char *)ptr);
+ break;
+ case P_STRING:
+ case P_USTRING:
+ valstr = talloc_asprintf(ctx, "%s", *(char **)ptr);
+ break;
+ case P_GSTRING:
+ case P_UGSTRING:
+ valstr = talloc_asprintf(ctx, "%s", (char *)ptr);
+ break;
+ case P_BOOL:
+ valstr = talloc_asprintf(ctx, "%s", BOOLSTR(*(BOOL *)ptr));
+ break;
+ case P_BOOLREV:
+ valstr = talloc_asprintf(ctx, "%s", BOOLSTR(!*(BOOL *)ptr));
+ break;
+ case P_ENUM:
+ for (i = 0; parm->enum_list[i].name; i++) {
+ if (*(int *)ptr == parm->enum_list[i].value)
+ {
+ valstr = talloc_asprintf(ctx, "%s",
+ parm->enum_list[i].name);
+ break;
+ }
+ }
+ break;
+ case P_OCTAL:
+ valstr = talloc_asprintf(ctx, "%s", octal_string(*(int *)ptr));
+ break;
+ case P_LIST:
+ valstr = talloc_strdup(ctx, "");
+ if ((char ***)ptr && *(char ***)ptr) {
+ char **list = *(char ***)ptr;
+ for (; *list; list++) {
+ /* surround strings with whitespace
+ * in double quotes */
+ if (strchr_m(*list, ' '))
+ {
+ valstr = talloc_asprintf_append(
+ valstr, "\"%s\"%s",
+ *list,
+ ((*(list+1))?", ":""));
+ }
+ else {
+ valstr = talloc_asprintf_append(
+ valstr, "%s%s", *list,
+ ((*(list+1))?", ":""));
+ }
+ }
+ }
+ break;
+ case P_INTEGER:
+ valstr = talloc_asprintf(ctx, "%d", *(int *)ptr);
+ break;
+ case P_SEP:
+ break;
+ default:
+ valstr = talloc_asprintf(ctx, "<type unimplemented>\n");
+ break;
+ }
+
+ return valstr;
+}
+
+static int import_process_service(TALLOC_CTX *ctx,