This is osblock.c in view mode; [Download] [Up]
/* oswin32/osblock.c */ #include <sys/types.h> #include <dos.h> #include <io.h> #include <errno.h> #include <fcntl.h> #include "elvis.h" #ifndef DEFAULT_SESSION # define DEFAULT_SESSION "elvis%d.ses" #endif static int fd = -1; /* file descriptor of the session file */ /* This function creates a new block file, and returns True if successful, * or False if failed because the file was already busy. */ BOOLEAN blkopen(BOOLEAN force, BLK *buf) { char sesname[256]; char *sespath; int len; int i = 1; /* search through SESSIONPATH for a writable directory */ sespath = getenv("SESSIONPATH"); if (!sespath) sespath = getenv("TMP"); if (!sespath) sespath = "C:\\TMP;~;"; do { for (len = 0; *sespath && *sespath != ';'; sespath++) { if (len == 0 && *sespath == '~') { strcpy(sesname, tochar8(o_home)); len = strlen(sesname); } else { sesname[len++] = *sespath; } } if (len == 0) { strcpy(sesname, "."); len = 1; } if (sesname[len - 1] != '\\') sesname[len++] = '\\'; strcpy(sesname + len, "elvis.tmp"); } while ((i = open(sesname, O_RDWR|O_CREAT, 0666)) < 0 && *sespath++); if (i < 0) { msg(MSG_FATAL, "set \\$SESSIONPATH to a writable directory"); } close(i); remove(sesname); /* If no session file was explicitly requested, use the default */ if (!o_session) { if (o_recovering) do { sprintf(sesname + len, DEFAULT_SESSION, i++); /* If the user wants to cancel, then fail */ if (chosengui->poll && (*chosengui->poll)(False)) return False; } while (_access(sesname, 6) == -1 && errno == ENOENT); else do { sprintf(sesname + len, DEFAULT_SESSION, i++); /* If the user wants to cancel, then fail */ if (chosengui->poll && (*chosengui->poll)(False)) return False; } while (_access(sesname, 0) == 0); optpreset(o_session, CHARdup(toCHAR(sesname)), OPT_LOCK|OPT_FREE); o_tempsession = !o_recovering; } /* Try to open the session file */ fd = _open(tochar8(o_session), _O_RDWR|_O_BINARY); if (fd < 0) { if (errno == ENOENT) { fd = _open(o_session, _O_RDWR|_O_CREAT|_O_EXCL|_O_BINARY, 0600); if (fd >= 0) { if (_write(fd, (char *)buf, (unsigned)o_blksize) < o_blksize) { _close(fd); remove(o_session); fd = -1; errno = ENOENT; } else { _lseek(fd, 0L, 0); } } } if (fd < 0) { msg(MSG_FATAL, "[Sd]$1: no such session, errno=$2", o_session, (long)errno); } } else { /* if the session existed before elvis, it'll exist after */ o_tempsession = False; } /* Read the first block & mark the session file as being "in use". * If already marked as "in use" and !force, then fail. */ /* lockf(fd, LOCK, sizeof buf->super); */ if (_read(fd, buf, sizeof buf->super) != sizeof buf->super) { msg(MSG_FATAL, "blkopen's read failed"); } if (buf->super.inuse && !force) { return False; } buf->super.inuse = 1; _lseek(fd, 0L, 0); (void)_write(fd, buf, sizeof buf->super); /* done! */ return True; } /* This function closes the session file, given its handle */ void blkclose(BLK *buf) { blkread(buf, 0); buf->super.inuse = 0L; blkwrite(buf, 0); _close(fd); fd = -1; if (o_tempsession) remove(tochar8(o_session)); } /* Write the contents of buf into record # blkno, for the block file * identified by blkhandle. Blocks are numbered starting at 0. The * requested block may be past the end of the file, in which case * this function is expected to extend the file. */ void blkwrite(BLK *buf, _BLKNO_ blkno) { /* write the block */ _lseek(fd, blkno * o_blksize, 0); if (_write(fd, buf, (unsigned)o_blksize) != o_blksize) { msg(MSG_FATAL, "blkwrite failed"); } } /* Read the contends of record # blkno into buf, for the block file * identified by blkhandle. The request block will always exist; * it will never be beyond the end of the file. */ void blkread(BLK *buf, _BLKNO_ blkno) { /* read the block */ _lseek(fd, blkno * o_blksize, 0); if (_read(fd, buf, (unsigned)o_blksize) != o_blksize) { msg(MSG_FATAL, "blkread failed"); } } /* Force changes out to disk */ void blksync P_((void)) { int dupfd; if ((dupfd = _dup (fd)) != -1) _close (dupfd); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.