1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
4 * Copyright (C) 2002 Cluster File Systems, Inc.
5 * Author: Phil Schwan <phil@clusterfs.com>
7 * This file is part of Lustre, http://www.lustre.org.
9 * Lustre is free software; you can redistribute it and/or
10 * modify it under the terms of version 2 of the GNU General Public
11 * License as published by the Free Software Foundation.
13 * Lustre is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with Lustre; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 * Darwin porting library
23 * Make things easy to port
25 #define DEBUG_SUBSYSTEM S_PORTALS
27 #include <mach/mach_types.h>
29 #include <sys/errno.h>
30 #include <sys/types.h>
31 #include <sys/fcntl.h>
32 #include <portals/types.h>
38 return (c == ' ' || c == '\t' || c == '\n' || c == '\12');
42 char * strpbrk(const char * cs,const char * ct)
46 for( sc1 = cs; *sc1 != '\0'; ++sc1) {
47 for( sc2 = ct; *sc2 != '\0'; ++sc2) {
55 char * strsep(char **s, const char *ct)
57 char *sbegin = *s, *end;
61 end = strpbrk(sbegin, ct);
69 size_t strnlen(const char * s, size_t count)
73 for (sc = s; count-- && *sc != '\0'; ++sc)
79 strstr(const char *in, const char *str)
86 return (char *) in; // Trivial empty string case
95 } while (strncmp(in, str, len) != 0);
96 return (char *) (in - 1);
100 strrchr(const char *p, int ch)
102 const char *end = p + strlen(p);
104 if (*end == (char)ch)
106 } while (--end >= p);
111 ul2dstr(unsigned long address, char *buf, int len)
113 char *pos = buf + len - 1;
115 if (len <= 0 || !buf)
120 *--pos = address % 10 + '0';
127 * miscellaneous libcfs stuff
131 * Convert server error code to client format.
137 * cc /usr/include/asm/errno.h -E -dM | grep '#define E' | sort -n -k3,3
176 LINUX_ENAMETOOLONG = 36,
179 LINUX_ENOTEMPTY = 39,
210 LINUX_EMULTIHOP = 72,
213 LINUX_EOVERFLOW = 75,
227 LINUX_EDESTADDRREQ = 89,
229 LINUX_EPROTOTYPE = 91,
230 LINUX_ENOPROTOOPT = 92,
231 LINUX_EPROTONOSUPPORT = 93,
232 LINUX_ESOCKTNOSUPPORT = 94,
233 LINUX_EOPNOTSUPP = 95,
234 LINUX_EPFNOSUPPORT = 96,
235 LINUX_EAFNOSUPPORT = 97,
236 LINUX_EADDRINUSE = 98,
237 LINUX_EADDRNOTAVAIL = 99,
238 LINUX_ENETDOWN = 100,
239 LINUX_ENETUNREACH = 101,
240 LINUX_ENETRESET = 102,
241 LINUX_ECONNABORTED = 103,
242 LINUX_ECONNRESET = 104,
245 LINUX_ENOTCONN = 107,
246 LINUX_ESHUTDOWN = 108,
247 LINUX_ETOOMANYREFS = 109,
248 LINUX_ETIMEDOUT = 110,
249 LINUX_ECONNREFUSED = 111,
250 LINUX_EHOSTDOWN = 112,
251 LINUX_EHOSTUNREACH = 113,
252 LINUX_EALREADY = 114,
253 LINUX_EINPROGRESS = 115,
259 LINUX_EREMOTEIO = 121,
261 LINUX_ENOMEDIUM = 123,
262 LINUX_EMEDIUMTYPE = 124,
265 * we don't need these, but for completeness..
267 LINUX_EDEADLOCK = LINUX_EDEADLK,
268 LINUX_EWOULDBLOCK = LINUX_EAGAIN
271 int convert_server_error(__u64 ecode)
276 static int errno_xlate[] = {
277 /* success is always success */
279 [LINUX_EPERM] = EPERM,
280 [LINUX_ENOENT] = ENOENT,
281 [LINUX_ESRCH] = ESRCH,
282 [LINUX_EINTR] = EINTR,
284 [LINUX_ENXIO] = ENXIO,
285 [LINUX_E2BIG] = E2BIG,
286 [LINUX_ENOEXEC] = ENOEXEC,
287 [LINUX_EBADF] = EBADF,
288 [LINUX_ECHILD] = ECHILD,
289 [LINUX_EAGAIN] = EAGAIN,
290 [LINUX_ENOMEM] = ENOMEM,
291 [LINUX_EACCES] = EACCES,
292 [LINUX_EFAULT] = EFAULT,
293 [LINUX_ENOTBLK] = ENOTBLK,
294 [LINUX_EBUSY] = EBUSY,
295 [LINUX_EEXIST] = EEXIST,
296 [LINUX_EXDEV] = EXDEV,
297 [LINUX_ENODEV] = ENODEV,
298 [LINUX_ENOTDIR] = ENOTDIR,
299 [LINUX_EISDIR] = EISDIR,
300 [LINUX_EINVAL] = EINVAL,
301 [LINUX_ENFILE] = ENFILE,
302 [LINUX_EMFILE] = EMFILE,
303 [LINUX_ENOTTY] = ENOTTY,
304 [LINUX_ETXTBSY] = ETXTBSY,
305 [LINUX_EFBIG] = EFBIG,
306 [LINUX_ENOSPC] = ENOSPC,
307 [LINUX_ESPIPE] = ESPIPE,
308 [LINUX_EROFS] = EROFS,
309 [LINUX_EMLINK] = EMLINK,
310 [LINUX_EPIPE] = EPIPE,
312 [LINUX_ERANGE] = ERANGE,
313 [LINUX_EDEADLK] = EDEADLK,
314 [LINUX_ENAMETOOLONG] = ENAMETOOLONG,
315 [LINUX_ENOLCK] = ENOLCK,
316 [LINUX_ENOSYS] = ENOSYS,
317 [LINUX_ENOTEMPTY] = ENOTEMPTY,
318 [LINUX_ELOOP] = ELOOP,
319 [LINUX_ENOMSG] = ENOMSG,
320 [LINUX_EIDRM] = EIDRM,
321 [LINUX_ECHRNG] = EINVAL /* ECHRNG */,
322 [LINUX_EL2NSYNC] = EINVAL /* EL2NSYNC */,
323 [LINUX_EL3HLT] = EINVAL /* EL3HLT */,
324 [LINUX_EL3RST] = EINVAL /* EL3RST */,
325 [LINUX_ELNRNG] = EINVAL /* ELNRNG */,
326 [LINUX_EUNATCH] = EINVAL /* EUNATCH */,
327 [LINUX_ENOCSI] = EINVAL /* ENOCSI */,
328 [LINUX_EL2HLT] = EINVAL /* EL2HLT */,
329 [LINUX_EBADE] = EINVAL /* EBADE */,
330 [LINUX_EBADR] = EBADRPC,
331 [LINUX_EXFULL] = EINVAL /* EXFULL */,
332 [LINUX_ENOANO] = EINVAL /* ENOANO */,
333 [LINUX_EBADRQC] = EINVAL /* EBADRQC */,
334 [LINUX_EBADSLT] = EINVAL /* EBADSLT */,
335 [LINUX_EBFONT] = EINVAL /* EBFONT */,
336 [LINUX_ENOSTR] = EINVAL /* ENOSTR */,
337 [LINUX_ENODATA] = EINVAL /* ENODATA */,
338 [LINUX_ETIME] = EINVAL /* ETIME */,
339 [LINUX_ENOSR] = EINVAL /* ENOSR */,
340 [LINUX_ENONET] = EINVAL /* ENONET */,
341 [LINUX_ENOPKG] = EINVAL /* ENOPKG */,
342 [LINUX_EREMOTE] = EREMOTE,
343 [LINUX_ENOLINK] = EINVAL /* ENOLINK */,
344 [LINUX_EADV] = EINVAL /* EADV */,
345 [LINUX_ESRMNT] = EINVAL /* ESRMNT */,
346 [LINUX_ECOMM] = EINVAL /* ECOMM */,
347 [LINUX_EPROTO] = EPROTOTYPE,
348 [LINUX_EMULTIHOP] = EINVAL /* EMULTIHOP */,
349 [LINUX_EDOTDOT] = EINVAL /* EDOTDOT */,
350 [LINUX_EBADMSG] = EINVAL /* EBADMSG */,
351 [LINUX_EOVERFLOW] = EOVERFLOW,
352 [LINUX_ENOTUNIQ] = EINVAL /* ENOTUNIQ */,
353 [LINUX_EBADFD] = EINVAL /* EBADFD */,
354 [LINUX_EREMCHG] = EINVAL /* EREMCHG */,
355 [LINUX_ELIBACC] = EINVAL /* ELIBACC */,
356 [LINUX_ELIBBAD] = EINVAL /* ELIBBAD */,
357 [LINUX_ELIBSCN] = EINVAL /* ELIBSCN */,
358 [LINUX_ELIBMAX] = EINVAL /* ELIBMAX */,
359 [LINUX_ELIBEXEC] = EINVAL /* ELIBEXEC */,
360 [LINUX_EILSEQ] = EILSEQ,
361 [LINUX_ERESTART] = ERESTART,
362 [LINUX_ESTRPIPE] = EINVAL /* ESTRPIPE */,
363 [LINUX_EUSERS] = EUSERS,
364 [LINUX_ENOTSOCK] = ENOTSOCK,
365 [LINUX_EDESTADDRREQ] = EDESTADDRREQ,
366 [LINUX_EMSGSIZE] = EMSGSIZE,
367 [LINUX_EPROTOTYPE] = EPROTOTYPE,
368 [LINUX_ENOPROTOOPT] = ENOPROTOOPT,
369 [LINUX_EPROTONOSUPPORT] = EPROTONOSUPPORT,
370 [LINUX_ESOCKTNOSUPPORT] = ESOCKTNOSUPPORT,
371 [LINUX_EOPNOTSUPP] = EOPNOTSUPP,
372 [LINUX_EPFNOSUPPORT] = EPFNOSUPPORT,
373 [LINUX_EAFNOSUPPORT] = EAFNOSUPPORT,
374 [LINUX_EADDRINUSE] = EADDRINUSE,
375 [LINUX_EADDRNOTAVAIL] = EADDRNOTAVAIL,
376 [LINUX_ENETDOWN] = ENETDOWN,
377 [LINUX_ENETUNREACH] = ENETUNREACH,
378 [LINUX_ENETRESET] = ENETRESET,
379 [LINUX_ECONNABORTED] = ECONNABORTED,
380 [LINUX_ECONNRESET] = ECONNRESET,
381 [LINUX_ENOBUFS] = ENOBUFS,
382 [LINUX_EISCONN] = EISCONN,
383 [LINUX_ENOTCONN] = ENOTCONN,
384 [LINUX_ESHUTDOWN] = ESHUTDOWN,
385 [LINUX_ETOOMANYREFS] = ETOOMANYREFS,
386 [LINUX_ETIMEDOUT] = ETIMEDOUT,
387 [LINUX_ECONNREFUSED] = ECONNREFUSED,
388 [LINUX_EHOSTDOWN] = EHOSTDOWN,
389 [LINUX_EHOSTUNREACH] = EHOSTUNREACH,
390 [LINUX_EALREADY] = EALREADY,
391 [LINUX_EINPROGRESS] = EINPROGRESS,
392 [LINUX_ESTALE] = ESTALE,
393 [LINUX_EUCLEAN] = EINVAL /* EUCLEAN */,
394 [LINUX_ENOTNAM] = EINVAL /* ENOTNAM */,
395 [LINUX_ENAVAIL] = EINVAL /* ENAVAIL */,
396 [LINUX_EISNAM] = EINVAL /* EISNAM */,
397 [LINUX_EREMOTEIO] = EINVAL /* EREMOTEIO */,
398 [LINUX_EDQUOT] = EDQUOT,
399 [LINUX_ENOMEDIUM] = EINVAL /* ENOMEDIUM */,
400 [LINUX_EMEDIUMTYPE] = EINVAL /* EMEDIUMTYPE */,
409 if (code < (sizeof errno_xlate) / (sizeof errno_xlate[0]))
410 code = errno_xlate[code];
413 * Unknown error. Reserved for the future.
423 LINUX_O_CREAT = 0100,
425 LINUX_O_NOCTTY = 0400,
426 LINUX_O_TRUNC = 01000,
427 LINUX_O_APPEND = 02000,
428 LINUX_O_NONBLOCK = 04000,
429 LINUX_O_NDELAY = LINUX_O_NONBLOCK,
430 LINUX_O_SYNC = 010000,
431 LINUX_O_FSYNC = LINUX_O_SYNC,
432 LINUX_O_ASYNC = 020000,
433 LINUX_O_DIRECT = 040000,
434 LINUX_O_NOFOLLOW = 0400000
437 static inline void obit_convert(int *cflag, int *sflag,
438 unsigned cmask, unsigned smask)
440 if (*cflag & cmask != 0) {
447 * convert <fcntl.h> flag from XNU client to Linux _i386_ server.
449 int convert_client_oflag(int cflag, int *result)
454 obit_convert(&cflag, &sflag, O_RDONLY, LINUX_O_RDONLY);
455 obit_convert(&cflag, &sflag, O_WRONLY, LINUX_O_WRONLY);
456 obit_convert(&cflag, &sflag, O_RDWR, LINUX_O_RDWR);
457 obit_convert(&cflag, &sflag, O_NONBLOCK, LINUX_O_NONBLOCK);
458 obit_convert(&cflag, &sflag, O_APPEND, LINUX_O_APPEND);
459 obit_convert(&cflag, &sflag, O_ASYNC, LINUX_O_ASYNC);
460 obit_convert(&cflag, &sflag, O_FSYNC, LINUX_O_FSYNC);
461 obit_convert(&cflag, &sflag, O_NOFOLLOW, LINUX_O_NOFOLLOW);
462 obit_convert(&cflag, &sflag, O_CREAT, LINUX_O_CREAT);
463 obit_convert(&cflag, &sflag, O_TRUNC, LINUX_O_TRUNC);
464 obit_convert(&cflag, &sflag, O_EXCL, LINUX_O_EXCL);
465 obit_convert(&cflag, &sflag, O_CREAT, LINUX_O_CREAT);
466 obit_convert(&cflag, &sflag, O_NDELAY, LINUX_O_NDELAY);
467 obit_convert(&cflag, &sflag, O_NOCTTY, LINUX_O_NOCTTY);
469 * Some more obscure BSD flags have no Linux counterparts: