NetBSD/sys/compat/darwin/syscalls.master

542 lines
18 KiB
Plaintext
Raw Normal View History

$NetBSD: syscalls.master,v 1.21 2003/12/31 02:55:04 manu Exp $
2002-11-13 01:04:07 +03:00
; @(#)syscalls.master 8.2 (Berkeley) 1/13/94
; NetBSD system call name/number "master" file.
; (See syscalls.conf to see what it is processed into.)
;
; Fields: number type [type-dependent ...]
; number system call number, must be in order
; type one of STD, OBSOL, UNIMPL, NODEF, NOARGS, or one of
; the compatibility options defined in syscalls.conf.
;
; An optional field, MPSAFE, after the type field, indicates that
; the system call is MP-safe.
;
; types:
; STD always included
; OBSOL obsolete, not included in system
; UNIMPL unimplemented, not included in system
; NODEF included, but don't define the syscall number
; NOARGS included, but don't define the syscall args structure
;
; The compat options are defined in the syscalls.conf file, and the
; compat option name is prefixed to the syscall name. Other than
; that, they're like NODEF (for 'compat' options), or STD (for
; 'libcompat' options).
;
; The type-dependent arguments are as follows:
; For STD, NODEF, NOARGS, and compat syscalls:
; { pseudo-proto } [alias]
; For other syscalls:
; [comment]
;
; #ifdef's, etc. may be included, and are copied to the output files.
; #include's are copied to the syscall names and switch definition files only.
;
; NB: A lot of system calls are used from FreeBSD emulation, because theses
; system calls are just native NetBSD plus a check in /emul/<e_name>.
2002-11-13 01:04:07 +03:00
#include "opt_ktrace.h"
#include "opt_nfsserver.h"
#include "opt_ntp.h"
#include "opt_compat_netbsd.h"
#include "opt_sysv.h"
#include "opt_compat_43.h"
#include "fs_lfs.h"
#include "fs_nfs.h"
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/signal.h>
#include <sys/mount.h>
#include <sys/sa.h>
2002-11-13 01:04:07 +03:00
#include <sys/syscallargs.h>
#include <compat/common/compat_file.h>
#include <compat/mach/mach_types.h>
#include <compat/mach/mach_vm.h>
#include <compat/darwin/darwin_signal.h>
#include <compat/darwin/darwin_syscallargs.h>
2002-11-13 01:04:07 +03:00
%%
0 INDIR { int sys_syscall(int number, ...); }
1 NOARGS { void sys_exit(int rval); }
2 STD { int darwin_sys_fork(void); }
2002-11-13 01:04:07 +03:00
3 NOARGS { ssize_t sys_read(int fd, void *buf, size_t nbyte); }
4 NOARGS { ssize_t sys_write(int fd, const void *buf, \
size_t nbyte); }
5 NODEF { int bsd_sys_open(const char *path, \
2002-11-13 01:04:07 +03:00
int flags, ... mode_t mode); }
6 NOARGS { int sys_close(int fd); }
7 NOARGS { int sys_wait4(int pid, int *status, int options, \
struct rusage *rusage); }
8 NODEF { int bsd_compat_43_sys_creat(const char *path, \
mode_t mode); } ocreat
9 NODEF { int bsd_sys_link(const char *path, \
const char *link); }
10 NODEF { int bsd_sys_unlink(const char *path); }
2002-11-13 01:04:07 +03:00
11 UNIMPL execv
12 NODEF { int bsd_sys_chdir(const char *path); }
2002-11-13 01:04:07 +03:00
13 NOARGS { int sys_fchdir(int fd); }
2003-09-06 15:50:00 +04:00
14 STD { int darwin_sys_mknod(const char *path, \
mode_t mode, dev_t dev); }
15 NODEF { int bsd_sys_chmod(const char *path, mode_t mode); }
16 NODEF { int bsd_sys_chown(const char *path, uid_t uid, \
2002-11-13 01:04:07 +03:00
gid_t gid); }
17 NOARGS { int sys_obreak(char *nsize); } break
18 STD { int darwin_sys_getfsstat(struct darwin_statfs *buf, \
long bufsize, int flags); }
19 NOARGS { long compat_43_sys_lseek(int fd, long offset, \
int whence); } olseek
20 STD { pid_t darwin_sys_getpid(void); }
21 NODEF { int bsd_sys_mount(const char *type, \
const char *path, int flags, void *data); }
22 NODEF { int bsd_sys_unmount(const char *path, int flags); }
2002-11-13 01:04:07 +03:00
23 NOARGS { int sys_setuid(uid_t uid); }
#ifdef COMPAT_43
24 NOARGS { uid_t sys_getuid_with_euid(void); } getuid
#else
24 NOARGS { uid_t sys_getuid(void); }
#endif
25 NOARGS { uid_t sys_geteuid(void); }
26 STD { int darwin_sys_ptrace(int req, pid_t pid, \
caddr_t addr, int data); }
2002-11-13 01:04:07 +03:00
27 NOARGS { ssize_t sys_recvmsg(int s, struct msghdr *msg, \
int flags); }
28 NOARGS { ssize_t sys_sendmsg(int s, \
const struct msghdr *msg, int flags); }
29 NOARGS { ssize_t sys_recvfrom(int s, void *buf, size_t len, \
int flags, struct sockaddr *from, \
unsigned int *fromlenaddr); }
30 NOARGS { int sys_accept(int s, struct sockaddr *name, \
unsigned int *anamelen); }
31 NOARGS { int sys_getpeername(int fdes, struct sockaddr *asa, \
unsigned int *alen); }
32 NOARGS { int sys_getsockname(int fdes, struct sockaddr *asa, \
unsigned int *alen); }
33 NODEF { int bsd_sys_access(const char *path, \
int flags); }
34 NODEF { int bsd_sys_chflags(const char *path, \
u_long flags); }
2002-11-13 01:04:07 +03:00
35 NOARGS { int sys_fchflags(int fd, u_long flags); }
36 NOARGS { void sys_sync(void); }
37 NOARGS { int sys_kill(int pid, int signum); }
38 NODEF { int bsd_compat_43_sys_stat(const char *path, \
struct stat43 *ub); } stat43
2002-11-13 01:04:07 +03:00
39 NOARGS { pid_t sys_getppid(void); }
40 NODEF { int bsd_compat_43_sys_lstat(const char *path, \
2002-11-13 01:04:07 +03:00
struct stat43 *ub); } lstat43
41 NOARGS { int sys_dup(int fd); }
42 NOARGS { int sys_pipe(void); }
43 NOARGS { gid_t sys_getegid(void); }
44 NOARGS { int sys_profil(caddr_t samples, size_t size, \
u_long offset, u_int scale); }
#if defined(KTRACE) || !defined(_KERNEL)
45 NOARGS { int sys_ktrace(const char *fname, int ops, \
int facs, int pid); }
#else
45 EXCL ktrace
#endif
46 STD { int darwin_sys_sigaction(int signum, \
struct darwin___sigaction *nsa, \
struct sigaction13 *osa); }
2002-11-13 01:04:07 +03:00
#ifdef COMPAT_43
47 NOARGS { gid_t sys_getgid_with_egid(void); } getgid
#else
47 NOARGS { gid_t sys_getgid(void); }
#endif
48 STD { int darwin_sys_sigprocmask(int how, \
sigset13_t *set, sigset13_t *oset); }
2002-11-13 01:04:07 +03:00
49 NOARGS { int sys___getlogin(char *namebuf, size_t namelen); }
2003-01-22 20:47:35 +03:00
50 NOARGS { int sys___setlogin(const char *namebuf); }
51 NODEF { int bsd_sys_acct(const char *path); }
52 NOARGS { int compat_13_sys_sigpending(void); } sigpending13
53 NOARGS { int compat_13_sys_sigaltstack( \
2002-11-13 01:04:07 +03:00
const struct sigaltstack13 *nss, \
struct sigaltstack13 *oss); } sigaltstack13
54 STD { int darwin_sys_ioctl(int fd, \
2002-11-13 01:04:07 +03:00
u_long com, ... void *data); }
55 NOARGS { int sys_reboot(int opt); } oreboot
56 NODEF { int bsd_sys_revoke(const char *path); }
57 NODEF { int bsd_sys_symlink(const char *path, \
2002-11-13 01:04:07 +03:00
const char *link); }
58 NODEF { int bsd_sys_readlink(const char *path, \
char *buf, size_t count); }
59 NODEF { int bsd_sys_execve(const char *path, \
2002-11-13 01:04:07 +03:00
char * const *argp, char * const *envp); }
60 NOARGS { mode_t sys_umask(mode_t newmask); }
61 NODEF { int bsd_sys_chroot(const char *path); }
62 NOARGS { int compat_43_sys_fstat(int fd, \
struct stat43 *sb); } fstat43
2002-11-13 01:04:07 +03:00
63 UNIMPL
64 NOARGS { int compat_43_sys_getpagesize(void); } ogetpagesize
65 NOARGS { int compat_12_sys_msync(caddr_t addr, size_t len); }
66 STD { int darwin_sys_vfork(void); }
2002-11-13 01:04:07 +03:00
67 OBSOL vread
68 OBSOL vwrite
69 NOARGS { int sys_sbrk(intptr_t incr); }
70 NOARGS { int sys_sstk(int incr); }
71 NOARGS { int sys_mmap(caddr_t addr, size_t len, int prot, \
2002-11-13 01:04:07 +03:00
int flags, int fd, long pos); } ommap
72 NOARGS { int sys_ovadvise(int anom); } vadvise
73 NOARGS { int sys_munmap(void *addr, size_t len); }
74 NOARGS { int sys_mprotect(void *addr, size_t len, \
int prot); }
75 NOARGS { int sys_madvise(void *addr, size_t len, \
int behav); }
76 UNIMPL
77 UNIMPL
78 NOARGS { int sys_mincore(void *addr, size_t len, \
char *vec); }
79 NOARGS { int sys_getgroups(int gidsetsize, \
gid_t *gidset); }
80 NOARGS { int sys_setgroups(int gidsetsize, \
const gid_t *gidset); }
81 NOARGS { int sys_getpgrp(void); }
82 NOARGS { int sys_setpgid(int pid, int pgid); }
83 NOARGS { int sys_setitimer(int which, \
const struct itimerval *itv, \
struct itimerval *oitv); }
84 NOARGS { int compat_43_sys_wait(void); } owait
85 NODEF { int bsd_compat_12_sys_swapon(const char *name); }
2002-11-13 01:04:07 +03:00
86 NOARGS { int sys_getitimer(int which, \
struct itimerval *itv); }
87 NOARGS { int compat_43_sys_gethostname(char *hostname, \
u_int len); } ogethostname
88 NOARGS { int compat_43_sys_sethostname(char *hostname, \
u_int len); } osethostname
89 NOARGS { int compat_43_sys_getdtablesize(void); } \
ogetdtablesize
2002-11-13 01:04:07 +03:00
90 NOARGS { int sys_dup2(int from, int to); }
91 UNIMPL
92 NOARGS { int sys_fcntl(int fd, int cmd, ... void *arg); }
93 NOARGS { int sys_select(int nd, fd_set *in, fd_set *ou, \
fd_set *ex, struct timeval *tv); }
94 UNIMPL
95 NOARGS { int sys_fsync(int fd); }
96 NOARGS { int sys_setpriority(int which, int who, int prio); }
97 NOARGS { int sys_socket(int domain, int type, int protocol); }
98 NOARGS { int sys_connect(int s, const struct sockaddr *name, \
unsigned int namelen); }
99 NOARGS { int compat_43_sys_accept(int s, caddr_t name, \
2002-11-13 01:04:07 +03:00
int *anamelen); } oaccept
100 NOARGS { int sys_getpriority(int which, int who); }
101 NOARGS { int compat_43_sys_send(int s, caddr_t buf, int len, \
2002-11-13 01:04:07 +03:00
int flags); } osend
102 NOARGS { int compat_43_sys_recv(int s, caddr_t buf, int len, \
2002-11-13 01:04:07 +03:00
int flags); } orecv
103 STD { int darwin_sys_sigreturn(struct \
darwin_ucontext *uctx); }
104 NODEF { int bsd_sys_bind(int s, const struct sockaddr *name, \
2002-11-13 01:04:07 +03:00
unsigned int namelen); }
105 NOARGS { int sys_setsockopt(int s, int level, int name, \
const void *val, unsigned int valsize); }
106 NOARGS { int sys_listen(int s, int backlog); }
107 UNIMPL
108 NOARGS { int compat_43_sys_sigvec(int signum, \
struct sigvec *nsv, struct sigvec *osv); } osigvec
109 NOARGS { int compat_43_sys_sigblock(int mask); } osigblock
110 NOARGS { int compat_43_sys_sigsetmask(int mask); } osigsetmask
111 NOARGS { int compat_13_sys_sigsuspend(int mask); } \
sigsuspend13
112 NOARGS { int compat_43_sys_sigstack(struct sigstack *nss, \
2002-11-13 01:04:07 +03:00
struct sigstack *oss); } osigstack
113 NOARGS { int compat_43_sys_recvmsg(int s, \
struct omsghdr *msg, int flags); } orecvmsg
114 NOARGS { int compat_43_sys_sendmsg(int s, caddr_t msg, \
int flags); } osendmsg
2002-11-13 01:04:07 +03:00
115 UNIMPL
116 NOARGS { int sys_gettimeofday(struct timeval *tp, \
struct timezone *tzp); }
117 NOARGS { int sys_getrusage(int who, struct rusage *rusage); }
118 NOARGS { int sys_getsockopt(int s, int level, int name, \
void *val, unsigned int *avalsize); }
119 UNIMPL
120 NOARGS { ssize_t sys_readv(int fd, \
const struct iovec *iovp, int iovcnt); }
121 NOARGS { ssize_t sys_writev(int fd, \
const struct iovec *iovp, int iovcnt); }
122 NOARGS { int sys_settimeofday(const struct timeval *tv, \
const struct timezone *tzp); }
123 NOARGS { int sys_fchown(int fd, uid_t uid, gid_t gid); }
124 NOARGS { int sys_fchmod(int fd, mode_t mode); }
125 NOARGS { int compat_43_sys_recvfrom(int s, caddr_t buf, \
size_t len, int flags, caddr_t from, \
int *fromlenaddr); } orecvfrom
2002-11-13 01:04:07 +03:00
126 NOARGS { int sys_setreuid(uid_t ruid, uid_t euid); }
127 NOARGS { int sys_setregid(gid_t rgid, gid_t egid); }
128 NODEF { int bsd_sys_rename(const char *from, \
const char *to); }
129 NODEF { int bsd_compat_43_sys_truncate(const \
char *path, long length); } \
2002-11-13 01:04:07 +03:00
otruncate
130 NOARGS { int compat_43_sys_ftruncate(int fd, \
long length); } oftruncate
2002-11-13 01:04:07 +03:00
131 NOARGS { int sys_flock(int fd, int how); }
132 NODEF { int bsd_sys_mkfifo(const char *path, \
mode_t mode); }
2002-11-13 01:04:07 +03:00
133 NOARGS { ssize_t sys_sendto(int s, const void *buf, \
size_t len, int flags, const struct sockaddr *to, \
unsigned int tolen); }
134 NOARGS { int sys_shutdown(int s, int how); }
135 NOARGS { int sys_socketpair(int domain, int type, \
int protocol, int *rsv); }
136 NODEF { int bsd_sys_mkdir(const char *path, mode_t mode); }
137 NODEF { int bsd_sys_rmdir(const char *path); }
138 NODEF { int bsd_sys_utimes(const char *path, \
2002-11-13 01:04:07 +03:00
const struct timeval *tptr); }
139 UNIMPL futimes
140 NOARGS { int sys_adjtime(const struct timeval *delta, \
struct timeval *olddelta); }
141 NOARGS { int compat_43_sys_getpeername(int fdes, \
caddr_t asa, int *alen); } ogetpeername
142 NOARGS { int32_t compat_43_sys_gethostid(void); } ogethostid
2002-11-13 01:04:07 +03:00
143 UNIMPL
144 NOARGS { int compat_43_sys_getrlimit(int which, \
2002-11-13 01:04:07 +03:00
struct orlimit *rlp); } ogetrlimit
145 NOARGS { int compat_43_sys_setrlimit(int which, \
2002-11-13 01:04:07 +03:00
const struct orlimit *rlp); } osetrlimit
146 NOARGS { int compat_43_sys_killpg(int pgid, int signum); } \
okillpg
2002-11-13 01:04:07 +03:00
147 NOARGS { int sys_setsid(void); }
148 UNIMPL
149 UNIMPL
150 NOARGS { int compat_43_sys_getsockname(int fdec, \
caddr_t asa, int *alen); } ogetsockname
2002-11-13 01:04:07 +03:00
151 UNIMPL getpgid
152 UNIMPL setprivexec
153 UNIMPL pread
154 UNIMPL pwrite
#if defined(NFS) || defined(NFSSERVER) || !defined(_KERNEL)
155 NOARGS { int sys_nfssvc(int flag, void *argp); }
#else
155 EXCL nfssvc
#endif
156 NOARGS { int compat_43_sys_getdirentries(int fd, char *buf, \
2002-11-13 01:04:07 +03:00
u_int count, long *basep); } ogetdirentries
157 STD { int darwin_sys_statfs(const char *path, \
struct darwin_statfs *buf); }
158 STD { int darwin_sys_fstatfs(int fd, \
struct darwin_statfs *buf); }
2002-11-13 01:04:07 +03:00
159 UNIMPL unmount
160 UNIMPL
#if defined(NFS) || defined(NFSSERVER) || !defined(_KERNEL)
161 NODEF { int bsd_sys_getfh(const char *fname, \
fhandle_t *fhp); }
#else
161 EXCL getfh
#endif
162 NOARGS { int compat_09_sys_getdomainname(char *domainname, \
int len); } ogetdomainname
163 NOARGS { int compat_09_sys_setdomainname(char *domainname, \
int len); } osetdomainname
2002-11-13 01:04:07 +03:00
164 UNIMPL
165 UNIMPL quotactl
166 UNIMPL
167 UNIMPL mount
168 UNIMPL
169 UNIMPL
170 UNIMPL
171 UNIMPL wait3
172 UNIMPL
173 UNIMPL
174 UNIMPL
175 UNIMPL
176 UNIMPL add_profil
177 UNIMPL
178 UNIMPL
179 UNIMPL
180 STD { int darwin_sys_kdebug_trace(int debugid, int arg1, \
int arg2, int arg3, int arg4, int arg5); }
2002-11-13 01:04:07 +03:00
181 NOARGS { int sys_setgid(gid_t gid); }
182 NOARGS { int sys_setegid(gid_t egid); }
183 NOARGS { int sys_seteuid(uid_t euid); }
184 UNIMPL
185 UNIMPL
186 UNIMPL
187 UNIMPL
188 STD { int darwin_sys_stat(const char *path, \
struct stat12 *ub); } stat12
189 STD { int darwin_sys_fstat(int fd, \
2002-11-16 22:59:19 +03:00
struct stat12 *sb); }
190 STD { int darwin_sys_lstat(const char *path, \
2002-11-13 01:04:07 +03:00
struct stat12 *ub); } lstat12
191 NODEF { long bsd_sys_pathconf(const char *path, \
int name); }
2002-11-13 01:04:07 +03:00
192 NOARGS { long sys_fpathconf(int fd, int name); }
193 UNIMPL getfsstat
194 NOARGS { int sys_getrlimit(int which, \
struct rlimit *rlp); }
195 NOARGS { int sys_setrlimit(int which, \
const struct rlimit *rlp); }
196 NOARGS { int compat_12_sys_getdirentries(int fd, char *buf, \
2002-11-13 01:04:07 +03:00
u_int count, long *basep); }
197 NOARGS { void *sys_mmap(void *addr, size_t len, int prot, \
int flags, int fd, long pad, off_t pos); }
198 UNIMPL
199 STD { off_t darwin_sys_lseek(int fd, long off1, \
long off2, int whence); }
200 NODEF { int bsd_sys_truncate(const char *path, \
int pad, off_t length); }
2002-11-13 01:04:07 +03:00
201 NOARGS { int sys_ftruncate(int fd, int pad, off_t length); }
2002-11-23 05:18:53 +03:00
202 STD { int darwin_sys___sysctl(int *name, u_int namelen, \
void *oldp, size_t *oldlenp, void *newp, \
2002-11-13 01:04:07 +03:00
size_t newlen); }
203 NOARGS { int sys_mlock(const void *addr, size_t len); }
204 NOARGS { int sys_munlock(const void *addr, size_t len); }
205 STD { int bsd_sys_undelete(const char *path); }
2002-11-13 01:04:07 +03:00
206 UNIMPL atsocket
207 UNIMPL atgetmsg
208 UNIMPL atputmsg
209 UNIMPL atpsndreq
210 UNIMPL atpsndrsp
211 UNIMPL atpgetreq
212 UNIMPL atpgetrsp
213 UNIMPL
214 UNIMPL
215 UNIMPL
216 UNIMPL
217 UNIMPL
218 UNIMPL
219 UNIMPL
220 STD { int darwin_sys_getattrlist(const char *path, \
struct darwin_attrlist *alist, void * attributes, \
size_t buflen, unsigned long options); }
2002-11-13 01:04:07 +03:00
221 UNIMPL setattrlist
222 UNIMPL getdirentriesattr
223 UNIMPL exchangedata
224 UNIMPL checkuseraccess
225 UNIMPL searchfs
226 UNIMPL delete
227 UNIMPL copyfile
228 UNIMPL
229 UNIMPL
230 UNIMPL
231 UNIMPL watchevent
232 UNIMPL waitevent
233 UNIMPL modwatch
234 UNIMPL
235 UNIMPL
236 UNIMPL
237 UNIMPL
238 UNIMPL
239 UNIMPL
240 UNIMPL
241 UNIMPL
242 UNIMPL fsctl
243 UNIMPL
244 UNIMPL
245 UNIMPL
246 UNIMPL
247 UNIMPL
248 UNIMPL
249 UNIMPL
250 UNIMPL minherit
251 UNIMPL semsys
252 UNIMPL msgsys
253 UNIMPL semop
254 UNIMPL semctl
255 UNIMPL semget
256 UNIMPL semop
257 UNIMPL semconfig
258 UNIMPL msgctl
259 UNIMPL msgget
260 UNIMPL msgsnd
261 UNIMPL msgrcv
262 UNIMPL shmat
263 UNIMPL shmctl
264 UNIMPL shmdt
265 UNIMPL shmget
266 UNIMPL shm_open
267 UNIMPL shm_unlink
268 UNIMPL sem_open
269 UNIMPL sem_close
270 UNIMPL sem_unlink
271 UNIMPL sem_wait
272 UNIMPL sem_trywait
273 UNIMPL sem_post
274 UNIMPL sem_getvalue
275 UNIMPL sem_init
276 UNIMPL sem_destroy
277 UNIMPL
278 UNIMPL
279 UNIMPL
280 UNIMPL
281 UNIMPL
282 UNIMPL
283 UNIMPL
284 UNIMPL
285 UNIMPL
286 UNIMPL
287 UNIMPL
288 UNIMPL
289 UNIMPL
290 UNIMPL
291 UNIMPL
292 UNIMPL
293 UNIMPL
294 UNIMPL
295 UNIMPL
296 STD { int darwin_sys_load_shared_file(char *filename, \
caddr_t addr, u_long len, caddr_t *base, \
int count, mach_sf_mapping_t *mappings, \
int *flags); }
2002-11-13 01:04:07 +03:00
297 UNIMPL reset_shared_file
298 UNIMPL new_system_shared_regions
299 UNIMPL
300 UNIMPL
301 UNIMPL
302 UNIMPL
303 UNIMPL
304 UNIMPL
305 UNIMPL
306 UNIMPL
307 UNIMPL
308 UNIMPL
309 UNIMPL
310 UNIMPL getsid
311 UNIMPL
312 UNIMPL
313 UNIMPL
314 UNIMPL
315 UNIMPL
316 UNIMPL
317 UNIMPL
318 UNIMPL
319 UNIMPL
320 UNIMPL
321 UNIMPL
322 UNIMPL
323 UNIMPL
324 UNIMPL mlockall
325 UNIMPL munlockall
326 UNIMPL
327 UNIMPL issetugid
328 UNIMPL __pthread_kill
329 UNIMPL pthread_sigmask
330 UNIMPL sigwait
331 STD { void darwin_sys_pthread_exit(void *value_ptr); }
2002-11-13 01:04:07 +03:00
332 UNIMPL
333 UNIMPL
334 UNIMPL
335 UNIMPL utrace
336 UNIMPL
337 UNIMPL
338 UNIMPL
339 UNIMPL
340 UNIMPL
341 UNIMPL
342 UNIMPL
343 UNIMPL
344 UNIMPL
345 UNIMPL
346 UNIMPL
347 UNIMPL
348 UNIMPL
349 UNIMPL