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:
Ronnie Sahlberg
2014-06-20 07:42:50 -07:00
committed by Junio C Hamano
parent 60bca085c8
commit bd3b02daec
2 changed files with 22 additions and 9 deletions

27
refs.c
View File

@ -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
View File

@ -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. **/