diff options
author | Tomas Mraz <tm@t8m.info> | 2005-09-21 10:00:58 +0000 |
---|---|---|
committer | Tomas Mraz <tm@t8m.info> | 2005-09-21 10:00:58 +0000 |
commit | be09d6354efcb2571731bdffc47da86f22621ac8 (patch) | |
tree | 82117bfbaadb46495a545ba4f567dc9bddd97c33 /libpam/pam_modutil_ioloop.c | |
parent | 627a0401899af257f0fb711ad54194e14a75c530 (diff) | |
download | pam-be09d6354efcb2571731bdffc47da86f22621ac8.tar.gz pam-be09d6354efcb2571731bdffc47da86f22621ac8.tar.bz2 pam-be09d6354efcb2571731bdffc47da86f22621ac8.zip |
Relevant BUGIDs:
Purpose of commit: new feature
Commit summary:
---------------
Moved functions from pammodutil to libpam.
Diffstat (limited to 'libpam/pam_modutil_ioloop.c')
-rw-r--r-- | libpam/pam_modutil_ioloop.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/libpam/pam_modutil_ioloop.c b/libpam/pam_modutil_ioloop.c new file mode 100644 index 00000000..54ab0e55 --- /dev/null +++ b/libpam/pam_modutil_ioloop.c @@ -0,0 +1,53 @@ +/* + * $Id$ + * + * These functions provides common methods for ensure a complete read or + * write occurs. It handles EINTR and partial read/write returns. + */ + +#include "pam_modutil_private.h" + +#include <unistd.h> +#include <errno.h> + +int +pam_modutil_read(int fd, char *buffer, int count) +{ + int block, offset = 0; + + while (count > 0) { + block = read(fd, &buffer[offset], count); + + if (block < 0) { + if (errno == EINTR) continue; + return block; + } + if (block == 0) return offset; + + offset += block; + count -= block; + } + + return offset; +} + +int +pam_modutil_write(int fd, const char *buffer, int count) +{ + int block, offset = 0; + + while (count > 0) { + block = write(fd, &buffer[offset], count); + + if (block < 0) { + if (errno == EINTR) continue; + return block; + } + if (block == 0) return offset; + + offset += block; + count -= block; + } + + return offset; +} |