293:     freeJob(job);

294:     return 1;

295:    }

296:    prog->argv[argc] = NULL;

297:

298:    /* и начало следующей */

299:    job->numProgs++;

300:    job->progs = realloc(job->progs,

301:     sizeof (*job->progs) *

302:      job->numProgs);

303:    prog = job->progs + (job->numProgs - 1);

304:    prog->numRedirections = 0;

305:    prog->redirections = NULL;

306:    prog->freeGlob = 0;

307:    argc = 0;

308:

309:    argvAlloced = 5;

310:    prog->argv = malloc(sizeof(*prog->argv) *

311:     argvAlloced);

312:    prog->argv[0] = ++buf;

313:

314:    src++;

315:    while (*src && isspace(*src)) src++;

316:

317:    if (!*src) {

318:     fprintf(stderr, 'пустая команда в канале ');

319:     return 1;

320:    }

321:    src--; /* инкремент ++ мы сделаем в конце цикла */

322:

323:    break;

324:

325:   case '&': /* фон */

326:    *isBg = 1;

327:   case ';': /* разнообразные команды */

328:    done = 1;

329:    returnCommand = *commandPtr + (src - * commandPtr) + 1;

330:    break;

331:

332:   case '\':

333:    src++;

334:    if (!*src) {

335:     freeJob(job);

336:     fprintf(stderr, 'после \ ожидался символ ');

337:     return 1;

338:    }

339:    if (*src == '*' | | *src == '[' || *src == '] '

340:     || *src == '?')

341:     *buf++ = '\';

342:    /* неудача */

343:   default:

344:    *buf++ = *src;

345:   }

346:

347:   src++;

348:  }

349:

350:  if (*prog->argv[argc]) {

351:   argc++;

352:   globLastArgument(prog, &argc, &argvAlloced);

353:  }

354:  if (!argc) {

355:   freeJob(job);

356:   return 0;

357:  }

358:  prog->argv[argc] = NULL;

359:

360:  if (!returnCommand) {

361:   job->text = malloc(strlen(*commandPtr) + 1);

362:   strcpy(job->text, *commandPtr);

363:  } else {

364:   /*Оставляем любые хвостовые пробелы, хотя и получится это несколько небрежно*/

365:

366:   count = returnCommand - *commandPtr;

367:   job->text = malloc(count + 1);

368:   strncpy(job->text, *commandPtr, count);

369:   job->text[count] = '';

370:  }

371:

372:  *commandPtr = returnCommand;

373:

374:  return 0;

375: }

376:

377: int setupRedirections(struct childProgram * prog) {

378:  int i;

379:  int openfd;

380:  int mode;

381:  struct redirectionSpecifier * redir = prog->redirections;

382:

383:  for (i = 0; i < prog->numRedirections; i++, redir++) {

384:   switch (redir->type) {

385:   case REDIRECT_INPUT:

386:    mode = O_RDONLY;

387:    break;

388:   case REDIRECT_OVERWRITE:

389:    mode = O_RDWR | O_CREAT | O_TRUNC;

390:    break;

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату