Path: utzoo!mnetor!uunet!ndsuvax!ncpascal From: ncpascal@ndsuvax.UUCP (Freeman Pascal) Newsgroups: comp.os.minix Subject: Getwd(3) for MINIX Message-ID: <579@ndsuvax.UUCP> Date: 17 Dec 87 04:53:59 GMT Reply-To: ncpascal@ndsuvax.UUCP (Freeman Pascal) Organization: North Dakota State University Fargo, ND Lines: 289 Keywords: MINIX library getwd(3) Hello, While I was porting the BSD version of "arc" to MINIX I discovered I needed getwd(3) but libc lack one, so I wrote it. This implementation follows as outlined in the BSD 4.3 PRM. I hope this is useful and makes it's way into your libc.a. Just unshar and follow the instructions found in the "INSTALL" file. Freeman P. Pascal IV ncpascal@ndsuvax #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh INSTALL <<'END_OF_INSTALL' XManifest: X-------- X INSTALL This file X Makefile makefile for tst X makelibc shell script to make C library X getwd.c library function (getwd(3)) X tst.c test file for getwd(3) X XInstallation instructions: X------------------------- X X1. Compile getwd.c as a library routine and place in /usr/lib/libc.a. X If you are using the makelibc shell script that was posted quite X awhile back just append "ar av libc.a getwd.s" to the beginning X and run. I am including my version if you don't have it. X X2. Run makefile to compile tst.c. X X3. Run tst to varify results: X X Usage: tst file-from file-to X X3. Enjoy END_OF_INSTALL if test 615 -ne `wc -c Makefile <<'END_OF_Makefile' X# X# Makefile for getwd(3) test X# XCFLAGS = -T. -i X Xtst: tst.c X cc $(CFLAGS) -o tst tst.c X @echo "done." X END_OF_Makefile if test 105 -ne `wc -c getwd.c <<'END_OF_getwd.c' X/* X * getwd() - get working directory X * X * Modeled after Adri Koppes' pwd utility. X */ X#include X#include X#include X#include X X#ifndef NULL X#define NULL 0 X#endif X X#define PUBLIC X#define PRIVATE static X X#define MAXPATHLEN 1024 /* just like BSD */ X Xvoid reverse_path(); X X/*========================================================================*\ X** getwd() ** X\*========================================================================*/ XPUBLIC char * Xgetwd( pathname ) Xchar *pathname; X{ X struct direct dir; X register struct stat *sp1, *sp2, *stmp; X struct stat sbuf[ 2 ]; X char pbuf[ MAXPATHLEN ]; X int fd; X X *pbuf = '\0'; /* clear path buffer */ X sp1 = &sbuf[ 0 ]; X sp2 = &sbuf[ 1 ]; X stat( ".", sp1 ); X do { X if (( fd = open( "..", O_RDONLY )) < 0) { X strcpy( pathname, "Cannot open \"..\"(1)" ); X return( NULL ); X } X stmp = sp1; X sp1 = sp2; X sp2 = stmp; X stat( "..", sp1 ); X chdir( ".." ); X if ( sp1->st_dev == sp2->st_dev ) /* are we on the same device? */ X do { X if (read( fd, &dir, sizeof( struct direct )) < X sizeof( struct direct )) { X strcpy( pathname, "Cannot open \"..\"(2)" ); X return( NULL ); X } X } while( dir.d_ino != sp2->st_ino ); X else X do { X if (read( fd, &dir, sizeof( struct direct )) < X sizeof( struct direct )) { X strcpy( pathname, "Cannot open \"..\"" ); X return( NULL ); X } X stat( dir.d_name, sp1 ); X } while((sp1->st_dev != sp2->st_dev) || (sp1->st_ino != sp2->st_ino)); X close( fd ); X if (strcmp( ".", dir.d_name )) { X strcat( pbuf, "/" ); X strcat( pbuf, dir.d_name ); X } X } while (( sp1->st_ino != sp2->st_ino ) || ( sp1->st_dev != sp2->st_dev )); X if (!pathname) X if (( pathname = (char *) malloc( strlen( dir ))) == 0 ) { X strcpy( pathname, "Out of Memory" ); X return( NULL ); X } X if (!*pbuf) X strcpy( pbuf, "/" ); X else X reverse_path( pbuf, pathname ); X return( pathname ); X} X X/*========================================================================*\ X** reverse_path() ** X\*========================================================================*/ XPRIVATE void Xreverse_path( src, dest ) Xchar *src; Xchar *dest; X{ X/* X * reverse directory names in path sent by getwd(). X * X * contents of source string is destroyed X */ X char *sp; X X *dest = '\0'; /* clear destination string */ X for( sp = src; *sp; sp++ ) /* find end if src string */ X ; X do { X while( *sp != '/' && sp-- != src ) X ; X strcat( dest, sp ); X *sp = '\0'; /* mark new end of src string */ X } while ( sp != src ); X} END_OF_getwd.c if test 2553 -ne `wc -c makelibc <<'END_OF_makelibc' X# X# makelibc - Make C library X# X# - NOTE - X# X# This shell script will -REMOVE- the old version of libc.a if it X# exists in the current directory. It will also -REPLACE- the old X# /usr/lib/libc.a with version just packaged. X# Xif (test -f ./libc.a) # remove old libc.a if it exists X then rm ./libc.a Xfi Xar av libc.a getwd.s rename.s # getwd(3) rename(2) Xar av libc.a dir.s scandir.s # directory(3), scandir(3) Xar av libc.a getgrp.s # process groups Xar av libc.a termcap.s gtty.s stty.s # v1.2 update Xar av libc.a popen.s ctime.s system.s qsort.s # v1.2 upgrade Xar av libc.a regexp.s regsub.s Xar av libc.a getopt.s getgrent.s getpwent.s crypt.s Xar av libc.a fdopen.s Xar av libc.a fgets.s fprintf.s fputs.s fread.s freopen.s fclose.s Xar av libc.a fopen.s fseek.s ftell.s fwrite.s gets.s scanf.s getc.s printdat.s Xar av libc.a fflush.s setbuf.s sprintf.s doprintf.s putc.s ungetc.s strcmp.s Xar av libc.a access.s chdir.s chmod.s chown.s chroot.s creat.s dup.s dup2.s Xar av libc.a exec.s exit.s cleanup.s fork.s isatty.s fstat.s getegid.s getenv.s Xar av libc.a geteuid.s getgid.s getpass.s close.s getuid.s ioctl.s kill.s Xar av libc.a link.s lseek.s malloc.s brk.s brk2.s brksize.s mknod.s mktemp.s Xar av libc.a getpid.s mount.s open.s perror.s pipe.s prints.s read.s setgid.s Xar av libc.a setuid.s sleep.s alarm.s pause.s signal.s catchsig.s stat.s Xar av libc.a stime.s strcat.s strcpy.s strlen.s strncat.s strncmp.s strncpy.s Xar av libc.a ftime.s Xar av libc.a sync.s time.s times.s umask.s umount.s unlink.s utime.s wait.s Xar av libc.a stderr.s write.s syslib.s call.s atoi.s message.s sendrec.s Xar av libc.a printk.s abort.s itoa.s stb.s abs.s atol.s ctype.s index.s bcopy.s Xar av libc.a getutil.s rand.s rindex.s adi.s and.s cii.s cms.s cmu4.s com.s Xar av libc.a csa2.s csb2.s cuu.s .dup.s dvi.s dvi4.s dvu.s dvu4.s exg.s fakfp.s Xar av libc.a gto.s iaar.s ilar.s inn.s ior.s isar.s lar2.s loi.s mli.s mli4.s Xar av libc.a ngi.s nop.s rck.s rmi.s rmi4.s rmu.s rmu4.s rol.s ror.s sar2.s Xar av libc.a sbi.s set.s sli.s sri.s sti.s xor.s error.s unknown.s trp.s Xar av libc.a setjmp.s X Xcp libc.a /usr/lib Xecho Xecho "Done." Xecho X END_OF_makelibc if test 2138 -ne `wc -c tst.c <<'END_OF_tst.c' X#include X Xmain() X{ X char *pn = NULL; X X prints( "%s\n\n", getwd( pn )); X} END_OF_tst.c if test 83 -ne `wc -c