~ubuntu-branches/ubuntu/intrepid/git-core/intrepid-updates

« back to all changes in this revision

Viewing changes to write_or_die.c

  • Committer: Package Import Robot
  • Author(s): Gerrit Pape
  • Date: 2007-04-22 13:31:05 UTC
  • mto: This revision was merged to the branch mainline in revision 20.
  • Revision ID: package-import@ubuntu.com-20070422133105-xg8fnm18r2cxcbg1
Tags: upstream-1.5.1.2
ImportĀ upstreamĀ versionĀ 1.5.1.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#include "cache.h"
2
2
 
 
3
int read_in_full(int fd, void *buf, size_t count)
 
4
{
 
5
        char *p = buf;
 
6
        ssize_t total = 0;
 
7
 
 
8
        while (count > 0) {
 
9
                ssize_t loaded = xread(fd, p, count);
 
10
                if (loaded <= 0)
 
11
                        return total ? total : loaded;
 
12
                count -= loaded;
 
13
                p += loaded;
 
14
                total += loaded;
 
15
        }
 
16
 
 
17
        return total;
 
18
}
 
19
 
 
20
int write_in_full(int fd, const void *buf, size_t count)
 
21
{
 
22
        const char *p = buf;
 
23
        ssize_t total = 0;
 
24
 
 
25
        while (count > 0) {
 
26
                ssize_t written = xwrite(fd, p, count);
 
27
                if (written < 0)
 
28
                        return -1;
 
29
                if (!written) {
 
30
                        errno = ENOSPC;
 
31
                        return -1;
 
32
                }
 
33
                count -= written;
 
34
                p += written;
 
35
                total += written;
 
36
        }
 
37
 
 
38
        return total;
 
39
}
 
40
 
3
41
void write_or_die(int fd, const void *buf, size_t count)
4
42
{
5
 
        const char *p = buf;
6
 
        ssize_t written;
7
 
 
8
 
        while (count > 0) {
9
 
                written = xwrite(fd, p, count);
10
 
                if (written == 0)
11
 
                        die("disk full?");
12
 
                else if (written < 0) {
13
 
                        if (errno == EPIPE)
14
 
                                exit(0);
15
 
                        die("write error (%s)", strerror(errno));
16
 
                }
17
 
                count -= written;
18
 
                p += written;
19
 
        }
 
43
        if (write_in_full(fd, buf, count) < 0) {
 
44
                if (errno == EPIPE)
 
45
                        exit(0);
 
46
                die("write error (%s)", strerror(errno));
 
47
        }
 
48
}
 
49
 
 
50
int write_or_whine_pipe(int fd, const void *buf, size_t count, const char *msg)
 
51
{
 
52
        if (write_in_full(fd, buf, count) < 0) {
 
53
                if (errno == EPIPE)
 
54
                        exit(0);
 
55
                fprintf(stderr, "%s: write error (%s)\n",
 
56
                        msg, strerror(errno));
 
57
                return 0;
 
58
        }
 
59
 
 
60
        return 1;
20
61
}
21
62
 
22
63
int write_or_whine(int fd, const void *buf, size_t count, const char *msg)
23
64
{
24
 
        const char *p = buf;
25
 
        ssize_t written;
26
 
 
27
 
        while (count > 0) {
28
 
                written = xwrite(fd, p, count);
29
 
                if (written == 0) {
30
 
                        fprintf(stderr, "%s: disk full?\n", msg);
31
 
                        return 0;
32
 
                }
33
 
                else if (written < 0) {
34
 
                        if (errno == EPIPE)
35
 
                                exit(0);
36
 
                        fprintf(stderr, "%s: write error (%s)\n",
37
 
                                msg, strerror(errno));
38
 
                        return 0;
39
 
                }
40
 
                count -= written;
41
 
                p += written;
 
65
        if (write_in_full(fd, buf, count) < 0) {
 
66
                fprintf(stderr, "%s: write error (%s)\n",
 
67
                        msg, strerror(errno));
 
68
                return 0;
42
69
        }
43
70
 
44
71
        return 1;