projects
/
musl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix strptime output for %C without %y
[musl]
/
src
/
passwd
/
getgrent_a.c
diff --git
a/src/passwd/getgrent_a.c
b/src/passwd/getgrent_a.c
index
2cb8521
..
7fc389d
100644
(file)
--- a/
src/passwd/getgrent_a.c
+++ b/
src/passwd/getgrent_a.c
@@
-8,15
+8,17
@@
static unsigned atou(char **s)
return x;
}
return x;
}
-
struct group *__getgrent_a(FILE *f, struct group *gr, char **line, size_t *size, char ***mem, size_t *nmem
)
+
int __getgrent_a(FILE *f, struct group *gr, char **line, size_t *size, char ***mem, size_t *nmem, struct group **res
)
{
ssize_t l;
char *s, *mems;
size_t i;
{
ssize_t l;
char *s, *mems;
size_t i;
+ int rv = 0;
int cs;
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
for (;;) {
if ((l=getline(line, size, f)) < 0) {
int cs;
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
for (;;) {
if ((l=getline(line, size, f)) < 0) {
+ rv = ferror(f) ? errno : 0;
free(*line);
*line = 0;
gr = 0;
free(*line);
*line = 0;
gr = 0;
@@
-43,9
+45,11
@@
struct group *__getgrent_a(FILE *f, struct group *gr, char **line, size_t *size,
free(*mem);
*mem = calloc(sizeof(char *), *nmem+1);
if (!*mem) {
free(*mem);
*mem = calloc(sizeof(char *), *nmem+1);
if (!*mem) {
+ rv = errno;
free(*line);
*line = 0;
free(*line);
*line = 0;
- return 0;
+ gr = 0;
+ goto end;
}
if (*mems) {
mem[0][0] = mems;
}
if (*mems) {
mem[0][0] = mems;
@@
-58,5
+62,7
@@
struct group *__getgrent_a(FILE *f, struct group *gr, char **line, size_t *size,
gr->gr_mem = *mem;
end:
pthread_setcancelstate(cs, 0);
gr->gr_mem = *mem;
end:
pthread_setcancelstate(cs, 0);
- return gr;
+ *res = gr;
+ if(rv) errno = rv;
+ return rv;
}
}