2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
10 #include <afs/param.h>
30 long fs_ExtractDriveLetter(char *inPathp, char *outPathp)
32 if (inPathp[0] != 0 && inPathp[1] == ':') {
33 /* there is a drive letter */
34 *outPathp++ = *inPathp++;
35 *outPathp++ = *inPathp++;
43 /* strip the drive letter from a component */
44 long fs_StripDriveLetter(char *inPathp, char *outPathp, long outSize)
46 char tempBuffer[1000];
47 strcpy(tempBuffer, inPathp);
48 if (tempBuffer[0] != 0 && tempBuffer[1] == ':') {
49 /* drive letter present */
50 strcpy(outPathp, tempBuffer+2);
53 /* no drive letter present */
54 strcpy(outPathp, tempBuffer);
59 /* take a path with a drive letter, possibly relative, and return a full path
60 * without the drive letter. This is the full path relative to the working
61 * dir for that drive letter. The input and output paths can be the same.
63 long fs_GetFullPath(char *pathp, char *outPathp, long outSize)
73 if (pathp[0] != 0 && pathp[1] == ':') {
74 /* there's a drive letter there */
83 if (*firstp == '\\' || *firstp == '/') {
84 /* already an absolute pathname, just copy it back */
85 strcpy(outPathp, firstp);
89 GetCurrentDirectory(sizeof(origPath), origPath);
92 if (pathHasDrive && (*pathp & ~0x20) != (origPath[0] & ~0x20)) {
93 /* a drive has been specified and it isn't our current drive.
94 * to get path, switch to it first. Must case-fold drive letters
95 * for user convenience.
101 if (!SetCurrentDirectory(newPath)) {
102 code = GetLastError();
107 /* now get the absolute path to the current wdir in this drive */
108 GetCurrentDirectory(sizeof(tpath), tpath);
109 strcpy(outPathp, tpath+2); /* skip drive letter */
110 /* if there is a non-null name after the drive, append it */
112 strcat(outPathp, "\\");
113 strcat(outPathp, firstp);
116 /* finally, if necessary, switch back to our home drive letter */
118 SetCurrentDirectory(origPath);
124 struct hostent *hostutil_GetHostByName(char *namep)
128 thp = gethostbyname(namep);
132 /* get hostname or addr, given addr in network byte order */
133 char *hostutil_GetNameByINet(long addr)
135 static char hostNameBuffer[256];
138 thp = gethostbyaddr((char *) &addr, sizeof(long), AF_INET);
140 strcpy(hostNameBuffer, thp->h_name);
142 sprintf(hostNameBuffer, "%d.%d.%d.%d",
146 (addr >> 24) & 0xff);
149 /* return static buffer */
150 return hostNameBuffer;
153 /* is this a digit or a digit-like thing? */
154 static int ismeta(ac, abase)
157 /* if (ac == '-' || ac == 'x' || ac == 'X') return 1; */
158 if (ac >= '0' && ac <= '7') return 1;
159 if (abase <= 8) return 0;
160 if (ac >= '8' && ac <= '9') return 1;
161 if (abase <= 10) return 0;
162 if (ac >= 'a' && ac <= 'f') return 1;
163 if (ac >= 'A' && ac <= 'F') return 1;
167 /* given that this is a digit or a digit-like thing, compute its value */
168 static int getmeta(ac)
170 if (ac >= '0' && ac <= '9') return ac - '0';
171 if (ac >= 'a' && ac <= 'f') return ac - 'a' + 10;
172 if (ac >= 'A' && ac <= 'F') return ac - 'A' + 10;
176 long util_GetInt32 (as, aval)
185 total = 0; /* initialize things */
188 /* skip over leading spaces */
190 if (tc != ' ' && tc != '\t') break;
196 as++; /* skip over character */
199 /* compute the base */
202 if (*as == 'x' || *as == 'X') {
210 /* compute the # itself */
212 if (!ismeta(tc, base)) return -1;
214 total += getmeta(tc);
218 if (negative) *aval = -total;