50
54
static void movecontrolfiles(const char *thing) {
54
58
sprintf(buf, "mv %s/* . && rmdir %s", thing, thing);
57
execlp("sh", "sh", "-c", buf, NULL);
58
ohshite(_("failed to exec sh -c mv foo/* &c"));
61
command_shell(buf, _("shell command to move files"));
60
subproc_wait_check(c1, "sh -c mv foo/* &c", 0);
63
subproc_wait_check(pid, _("shell command to move files"), 0);
63
66
static void DPKG_ATTR_NORET
64
readfail(FILE *a, const char *filename, const char *what)
67
read_fail(int rc, const char *filename, const char *what)
70
ohshit(_("unexpected end of file in %s in %.255s"),what,filename);
67
72
ohshite(_("error reading %s from file %.255s"), what, filename);
69
ohshit(_("unexpected end of file in %s in %.255s"),what,filename);
76
read_line(int fd, char *buf, size_t min_size, size_t max_size)
78
ssize_t line_size = 0;
81
while (line_size < (ssize_t)max_size) {
85
r = fd_read(fd, buf + line_size, n);
89
nl = strchr(buf + line_size, '\n');
74
parseheaderlength(const char *inh, size_t len,
75
const char *fn, const char *what)
81
if (memchr(inh,0,len))
82
ohshit(_("file `%.250s' is corrupt - %.250s length contains nulls"),fn,what);
83
assert(sizeof(lintbuf) > len);
84
memcpy(lintbuf,inh,len);
86
*strchr(lintbuf, ' ') = '\0';
87
r = strtol(lintbuf, &endp, 10);
89
ohshit(_("file `%.250s' is corrupt - negative member length %zi"), fn, r);
91
ohshit(_("file `%.250s' is corrupt - bad digit (code %d) in %s"),fn,*endp,what);
98
#if defined(__GLIBC__) && (__GLIBC__ == 2) && (__GLIBC_MINOR__ > 0)
99
/* XXX: Glibc 2.1 and some versions of Linux want to make fflush()
100
* move the current fpos. Remove this code some time. */
103
if (fgetpos(f, &fpos))
104
ohshit(_("failed getting the current file position"));
106
if (fsetpos(f, &fpos))
107
ohshit(_("failed setting the current file position"));
113
void extracthalf(const char *debar, const char *directory,
114
const char *taroption, int admininfo) {
100
buf[line_size] = '\0';
105
extracthalf(const char *debar, const char *dir, const char *taroption,
115
108
char versionbuf[40];
116
109
float versionnum;
117
size_t ctrllennum, memberlen= 0;
110
off_t ctrllennum, memberlen = 0;
119
113
pid_t c1=0,c2,c3;
120
114
int p1[2], p2[2];
122
116
struct stat stab;
125
119
bool oldformat, header_done;
126
120
struct compressor *decompressor = &compressor_gzip;
128
ar= fopen(debar,"r"); if (!ar) ohshite(_("failed to read archive `%.255s'"),debar);
129
if (fstat(fileno(ar),&stab)) ohshite(_("failed to fstat archive"));
130
if (!fgets(versionbuf,sizeof(versionbuf),ar)) readfail(ar,debar,_("version number"));
122
arfd = open(debar, O_RDONLY);
124
ohshite(_("failed to read archive `%.255s'"), debar);
125
if (fstat(arfd, &stab))
126
ohshite(_("failed to fstat archive"));
128
r = read_line(arfd, versionbuf, strlen(DPKG_AR_MAGIC), sizeof(versionbuf));
130
read_fail(r, debar, _("archive magic version number"));
132
132
if (!strcmp(versionbuf, DPKG_AR_MAGIC)) {
133
133
oldformat = false;
138
138
struct ar_hdr arh;
140
if (fread(&arh,1,sizeof(arh),ar) != sizeof(arh))
141
readfail(ar,debar,_("between members"));
140
r = fd_read(arfd, &arh, sizeof(arh));
141
if (r != sizeof(arh))
142
read_fail(r, debar, _("archive member header"));
143
144
dpkg_ar_normalize_name(&arh);
145
146
if (memcmp(arh.ar_fmag,ARFMAG,sizeof(arh.ar_fmag)))
146
ohshit(_("file `%.250s' is corrupt - bad magic at end of first header"),debar);
147
memberlen= parseheaderlength(arh.ar_size,sizeof(arh.ar_size),
148
debar, _("member length"));
147
ohshit(_("file '%.250s' is corrupt - bad archive header magic"), debar);
148
memberlen = dpkg_ar_member_get_size(debar, &arh);
149
149
if (!header_done) {
153
153
if (strncmp(arh.ar_name, DEBMAGIC, sizeof(arh.ar_name)) != 0)
154
154
ohshit(_("file `%.250s' is not a debian binary archive (try dpkg-split?)"),debar);
155
155
infobuf= m_malloc(memberlen+1);
156
if (fread(infobuf,1, memberlen + (memberlen&1), ar) != memberlen + (memberlen&1))
157
readfail(ar,debar,_("header info member"));
156
r = fd_read(arfd, infobuf, memberlen + (memberlen & 1));
157
if (r != (memberlen + (memberlen & 1)))
158
read_fail(r, debar, _("archive information header member"));
158
159
infobuf[memberlen] = '\0';
159
160
cur= strchr(infobuf,'\n');
160
161
if (!cur) ohshit(_("archive has no newlines in header"));
191
192
if (adminmember == -1 || decompressor == NULL)
192
ohshit(_("file `%.250s' contains ununderstood data member %.*s, giving up"),
193
ohshit(_("archive '%.250s' contains not understood data member %.*s, giving up"),
193
194
debar, (int)sizeof(arh.ar_name), arh.ar_name);
195
196
if (adminmember == 1) {
196
197
if (ctrllennum != 0)
197
ohshit(_("file `%.250s' contains two control members, giving up"), debar);
198
ohshit(_("archive '%.250s' contains two control members, giving up"),
198
200
ctrllennum= memberlen;
200
202
if (!adminmember != !admininfo) {
201
stream_null_copy(ar, memberlen + (memberlen&1),_("skipped member data from %s"), debar);
203
fd_null_copy(arfd, memberlen + (memberlen & 1),
204
_("skipped archive member data from %s"), debar);
203
break; /* Yes ! - found it. */
206
/* Yes! - found it. */
208
212
if (admininfo >= 2) {
209
213
printf(_(" new debian package, version %s.\n"
210
" size %ld bytes: control archive= %zi bytes.\n"),
211
versionbuf, (long)stab.st_size, ctrllennum);
214
" size %jd bytes: control archive= %jd bytes.\n"),
215
versionbuf, (intmax_t)stab.st_size, (intmax_t)ctrllennum);
212
216
m_output(stdout, _("<standard output>"));
214
218
} else if (!strncmp(versionbuf,"0.93",4) &&
221
225
l = strlen(versionbuf);
222
226
if (l && versionbuf[l - 1] == '\n')
223
227
versionbuf[l - 1] = '\0';
224
if (!fgets(ctrllenbuf,sizeof(ctrllenbuf),ar))
225
readfail(ar, debar, _("control information length"));
226
if (sscanf(ctrllenbuf,"%zi%c%d",&ctrllennum,&nlc,&dummy) !=2 || nlc != '\n')
227
ohshit(_("archive has malformatted control length `%s'"), ctrllenbuf);
229
r = read_line(arfd, ctrllenbuf, 1, sizeof(ctrllenbuf));
231
read_fail(r, debar, _("archive control member size"));
232
if (sscanf(ctrllenbuf, "%jd%c%d", &ctrllennum, &nlc, &dummy) != 2 ||
234
ohshit(_("archive has malformatted control member size '%s'"), ctrllenbuf);
230
237
memberlen = ctrllennum;
232
239
memberlen = stab.st_size - ctrllennum - strlen(ctrllenbuf) - l;
233
stream_null_copy(ar, ctrllennum, _("skipped control area from %s"), debar);
240
fd_null_copy(arfd, ctrllennum,
241
_("skipped archive control member data from %s"), debar);
236
244
if (admininfo >= 2) {
237
245
printf(_(" old debian package, version %s.\n"
238
" size %ld bytes: control archive= %zi, main archive= %ld.\n"),
239
versionbuf, (long)stab.st_size, ctrllennum,
240
(long) (stab.st_size - ctrllennum - strlen(ctrllenbuf) - l));
246
" size %jd bytes: control archive= %jd, main archive= %jd.\n"),
247
versionbuf, (intmax_t)stab.st_size, (intmax_t)ctrllennum,
248
(intmax_t)(stab.st_size - ctrllennum - strlen(ctrllenbuf) - l));
241
249
m_output(stdout, _("<standard output>"));
245
252
if (!strncmp(versionbuf,"!<arch>",7)) {
247
254
_("dpkg-deb: file looks like it might be an archive which has been\n"
324
static void controlextractvextract(int admin,
325
const char *taroptions,
326
const char *const *argv) {
327
const char *debar, *directory;
331
controlextractvextract(int admin, const char *taroptions,
332
const char *const *argv)
334
const char *debar, *dir;
329
336
if (!(debar= *argv++))
330
337
badusage(_("--%s needs a .deb filename argument"),cipaction->olong);
331
if (!(directory= *argv++)) {
332
if (admin) directory= EXTRACTCONTROLDIR;
341
dir = EXTRACTCONTROLDIR;
333
342
else ohshit(_("--%s needs a target directory.\n"
334
343
"Perhaps you should be using dpkg --install ?"),cipaction->olong);
335
344
} else if (*argv) {
336
345
badusage(_("--%s takes at most two arguments (.deb and directory)"),cipaction->olong);
338
extracthalf(debar, directory, taroptions, admin);
347
extracthalf(debar, dir, taroptions, admin);
341
void do_fsystarfile(const char *const *argv) {
353
do_fsystarfile(const char *const *argv)
342
355
const char *debar;
344
357
if (!(debar= *argv++))
345
358
badusage(_("--%s needs a .deb filename argument"),cipaction->olong);
347
360
badusage(_("--%s takes only one argument (.deb filename)"),cipaction->olong);
348
361
extracthalf(debar, NULL, NULL, 0);
351
void do_control(const char *const *argv) { controlextractvextract(1, "x", argv); }
352
void do_extract(const char *const *argv) { controlextractvextract(0, "xp", argv); }
353
void do_vextract(const char *const *argv) { controlextractvextract(0, "xpv", argv); }
367
do_control(const char *const *argv)
369
return controlextractvextract(1, "x", argv);
373
do_extract(const char *const *argv)
375
return controlextractvextract(0, "xp", argv);
379
do_vextract(const char *const *argv)
381
return controlextractvextract(0, "xpv", argv);