00001 #include "c.h"
00002 #include "pgtar.h"
00003 #include <sys/stat.h>
00004
00005
00006
00007
00008
00009 static void
00010 print_val(char *s, uint64 val, unsigned int base, size_t len)
00011 {
00012 int i;
00013
00014 for (i = len; i > 0; i--)
00015 {
00016 int digit = val % base;
00017
00018 s[i - 1] = '0' + digit;
00019 val = val / base;
00020 }
00021 }
00022
00023
00024
00025
00026
00027
00028 int
00029 tarChecksum(char *header)
00030 {
00031 int i,
00032 sum;
00033
00034
00035
00036
00037
00038
00039 sum = 8 * ' ';
00040 for (i = 0; i < 512; i++)
00041 if (i < 148 || i >= 156)
00042 sum += 0xFF & header[i];
00043 return sum;
00044 }
00045
00046
00047
00048
00049
00050
00051
00052 void
00053 tarCreateHeader(char *h, const char *filename, const char *linktarget,
00054 size_t size, mode_t mode, uid_t uid, gid_t gid, time_t mtime)
00055 {
00056
00057
00058
00059
00060
00061
00062 memset(h, 0, 512);
00063
00064
00065 sprintf(&h[0], "%.99s", filename);
00066 if (linktarget != NULL || S_ISDIR(mode))
00067 {
00068
00069
00070
00071
00072
00073 int flen = strlen(filename);
00074
00075 flen = Min(flen, 99);
00076 h[flen] = '/';
00077 h[flen + 1] = '\0';
00078 }
00079
00080
00081 sprintf(&h[100], "%07o ", (int) mode);
00082
00083
00084 sprintf(&h[108], "%07o ", uid);
00085
00086
00087 sprintf(&h[116], "%07o ", gid);
00088
00089
00090 if (linktarget != NULL || S_ISDIR(mode))
00091
00092 print_val(&h[124], 0, 8, 11);
00093 else
00094 print_val(&h[124], size, 8, 11);
00095 sprintf(&h[135], " ");
00096
00097
00098 sprintf(&h[136], "%011o ", (int) mtime);
00099
00100
00101
00102 if (linktarget != NULL)
00103 {
00104
00105 sprintf(&h[156], "2");
00106
00107 sprintf(&h[157], "%.99s", linktarget);
00108 }
00109 else if (S_ISDIR(mode))
00110
00111 sprintf(&h[156], "5");
00112 else
00113
00114 sprintf(&h[156], "0");
00115
00116
00117 sprintf(&h[257], "ustar");
00118
00119
00120 sprintf(&h[263], "00");
00121
00122
00123
00124 sprintf(&h[265], "%.31s", "postgres");
00125
00126
00127
00128 sprintf(&h[297], "%.31s", "postgres");
00129
00130
00131 sprintf(&h[329], "%07o ", 0);
00132
00133
00134 sprintf(&h[337], "%07o ", 0);
00135
00136
00137
00138
00139
00140
00141
00142
00143 sprintf(&h[148], "%06o ", tarChecksum(h));
00144 }