refs.c: make sure log_ref_setup returns a meaningful errno
Making errno when returning from log_ref_setup() meaningful, Signed-off-by: Ronnie Sahlberg <sahlberg@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com> Acked-by: Michael Haggerty <mhagger@alum.mit.edu>
This commit is contained in:

committed by
Junio C Hamano

parent
60bca085c8
commit
bd3b02daec
27
refs.c
27
refs.c
@ -2751,6 +2751,7 @@ static int copy_msg(char *buf, const char *msg)
|
|||||||
return cp - buf;
|
return cp - buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This function must set a meaningful errno on failure */
|
||||||
int log_ref_setup(const char *refname, char *logfile, int bufsize)
|
int log_ref_setup(const char *refname, char *logfile, int bufsize)
|
||||||
{
|
{
|
||||||
int logfd, oflags = O_APPEND | O_WRONLY;
|
int logfd, oflags = O_APPEND | O_WRONLY;
|
||||||
@ -2761,9 +2762,12 @@ int log_ref_setup(const char *refname, char *logfile, int bufsize)
|
|||||||
starts_with(refname, "refs/remotes/") ||
|
starts_with(refname, "refs/remotes/") ||
|
||||||
starts_with(refname, "refs/notes/") ||
|
starts_with(refname, "refs/notes/") ||
|
||||||
!strcmp(refname, "HEAD"))) {
|
!strcmp(refname, "HEAD"))) {
|
||||||
if (safe_create_leading_directories(logfile) < 0)
|
if (safe_create_leading_directories(logfile) < 0) {
|
||||||
return error("unable to create directory for %s",
|
int save_errno = errno;
|
||||||
logfile);
|
error("unable to create directory for %s", logfile);
|
||||||
|
errno = save_errno;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
oflags |= O_CREAT;
|
oflags |= O_CREAT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2774,15 +2778,22 @@ int log_ref_setup(const char *refname, char *logfile, int bufsize)
|
|||||||
|
|
||||||
if ((oflags & O_CREAT) && errno == EISDIR) {
|
if ((oflags & O_CREAT) && errno == EISDIR) {
|
||||||
if (remove_empty_directories(logfile)) {
|
if (remove_empty_directories(logfile)) {
|
||||||
return error("There are still logs under '%s'",
|
int save_errno = errno;
|
||||||
logfile);
|
error("There are still logs under '%s'",
|
||||||
|
logfile);
|
||||||
|
errno = save_errno;
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
logfd = open(logfile, oflags, 0666);
|
logfd = open(logfile, oflags, 0666);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (logfd < 0)
|
if (logfd < 0) {
|
||||||
return error("Unable to append to %s: %s",
|
int save_errno = errno;
|
||||||
logfile, strerror(errno));
|
error("Unable to append to %s: %s", logfile,
|
||||||
|
strerror(errno));
|
||||||
|
errno = save_errno;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
adjust_shared_perm(logfile);
|
adjust_shared_perm(logfile);
|
||||||
|
4
refs.h
4
refs.h
@ -158,7 +158,9 @@ extern void unlock_ref(struct ref_lock *lock);
|
|||||||
/** Writes sha1 into the ref specified by the lock. **/
|
/** Writes sha1 into the ref specified by the lock. **/
|
||||||
extern int write_ref_sha1(struct ref_lock *lock, const unsigned char *sha1, const char *msg);
|
extern int write_ref_sha1(struct ref_lock *lock, const unsigned char *sha1, const char *msg);
|
||||||
|
|
||||||
/** Setup reflog before using. **/
|
/*
|
||||||
|
* Setup reflog before using. Set errno to something meaningful on failure.
|
||||||
|
*/
|
||||||
int log_ref_setup(const char *refname, char *logfile, int bufsize);
|
int log_ref_setup(const char *refname, char *logfile, int bufsize);
|
||||||
|
|
||||||
/** Reads log for the value of ref during at_time. **/
|
/** Reads log for the value of ref during at_time. **/
|
||||||
|
Reference in New Issue
Block a user