chiark / gitweb /
fishdescriptor: donate: some bugfixes
authorIan Jackson <ian.jackson@eu.citrix.com>
Thu, 5 Oct 2017 16:21:11 +0000 (17:21 +0100)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Thu, 5 Oct 2017 16:21:11 +0000 (17:21 +0100)
Signed-off-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
fishdescriptor/Makefile
fishdescriptor/donate.c

index 17bb3e777e2270890dfb136138f1f5e2bd1f3339..dd0dfbe3bc92db5e4cb036d93488b4b2083d537a 100644 (file)
@@ -1,4 +1,4 @@
 fishdescriptor-donate.so:      donate.o
 fishdescriptor-donate.so:      donate.o
-       $(CC) -shared -soname $(LIBCANON) -o $@ $< $(LIBS)
+       $(CC) -shared -Wl,-soname $(LIBCANON) -o $@ $< $(LIBS)
 
 donate.o:                      donate.c
 
 donate.o:                      donate.c
index 49e244d9c53b403c522f619ce738fec89e31c28b..6e5dea7808290495b2fd5465b90cda94896a981e 100644 (file)
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-/* return conventions: functions here return 0 on success,
- * or -1 setting errno */
+#include <stdlib.h>
+#include <errno.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
 
 static int fishdescriptor_sendmsg_fds(int carrier,
                                       int nfds, const int fds[]) {
 
 static int fishdescriptor_sendmsg_fds(int carrier,
                                       int nfds, const int fds[]) {
+  /* return convention: like a syscall */
   struct msghdr msg = { 0 };
   struct cmsghdr *cmsg;
   size_t spaceneeded = nfds * sizeof(fds[0]);
   struct msghdr msg = { 0 };
   struct cmsghdr *cmsg;
   size_t spaceneeded = nfds * sizeof(fds[0]);
@@ -52,20 +57,23 @@ static int fishdescriptor_sendmsg_fds(int carrier,
   return 0;
 }
 
   return 0;
 }
 
-static int fishdescriptor_donate(const char *path, const int *fds) {
+int fishdescriptor_donate(const char *path, const int *fds) {
+  /* return convention: returns errno value */
+  /* within function: r is like syscall return, errno value is in errno */
   int r;
   int r;
+  int esave = errno;
   int carrier=-1;
 
   carrier = socket(AF_UNIX, SOCK_STREAM, 0);
   if (carrier < 0) goto out;
 
   struct sockaddr_un suna;
   int carrier=-1;
 
   carrier = socket(AF_UNIX, SOCK_STREAM, 0);
   if (carrier < 0) goto out;
 
   struct sockaddr_un suna;
-  memset(suna,0,&suna);
+  memset(&suna,0,sizeof(suna));
   suna.sun_family = AF_UNIX;
   suna.sun_family = AF_UNIX;
-  if (strlen(path) >= sizeof(suna.sun_path)) { outno = E2BIG; goto out; }
+  if (strlen(path) >= sizeof(suna.sun_path)) { errno = E2BIG; goto out; }
   strcpy(suna.sun_path, path);
 
   strcpy(suna.sun_path, path);
 
-  int r = connect(carrier, &suna, sizeof(suna));
+  r = connect(carrier, (const struct sockaddr*)&suna, sizeof(suna));
   if (r) goto out;
 
   int nfds;
   if (r) goto out;
 
   int nfds;
@@ -77,5 +85,7 @@ static int fishdescriptor_donate(const char *path, const int *fds) {
   r = 0;
  out:
   if (carrier >= 0) close(carrier);
   r = 0;
  out:
   if (carrier >= 0) close(carrier);
+  r = !r ? 0 : !errno ? EIO : errno;
+  esave = errno;
   return r;
 }
   return r;
 }