|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T f
Length: 5169 (0x1431) Types: TextFile Names: »file_utils.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/euug-87hel/sec1/elm/src/file_utils.c«
/** file_utils.c **/ /** File oriented utility routines for ELM (C) Copyright 1986 Dave Taylor **/ #include "headers.h" #include <sys/types.h> #include <sys/stat.h> #include <ctype.h> #include <errno.h> #ifdef BSD # undef tolower #endif #include <signal.h> #include <errno.h> #ifdef BSD # include <sys/wait.h> #endif extern int errno; /* system error number */ char *error_name(), *error_description(), *strcpy(), *getlogin(); long bytes(name) char *name; { /** return the number of bytes in the specified file. This is to check to see if new mail has arrived.... **/ int ok = 1; extern int errno; /* system error number! */ struct stat buffer; if (stat(name, &buffer) != 0) if (errno != 2) { dprint2(1,"Error: errno %s on fstat of file %s (bytes)\n", error_name(errno), name); Write_to_screen("\n\rError attempting fstat on file %s!\n\r", 1, name); Write_to_screen("** %s - %s **\n\r", 2, error_name(errno), error_description(errno)); emergency_exit(); } else ok = 0; return(ok ? (long) buffer.st_size : 0L); } int can_access(file, mode) char *file; int mode; { /** returns ZERO iff user can access file or "errno" otherwise **/ int the_stat = 0, pid, w; void _exit(), exit(); #ifdef BSD union wait status; #else int status; #endif register int (*istat)(), (*qstat)(); #ifdef NO_VM /* machine without virtual memory!! */ if ((pid = fork()) == 0) { #else if ((pid = vfork()) == 0) { #endif setgid(groupid); setuid(userid); /** back to normal userid **/ errno = 0; if (access(file, mode) == 0) _exit(0); else _exit(errno != 0? errno : 1); /* never return zero! */ _exit(127); } istat = signal(SIGINT, SIG_IGN); qstat = signal(SIGQUIT, SIG_IGN); while ((w = wait(&status)) != pid && w != -1) ; #ifdef BSD the_stat = status.w_retcode; #else the_stat = status; #endif signal(SIGINT, istat); signal(SIGQUIT, qstat); return(the_stat); } int can_open(file, mode) char *file, *mode; { /** Returns 0 iff user can open the file. This is not the same as can_access - it's used for when the file might not exist... **/ FILE *fd; int the_stat = 0, pid, w; void _exit(), exit(); #ifdef BSD union wait status; #else int status; #endif register int (*istat)(), (*qstat)(); #ifdef NO_VM /* machine without virtual memory!! */ if ((pid = fork()) == 0) { #else if ((pid = vfork()) == 0) { #endif setgid(groupid); setuid(userid); /** back to normal userid **/ errno = 0; if ((fd = fopen(file, mode)) == NULL) _exit(errno); else { fclose(fd); /* don't just LEAVE it! */ _exit(0); } _exit(127); } istat = signal(SIGINT, SIG_IGN); qstat = signal(SIGQUIT, SIG_IGN); while ((w = wait(&status)) != pid && w != -1) ; #ifdef BSD the_stat = status.w_retcode; #else the_stat = status; #endif signal(SIGINT, istat); signal(SIGQUIT, qstat); return(the_stat); } int copy(from, to) char *from, *to; { /** this routine copies a specified file to the destination specified. Non-zero return code indicates that something dreadful happened! **/ FILE *from_file, *to_file; char buffer[VERY_LONG_STRING]; if ((from_file = fopen(from, "r")) == NULL) { dprint1(1,"Error: could not open %s for reading (copy)\n", from); error1("could not open file %s", from); return(1); } if ((to_file = fopen(to, "w")) == NULL) { dprint1(1,"Error: could not open %s for writing (copy)\n", to); error1("could not open file %s", to); return(1); } while (fgets(buffer, VERY_LONG_STRING, from_file) != NULL) fputs(buffer, to_file); fclose(from_file); fclose(to_file); return(0); } int append(fd, filename) FILE *fd; char *filename; { /** This routine appends the specified file to the already open file descriptor.. Returns non-zero if fails. **/ FILE *my_fd; char buffer[VERY_LONG_STRING]; if ((my_fd = fopen(filename, "r")) == NULL) { dprint1(1,"Error: could not open %s for reading (append)\n", filename); return(1); } while (fgets(buffer, VERY_LONG_STRING, my_fd) != NULL) fputs(buffer, fd); fclose(my_fd); return(0); } check_mailfile_size() { /** Check to ensure we have mail. Only used with the '-z' starting option. **/ char filename[SLEN], *getlogin(); struct stat buffer; strcpy(username,getlogin()); if (strlen(username) == 0) cuserid(username); sprintf(filename,"%s%s", mailhome, username); if (stat(filename, &buffer) == -1) { printf(" You have no mail.\n"); exit(0); } else if (buffer.st_size < 2) { /* maybe one byte??? */ printf("You have no mail to read.\n"); exit(0); } } create_readmsg_file() { /** Creates the file ".current" in the users home directory for use with the "readmsg" program. **/ FILE *fd; char buffer[SLEN]; sprintf(buffer,"%s/%s", home, readmsg_file); if ((fd = fopen (buffer, "w")) == NULL) { dprint3(1,"Error: couldn't create file %s - error %s (%s)\n", buffer, error_name(errno), "create_readmsg_file"); return; /* no error to user */ } fprintf(fd, "%d\n", header_table[current-1].index_number); fclose(fd); }