X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=include%2Fshare.h;h=7bdeb5d211786deff767ad5f5b7843be1a2f6486;hb=a09dac63957396890b1085cac0fee92ecc5db87a;hp=f674f31f590719915398d56d464e7684b7ddaf14;hpb=aa08b4413291fabcbd1b1144377d37034ad361de;p=ust.git diff --git a/include/share.h b/include/share.h index f674f31..7bdeb5d 100644 --- a/include/share.h +++ b/include/share.h @@ -1,13 +1,36 @@ +/* Copyright (C) 2009 Pierre-Marc Fournier + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + #ifndef UST_SHARE_H #define UST_SHARE_H +/* write() */ #include + +/* send() */ +#include +#include + #include /* This write is patient because it restarts if it was incomplete. */ -static inline ssize_t patient_write(int fd, const void *buf, size_t count) +static __inline__ ssize_t patient_write(int fd, const void *buf, size_t count) { const char *bufc = (const char *) buf; int result; @@ -31,4 +54,28 @@ static inline ssize_t patient_write(int fd, const void *buf, size_t count) return bufc-(const char *)buf; } +static __inline__ ssize_t patient_send(int fd, const void *buf, size_t count, int flags) +{ + const char *bufc = (const char *) buf; + int result; + + for(;;) { + result = send(fd, bufc, count, flags); + if(result == -1 && errno == EINTR) { + continue; + } + if(result <= 0) { + return result; + } + count -= result; + bufc += result; + + if(count == 0) { + break; + } + } + + return bufc-(const char *)buf; +} + #endif /* UST_SHARE_H */