+
+/* val setm : t -> path -> string option -> value option -> int */
+CAMLprim value
+ocaml_augeas_setm (value tv, value basev, value subv, value valv)
+{
+ CAMLparam4 (tv, basev, subv, valv);
+ augeas_t t = Augeas_t_val (tv);
+ const char *base = String_val (basev);
+ const char *sub = Optstring_val (subv);
+ const char *val = Optstring_val (valv);
+ int r;
+
+ r = aug_setm (t, base, sub, val);
+ if (r == -1)
+ raise_error (t, "Augeas.setm");
+
+ CAMLreturn (Val_int (r));
+}
+
+/* val transform : t -> string -> string -> transform_mode -> unit */
+CAMLprim value
+ocaml_augeas_transform (value tv, value lensv, value filev, value modev)
+{
+ CAMLparam4 (tv, lensv, filev, modev);
+ augeas_t t = Augeas_t_val (tv);
+ const char *lens = String_val (lensv);
+ const char *file = String_val (filev);
+ const int excl = Int_val (modev) == 1 ? 1 : 0;
+
+ if (aug_transform (t, lens, file, excl) == -1)
+ raise_error (t, "Augeas.transform");
+
+ CAMLreturn (Val_unit);
+}
+
+/* val source : t -> path -> path option */
+CAMLprim value
+ocaml_augeas_source (value tv, value pathv)
+{
+#ifdef HAVE_AUG_SOURCE
+ CAMLparam2 (tv, pathv);
+ CAMLlocal2 (optv, v);
+ augeas_t t = Augeas_t_val (tv);
+ const char *path = String_val (pathv);
+ char *file_path;
+ int r;
+
+ r = aug_source (t, path, &file_path);
+ if (r == 0) {
+ if (file_path) { /* Return Some file_path */
+ v = caml_copy_string (file_path);
+ optv = caml_alloc (1, 0);
+ Field (optv, 0) = v;
+ free (file_path);
+ } else /* Return None */
+ optv = Val_int (0);
+ }
+ else /* Error */
+ raise_error (t, "Augeas.source");
+
+ CAMLreturn (optv);
+#else
+ caml_failwith ("Augeas.source: function not implemented");
+#endif
+}