blob: 296c34c3a07ed9ac623b2de4b94e6e9fd8e77853 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
/*
* Causes gnu cc 1.14 to coredump. Not sure why.
* An excerpt from PD tar's "list.c" file.
*/
typedef unsigned char u_char;
typedef unsigned short u_short;
typedef unsigned int u_int;
typedef unsigned long u_long;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef struct _physadr { short r[1]; } *physadr;
typedef struct label_t {
int val[13];
} label_t;
typedef struct _quad { long val[2]; } quad;
typedef long daddr_t;
typedef char * caddr_t;
typedef u_long ino_t;
typedef long swblk_t;
typedef long time_t;
typedef short dev_t;
typedef int off_t;
typedef long key_t;
typedef struct fd_set { int fds_bits[1]; } fd_set;
struct stat {
dev_t st_dev;
ino_t st_ino;
unsigned short st_mode;
short st_nlink;
short st_uid;
short st_gid;
dev_t st_rdev;
off_t st_size;
time_t st_atime;
int st_spare1;
time_t st_mtime;
int st_spare2;
time_t st_ctime;
int st_spare3;
long st_blksize;
long st_blocks;
long st_spare4[2];
};
union record {
char charptr[512 ];
struct header {
char name[100 ];
char mode[8];
char uid[8];
char gid[8];
char size[12];
char mtime[12];
char chksum[8];
char linkflag;
char linkname[100 ];
char magic[8];
char uname[32 ];
char gname[32 ];
char devmajor[8];
char devminor[8];
} header;
};
long from_oct();
decode_header(header, st, stdp, wantug)
register union record *header;
register struct stat *st;
int *stdp;
int wantug;
{
st->st_mode = from_oct(8, header->header.mode);
st->st_mtime = from_oct(1+12, header->header.mtime);
if (0==strcmp(header->header.magic, "ustar " )) {
*stdp = 1;
if (wantug) {
st->st_uid = finduid(header->header.uname);
st->st_gid = findgid(header->header.gname);
}
switch (header->header.linkflag)
case '4' : case '3' :
st->st_rdev = ((dev_t)(((from_oct(8, header->header.devmajor))<<8) | (
from_oct(8, header->header.devminor)))) ;
} else {
*stdp = 0;
st->st_uid = from_oct(8, header->header.uid);
st->st_gid = from_oct(8, header->header.gid);
st->st_rdev = 0;
}
}
main(){
printf("Test passed (if it compiled at all)\n");
}
long from_oct(x)
char *x;
{
return 0;
}
int finduid(x) char *x;
{ return 0; }
int findgid(x) char *x;
{ return 0; }
|