[PATCH 05 of 14 RFC c-hglib:level0] hg_close: close the connection with hg cmd server for the given handle
Iulian Stana
julian.stana at gmail.com
Tue Sep 3 15:30:44 CDT 2013
# HG changeset patch
# User Iulian Stana <julian.stana at gmail.com>
# Date 1378234875 -10800
# Tue Sep 03 22:01:15 2013 +0300
# Node ID 1d20e8ae28ff6b4b39eb527888c3869ab5e98b86
# Parent 3b4648c6815ba9e1c46a7e2d1184a72952c6e537
hg_close: close the connection with hg cmd server for the given handle
The Handle paramater it's pass by address because I want to set the handle
pointer to NULL. It's a defence action. In this way I can test if a handle is
set or not.
diff --git a/client.c b/client.c
--- a/client.c
+++ b/client.c
@@ -149,5 +149,28 @@
return handle;
}
+/*
+ * Close the connection for the given handle.
+ * */
+int hg_close(hg_handle **handle)
+{
+ if(!(*handle)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if(kill((*handle)->childpid, SIGKILL) < 0){
+ return -1;
+ }
+ close((*handle)->p_read);
+ close((*handle)->p_write);
+
+ free_data(*handle);
+ free(*handle);
+ *handle = NULL;
+
+ return 0;
+}
+
#include "client.h"
#include "utils.h"
diff --git a/client.h b/client.h
--- a/client.h
+++ b/client.h
@@ -71,7 +71,19 @@
* */
hg_handle *hg_open(const char *path, char *encoding);
-
+/**
+ * \brief Close the connection for the given handle.
+ *
+ * Erase the handle and free the memory
+ * \param handle The handle of the connection that I want to close
+ * \retval 0 if successful
+ * \retval -1 to indicate an error, with errno set appropriately.
+ *
+ * errno can be:
+ * - EINVAL - Invalid argument ( handle it's set to a null pointer)
+ * - kill(2) command errors
+ * */
+int hg_close(hg_handle **handle);
#endif
More information about the Mercurial-devel
mailing list