/* * Function responsible for generating the ACL information for a given * file. Note, the string is put into buffer malloc'd by this function. * Its the responsibility of the caller to free the buffer. */ static char * get_acl_string(const char *fname, const struct stat64 *statb, int *err_code) { acl_t *aclp; char *acltext; int error; if (S_ISLNK(statb->st_mode)) { return (safe_strdup("-")); } /* * Include trivial acl's */ error = acl_get(fname, 0, &aclp); if (error != 0) { *err_code = WARNING_EXIT; (void) fprintf(stderr, "%s: %s\n", fname, acl_strerror(error)); return (safe_strdup("-")); } else { acltext = acl_totext(aclp, 0); acl_free(aclp); return (acltext); } }
const char *acl_last_serror(void) { char *buf; int error = acl_last_error(); static int __buf_size = 4096; (void) acl_pthread_once(&once_control, thread_buf_init); buf = acl_pthread_getspecific(__errbuf_key); if (buf == NULL) { buf = acl_mymalloc(__buf_size); acl_pthread_setspecific(__errbuf_key, buf); if ((unsigned long) acl_pthread_self() == acl_main_thread_self()) { __main_buf = buf; atexit(main_free_buf); } } return acl_strerror(error, buf, __buf_size); }
const char *acl_last_strerror(char *buffer, int size) { return acl_strerror(acl_last_error(), buffer, size); }
static int __vstream_sys_read(ACL_VSTREAM *stream) { if (stream == NULL) return (-1); if (stream->type == ACL_VSTREAM_TYPE_FILE) { if (ACL_VSTREAM_FILE(stream) == ACL_FILE_INVALID) return (-1); } else if (ACL_VSTREAM_SOCK(stream) == ACL_SOCKET_INVALID) return (-1); AGAIN: if (stream->rw_timeout > 0 && __read_wait(ACL_VSTREAM_SOCK(stream), stream->rw_timeout) < 0) { stream->errnum = acl_last_error(); if (stream->errnum != ACL_ETIMEDOUT) { (void) acl_strerror(stream->errnum, stream->errbuf, sizeof(stream->errbuf)); stream->flag |= ACL_VSTREAM_FLAG_ERR; } else { stream->flag |= ACL_VSTREAM_FLAG_TIMEOUT; ACL_SAFE_STRNCPY(stream->errbuf, "read timeout", sizeof(stream->errbuf)); } return (-1); } acl_set_error(0); if (stream->type == ACL_VSTREAM_TYPE_FILE) { stream->read_cnt = stream->fread_fn(ACL_VSTREAM_FILE(stream), stream->read_buf, (size_t) stream->read_buf_len, stream->rw_timeout, stream, stream->context); if (stream->read_cnt > 0) stream->sys_offset += stream->read_cnt; } else stream->read_cnt = stream->read_fn(ACL_VSTREAM_SOCK(stream), stream->read_buf, (size_t) stream->read_buf_len, stream->rw_timeout, stream, stream->context); if (stream->read_cnt < 0) { stream->errnum = acl_last_error(); if (stream->errnum == ACL_EINTR) { goto AGAIN; } else if (stream->errnum == ACL_ETIMEDOUT) { stream->flag |= ACL_VSTREAM_FLAG_TIMEOUT; ACL_SAFE_STRNCPY(stream->errbuf, "read timeout", sizeof(stream->errbuf)); } else if (stream->errnum != ACL_EWOULDBLOCK && stream->errnum != ACL_EAGAIN) { stream->flag |= ACL_VSTREAM_FLAG_ERR; acl_strerror(stream->errnum, stream->errbuf, sizeof(stream->errbuf)); } /* XXX: should do something where, 2009.12.25 -- zsx */ stream->read_cnt = 0; /* xxx: why? */ return (-1); } else if (stream->read_cnt == 0) { /* closed by peer */ stream->flag = ACL_VSTREAM_FLAG_EOF; stream->errnum = 0; snprintf(stream->errbuf, sizeof(stream->errbuf), "closed by peer(%s)", acl_last_serror()); return (0); } stream->read_ptr = stream->read_buf; stream->flag &= ~ACL_VSTREAM_FLAG_BAD; stream->errnum = 0; stream->errbuf[0] = 0; stream->total_read_cnt += stream->read_cnt; return ((int) stream->read_cnt); }