From abfab4882e3fdf68da5e8b6e572c7046a098516c Mon Sep 17 00:00:00 2001 From: Franciszek Malinka Date: Mon, 11 Oct 2021 12:31:37 +0200 Subject: SO lista0 lista1 --- semestr-5/so/lista0/lista_0/1_ls.c | 18 ++++ semestr-5/so/lista0/lista_0/2_cat.c | 26 +++++ semestr-5/so/lista0/lista_0/3_cat.c | 26 +++++ semestr-5/so/lista0/lista_0/include/apue.h | 134 ++++++++++++++++++++++++++ semestr-5/so/lista0/lista_0/libapue/error.c | 113 ++++++++++++++++++++++ semestr-5/so/lista0/lista_0/libapue/libapue.a | Bin 0 -> 18108 bytes 6 files changed, 317 insertions(+) create mode 100644 semestr-5/so/lista0/lista_0/1_ls.c create mode 100644 semestr-5/so/lista0/lista_0/2_cat.c create mode 100644 semestr-5/so/lista0/lista_0/3_cat.c create mode 100644 semestr-5/so/lista0/lista_0/include/apue.h create mode 100644 semestr-5/so/lista0/lista_0/libapue/error.c create mode 100644 semestr-5/so/lista0/lista_0/libapue/libapue.a (limited to 'semestr-5/so/lista0') diff --git a/semestr-5/so/lista0/lista_0/1_ls.c b/semestr-5/so/lista0/lista_0/1_ls.c new file mode 100644 index 0000000..ffbbc54 --- /dev/null +++ b/semestr-5/so/lista0/lista_0/1_ls.c @@ -0,0 +1,18 @@ +#include "apue.h" +#include + +int main(int argc, char *argv[]) { + DIR *dp; + struct dirent *dirp; + + if (argc != 2) + err_quit("usage: ls directory_name"); + + if ((dp = opendir(argv[1])) == NULL) + err_sys("can't open %s", argv[1]); + while ((dirp = readdir(dp)) != NULL) + printf("%s\n", dirp->d_name); + + closedir(dp); + exit(0); +} diff --git a/semestr-5/so/lista0/lista_0/2_cat.c b/semestr-5/so/lista0/lista_0/2_cat.c new file mode 100644 index 0000000..45f4106 --- /dev/null +++ b/semestr-5/so/lista0/lista_0/2_cat.c @@ -0,0 +1,26 @@ +#include "apue.h" +#include +#include + +#define BUFFSIZE 4096 + +int main(int argc, char **argv) { + int n; + char buf[BUFFSIZE]; + + if (argc != 2) { + printf("Usage: %s ", argv[0]); + exit(1); + } + + int fd = open(argv[1], O_RDONLY); + + while ((n = read(fd, buf, BUFFSIZE)) > 0) + if (write(STDOUT_FILENO, buf, n) != n) + err_sys("write error"); + + if (n < 0) + err_sys("read error"); + + exit(0); +} diff --git a/semestr-5/so/lista0/lista_0/3_cat.c b/semestr-5/so/lista0/lista_0/3_cat.c new file mode 100644 index 0000000..45f4106 --- /dev/null +++ b/semestr-5/so/lista0/lista_0/3_cat.c @@ -0,0 +1,26 @@ +#include "apue.h" +#include +#include + +#define BUFFSIZE 4096 + +int main(int argc, char **argv) { + int n; + char buf[BUFFSIZE]; + + if (argc != 2) { + printf("Usage: %s ", argv[0]); + exit(1); + } + + int fd = open(argv[1], O_RDONLY); + + while ((n = read(fd, buf, BUFFSIZE)) > 0) + if (write(STDOUT_FILENO, buf, n) != n) + err_sys("write error"); + + if (n < 0) + err_sys("read error"); + + exit(0); +} diff --git a/semestr-5/so/lista0/lista_0/include/apue.h b/semestr-5/so/lista0/lista_0/include/apue.h new file mode 100644 index 0000000..ac6ca33 --- /dev/null +++ b/semestr-5/so/lista0/lista_0/include/apue.h @@ -0,0 +1,134 @@ +/* + * Our own header, to be included before all standard system headers. + */ +#ifndef _APUE_H +#define _APUE_H + +#define _POSIX_C_SOURCE 200809L + +#if defined(SOLARIS) /* Solaris 10 */ +#define _XOPEN_SOURCE 600 +#else +#define _XOPEN_SOURCE 700 +#endif + +#include +#include /* some systems still require this */ +#include /* for winsize */ +#if defined(MACOS) || !defined(TIOCGWINSZ) +#include +#endif +#if defined(LINUX) +#include +#endif + +#include /* for SIG_ERR */ +#include /* for offsetof */ +#include /* for convenience */ +#include /* for convenience */ +#include /* for convenience */ +#include /* for convenience */ + +#define MAXLINE 4096 /* max line length */ + +/* + * Default file access permissions for new files. + */ +#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) + +/* + * Default permissions for new directories. + */ +#define DIR_MODE (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH) + +typedef void Sigfunc(int); /* for signal handlers */ + +#define min(a, b) ((a) < (b) ? (a) : (b)) +#define max(a, b) ((a) > (b) ? (a) : (b)) + +/* + * Prototypes for our own functions. + */ +char *path_alloc(size_t *); /* {Prog pathalloc} */ +long open_max(void); /* {Prog openmax} */ + +int set_cloexec(int); /* {Prog setfd} */ +void clr_fl(int, int); +void set_fl(int, int); /* {Prog setfl} */ + +void pr_exit(int); /* {Prog prexit} */ + +void pr_mask(const char *); /* {Prog prmask} */ +Sigfunc *signal_intr(int, Sigfunc *); /* {Prog signal_intr_function} */ + +void daemonize(const char *); /* {Prog daemoninit} */ + +void sleep_us(unsigned int); /* {Ex sleepus} */ +ssize_t readn(int, void *, size_t); /* {Prog readn_writen} */ +ssize_t writen(int, const void *, size_t); /* {Prog readn_writen} */ + +int fd_pipe(int *); /* {Prog sock_fdpipe} */ +int recv_fd(int, ssize_t (*func)(int, const void *, + size_t)); /* {Prog recvfd_sockets} */ +int send_fd(int, int); /* {Prog sendfd_sockets} */ +int send_err(int, int, const char *); /* {Prog senderr} */ +int serv_listen(const char *); /* {Prog servlisten_sockets} */ +int serv_accept(int, uid_t *); /* {Prog servaccept_sockets} */ +int cli_conn(const char *); /* {Prog cliconn_sockets} */ +int buf_args(char *, int (*func)(int, char **)); /* {Prog bufargs} */ + +int tty_cbreak(int); /* {Prog raw} */ +int tty_raw(int); /* {Prog raw} */ +int tty_reset(int); /* {Prog raw} */ +void tty_atexit(void); /* {Prog raw} */ +struct termios *tty_termios(void); /* {Prog raw} */ + +int ptym_open(char *, int); /* {Prog ptyopen} */ +int ptys_open(char *); /* {Prog ptyopen} */ +#ifdef TIOCGWINSZ +pid_t pty_fork(int *, char *, int, const struct termios *, + const struct winsize *); /* {Prog ptyfork} */ +#endif + +int lock_reg(int, int, int, off_t, int, off_t); /* {Prog lockreg} */ + +#define read_lock(fd, offset, whence, len) \ + lock_reg((fd), F_SETLK, F_RDLCK, (offset), (whence), (len)) +#define readw_lock(fd, offset, whence, len) \ + lock_reg((fd), F_SETLKW, F_RDLCK, (offset), (whence), (len)) +#define write_lock(fd, offset, whence, len) \ + lock_reg((fd), F_SETLK, F_WRLCK, (offset), (whence), (len)) +#define writew_lock(fd, offset, whence, len) \ + lock_reg((fd), F_SETLKW, F_WRLCK, (offset), (whence), (len)) +#define un_lock(fd, offset, whence, len) \ + lock_reg((fd), F_SETLK, F_UNLCK, (offset), (whence), (len)) + +pid_t lock_test(int, int, off_t, int, off_t); /* {Prog locktest} */ + +#define is_read_lockable(fd, offset, whence, len) \ + (lock_test((fd), F_RDLCK, (offset), (whence), (len)) == 0) +#define is_write_lockable(fd, offset, whence, len) \ + (lock_test((fd), F_WRLCK, (offset), (whence), (len)) == 0) + +void err_msg(const char *, ...); /* {App misc_source} */ +void err_dump(const char *, ...) __attribute__((noreturn)); +void err_quit(const char *, ...) __attribute__((noreturn)); +void err_cont(int, const char *, ...); +void err_exit(int, const char *, ...) __attribute__((noreturn)); +void err_ret(const char *, ...); +void err_sys(const char *, ...) __attribute__((noreturn)); + +void log_msg(const char *, ...); /* {App misc_source} */ +void log_open(const char *, int, int); +void log_quit(const char *, ...) __attribute__((noreturn)); +void log_ret(const char *, ...); +void log_sys(const char *, ...) __attribute__((noreturn)); +void log_exit(int, const char *, ...) __attribute__((noreturn)); + +void TELL_WAIT(void); /* parent/child from {Sec race_conditions} */ +void TELL_PARENT(pid_t); +void TELL_CHILD(pid_t); +void WAIT_PARENT(void); +void WAIT_CHILD(void); + +#endif /* _APUE_H */ diff --git a/semestr-5/so/lista0/lista_0/libapue/error.c b/semestr-5/so/lista0/lista_0/libapue/error.c new file mode 100644 index 0000000..cb9060f --- /dev/null +++ b/semestr-5/so/lista0/lista_0/libapue/error.c @@ -0,0 +1,113 @@ +#include "apue.h" +#include /* for definition of errno */ +#include /* ISO C variable aruments */ + +static void err_doit(int, int, const char *, va_list); + +/* + * Nonfatal error related to a system call. + * Print a message and return. + */ +void err_ret(const char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + err_doit(1, errno, fmt, ap); + va_end(ap); +} + +/* + * Fatal error related to a system call. + * Print a message and terminate. + */ +void err_sys(const char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + err_doit(1, errno, fmt, ap); + va_end(ap); + exit(1); +} + +/* + * Nonfatal error unrelated to a system call. + * Error code passed as explict parameter. + * Print a message and return. + */ +void err_cont(int error, const char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + err_doit(1, error, fmt, ap); + va_end(ap); +} + +/* + * Fatal error unrelated to a system call. + * Error code passed as explict parameter. + * Print a message and terminate. + */ +void err_exit(int error, const char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + err_doit(1, error, fmt, ap); + va_end(ap); + exit(1); +} + +/* + * Fatal error related to a system call. + * Print a message, dump core, and terminate. + */ +void err_dump(const char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + err_doit(1, errno, fmt, ap); + va_end(ap); + abort(); /* dump core and terminate */ + exit(1); /* shouldn't get here */ +} + +/* + * Nonfatal error unrelated to a system call. + * Print a message and return. + */ +void err_msg(const char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + err_doit(0, 0, fmt, ap); + va_end(ap); +} + +/* + * Fatal error unrelated to a system call. + * Print a message and terminate. + */ +void err_quit(const char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + err_doit(0, 0, fmt, ap); + va_end(ap); + exit(1); +} + +/* + * Print a message and return to caller. + * Caller specifies "errnoflag". + */ +static void err_doit(int errnoflag, int error, const char *fmt, va_list ap) { + char buf[MAXLINE]; + + vsnprintf(buf, MAXLINE - 1, fmt, ap); + if (errnoflag) + snprintf(buf + strlen(buf), MAXLINE - strlen(buf) - 1, ": %s", + strerror(error)); + strcat(buf, "\n"); + fflush(stdout); /* in case stdout and stderr are the same */ + fputs(buf, stderr); + fflush(NULL); /* flushes all stdio output streams */ +} diff --git a/semestr-5/so/lista0/lista_0/libapue/libapue.a b/semestr-5/so/lista0/lista_0/libapue/libapue.a new file mode 100644 index 0000000..3a21f79 Binary files /dev/null and b/semestr-5/so/lista0/lista_0/libapue/libapue.a differ -- cgit v1.2.3