/* * Copyright (c) 2024 DTB * SPDX-License-Identifier: AGPL-3.0-or-later * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Affero General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more * details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see https://www.gnu.org/licenses/. */ #include /* EACCESS, ELOOP, ENAMETOOLONG, ENOENT, ENOTDIR, errno */ #include /* fprintf(3), stderr */ #include /* strerror(3) */ #include /* EX_OSERR, EX_NOPERM, EX_NOINPUT, EX_UNAVAILABLE, * EX_USAGE */ #include /* chdir(2) */ char *program_name = "pschdir"; int main(int argc, char *argv[]){ if (argc < 3) { fprintf(stderr, "Usage: %s directory command [argument...]\n", argv[0] == NULL ? program_name : argv[0]); return EX_USAGE; } if(chdir(argv[1]) != 0){ fprintf(stderr, "%s: %s: %s\n", argv[0], argv[1], strerror(errno)); switch (errno) { case ENAMETOOLONG: return EX_OSERR; case EACCES: return EX_NOPERM; case ENOENT: case ENOTDIR: return EX_NOINPUT; default: return EX_UNAVAILABLE; } } execvp(argv[2], &argv[2]); }