Index: uspace/lib/sif/src/sif.c
===================================================================
--- uspace/lib/sif/src/sif.c	(revision 7ab7075f91a1cf7c0f9d40646b67da033bfd2505)
+++ uspace/lib/sif/src/sif.c	(revision 0abc2aea144199fee5fb2b5b1ffcf9f0ac6528ce)
@@ -191,4 +191,10 @@
 		return ENOMEM;
 
+	sess->fname = str_dup(fname);
+	if (sess->fname == NULL) {
+		rc = ENOMEM;
+		goto error;
+	}
+
 	root = sif_node_new(NULL);
 	if (root == NULL) {
@@ -227,4 +233,6 @@
 		sif_trans_abort(trans);
 	sif_node_delete(root);
+	if (sess->fname != NULL)
+		free(sess->fname);
 	free(sess);
 	return rc;
@@ -249,5 +257,11 @@
 		return ENOMEM;
 
-	f = fopen(fname, "r+");
+	sess->fname = str_dup(fname);
+	if (sess->fname == NULL) {
+		rc = ENOMEM;
+		goto error;
+	}
+
+	f = fopen(fname, "r");
 	if (f == NULL) {
 		rc = EIO;
@@ -272,4 +286,6 @@
 error:
 	sif_node_delete(root);
+	if (sess->fname != NULL)
+		free(sess->fname);
 	free(sess);
 	return rc;
@@ -290,4 +306,7 @@
 	}
 
+	if (sess->fname != NULL)
+		free(sess->fname);
+	free(sess);
 	return EOK;
 }
@@ -394,9 +413,19 @@
 	errno_t rc;
 
-	rewind(trans->sess->f);
+	(void) fclose(trans->sess->f);
+
+	trans->sess->f = fopen(trans->sess->fname, "w");
+	if (trans->sess->f == NULL)
+		return EIO;
 
 	rc = sif_export_node(trans->sess->root, trans->sess->f);
 	if (rc != EOK)
 		return rc;
+
+	if (fputc('\n', trans->sess->f) == EOF)
+		return EIO;
+
+	if (fflush(trans->sess->f) == EOF)
+		return EIO;
 
 	free(trans);
