Improve error handling when writing

master
Michael Spang 13 years ago
parent 0d42df6a85
commit d37c8beac5
  1. 3
      src/dmaster.c
  2. 20
      src/homedir.c
  3. 4
      src/op-adduser.c
  4. 7
      src/op-mail.c
  5. 6
      src/util.c
  6. 2
      src/util.h

@ -85,7 +85,8 @@ static void setup_pidfile(void) {
pidlen = snprintf(pidbuf, sizeof(pidbuf), "%d\n", getpid());
if (pidlen >= sizeof(pidbuf))
fatal("pid too long");
full_write(fd, pidbuf, pidlen);
if (full_write(fd, pidbuf, pidlen))
fatalpe("write: %s", pidfile);
}
static void setup_daemon(void) {

@ -91,8 +91,8 @@ int ceo_create_home(char *homedir, char *skel, uid_t uid, gid_t gid, char *acces
warnpe("read");
break;
}
if (write(destfd, buf, bytes) < 0) {
warnpe("write");
if (full_write(destfd, buf, bytes)) {
warnpe("write: %s", src);
break;
}
}
@ -131,25 +131,25 @@ int ceo_create_home(char *homedir, char *skel, uid_t uid, gid_t gid, char *acces
closedir(skeldir);
if (email && strlen(email) >0) {
char dest[PATH_MAX];
snprintf(dest, sizeof(dest), "%s/%s", homedir, ".forward");
if (email && *email) {
char dest[PATH_MAX];
snprintf(dest, sizeof(dest), "%s/%s", homedir, ".forward");
int destfd = open(dest, O_WRONLY|O_CREAT|O_EXCL, 0644);
if (write(destfd, email, sizeof(char)*strlen(email)) < 0) {
warnpe ("write");
}
if (full_write(destfd, email, strlen(email)))
warnpe("write: %s", dest);
if (fchown(destfd, uid, gid))
errorpe("chown: %s", dest);
close(destfd);
close(destfd);
}
if (chown(homedir, uid, gid)) {
errorpe("failed to chown %s", homedir);
return -1;
}
umask(mask);
return 0;

@ -272,7 +272,9 @@ void cmd_adduser(void) {
strbuf_grow(&out, ceo__add_user_response__get_packed_size(out_proto));
strbuf_setlen(&out, ceo__add_user_response__pack(out_proto, (uint8_t *)out.buf));
full_write(STDOUT_FILENO, out.buf, out.len);
if (full_write(STDOUT_FILENO, out.buf, out.len))
fatalpe("write: stdout");
ceo__add_user__free_unpacked(in_proto, &protobuf_c_default_allocator);
response_delete(out_proto);

@ -150,7 +150,8 @@ static int32_t update_mail(Ceo__UpdateMail *in, Ceo__UpdateMailResponse *out, ch
struct strbuf file_contents = STRBUF_INIT;
strbuf_addf(&file_contents, "%s\n", in->forward);
full_write(fd, file_contents.buf, file_contents.len);
if (full_write(fd, file_contents.buf, file_contents.len))
response_message(out, errno, "write: %s: %s", path, strerror(errno));
strbuf_release(&file_contents);
@ -190,7 +191,9 @@ void cmd_update_mail(void) {
strbuf_grow(&out, ceo__update_mail_response__get_packed_size(out_proto));
strbuf_setlen(&out, ceo__update_mail_response__pack(out_proto, (uint8_t *)out.buf));
full_write(STDOUT_FILENO, out.buf, out.len);
if (full_write(STDOUT_FILENO, out.buf, out.len))
fatalpe("write: stdout");
ceo__update_mail__free_unpacked(in_proto, &protobuf_c_default_allocator);
response_delete(out_proto);

@ -162,15 +162,17 @@ int spawnv(const char *path, char *const argv[]) {
return status;
}
void full_write(int fd, const void *buf, size_t count) {
int full_write(int fd, const void *buf, size_t count) {
ssize_t total = 0;
while (total < count) {
ssize_t wcount = write(fd, (char *)buf + total, count - total);
if (wcount < 0)
fatalpe("write");
return wcount;
total += wcount;
}
return 0;
}
int spawnvem(const char *path, char *const *argv, char *const *envp, const struct strbuf *output, struct strbuf *input, int cap_stderr) {

@ -29,7 +29,7 @@ int spawnv(const char *path, char *const *argv);
int spawnv_msg(const char *path, char *const *argv, const struct strbuf *output);
int spawnvem(const char *path, char *const *argv, char *const *envp, const struct strbuf *output, struct strbuf *input, int cap_stderr);
int spawnvemu(const char *path, char *const *argv, char *const *envp, const struct strbuf *output, struct strbuf *input, int cap_stderr, char *user);
void full_write(int fd, const void *buf, size_t count);
int full_write(int fd, const void *buf, size_t count);
ssize_t full_read(int fd, void *buf, size_t len);
FILE *fopenat(DIR *d, const char *path, int flags);
void make_env(char **envp, ...);

Loading…
Cancel
Save