blob: c2b584f830e24dd459790303bea1d958dbe0a31d [file] [log] [blame]
/****************************************************************************
| (C) Copyright 2008 Novell, Inc. All Rights Reserved.
|
| GPLv2: This program is free software; you can redistribute it
| and/or modify it under the terms of version 2 of the GNU General
| Public License as published by the Free Software Foundation.
|
| This program is distributed in the hope that it will be useful,
| but WITHOUT ANY WARRANTY; without even the implied warranty of
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
| GNU General Public License for more details.
+-------------------------------------------------------------------------*/
/*
*SYMLINK(2) Linux Programmer's Manual SYMLINK(2)
*
*
*
*NAME
* symlink - make a new name for a file
*
*SYNOPSIS
* #include <unistd.h>
*
* int symlink(const char *oldpath, const char *newpath);
*
*DESCRIPTION
* symlink creates a symbolic link named newpath which contains the
* string oldpath.
*
* Symbolic links are interpreted at run-time as if the contents of the
* link had been substituted into the path being followed to find a file
* or directory.
*
* Symbolic links may contain .. path components, which (if used at the
* start of the link) refer to the parent directories of that in which
* the link resides.
*
* A symbolic link (also known as a soft link) may point to an existing
* file or to a nonexistent one; the latter case is known as a dangling
* link.
*
* The permissions of a symbolic link are irrelevant; the ownership is
* ignored when following the link, but is checked when removal or renam?
* ing of the link is requested and the link is in a directory with the
* sticky bit (S_ISVTX) set.
*
* If newpath exists it will not be overwritten.
*
*RETURN VALUE
* On success, zero is returned. On error, -1 is returned, and errno is
* set appropriately.
*
*ERRORS
* EACCES Write access to the directory containing newpath is denied, or
* one of the directories in the path prefix of newpath did not
* allow search permission. (See also path_resolution(2).)
*
* EEXIST newpath already exists.
*
* EFAULT oldpath or newpath points outside your accessible address
* space.
*
* EIO An I/O error occurred.
*
* ELOOP Too many symbolic links were encountered in resolving newpath.
*
* ENAMETOOLONG
* oldpath or newpath was too long.
*
* ENOENT A directory component in newpath does not exist or is a dan?
* gling symbolic link, or oldpath is the empty string.
*
* ENOMEM Insufficient kernel memory was available.
*
* ENOSPC The device containing the file has no room for the new direc?
* tory entry.
*
* ENOTDIR
* A component used as a directory in newpath is not, in fact, a
* directory.
*
* EPERM The filesystem containing newpath does not support the creation
* of symbolic links.
*
* EROFS newpath is on a read-only filesystem.
*
*NOTES
* No checking of oldpath is done.
*
* Deleting the name referred to by a symlink will actually delete the
* file (unless it also has other hard links). If this behaviour is not
* desired, use link.
*
*CONFORMING TO
* SVr4, SVID, POSIX, 4.3BSD. SVr4 documents additional error codes
* SVr4, SVID, 4.3BSD, X/OPEN. SVr4 documents additional error codes
* EDQUOT and ENOSYS. See open(2) re multiple files with the same name,
* and NFS.
*
*SEE ALSO
* ln(1), link(2), lstat(2), open(2), path_resolution(2), readlink(2),
* rename(2), unlink(2)
*/
#include <unistd.h>
#include <eprintf.h>
#include <mystdlib.h>
#include <puny.h>
char *gen_name (int len)
{
static char file_name_char[] = "abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"_0123456789";
unsigned i;
char *c;
c = ezalloc(len);
for (i = 0; i < len - 1; i++) {
c[i] = file_name_char[urand(sizeof(file_name_char)-1)];
}
c[i] = '\0';
return c;
}
int main (int argc, char *argv[])
{
int rc;
char *oldpath;
char *newpath;
punyopt(argc, argv, NULL, NULL);
newpath = Option.dest;
oldpath = gen_name(Option.name_size);
rc = symlink(oldpath, newpath);
if (rc) eprintf("symlink %s -> %s failed:", oldpath, newpath);
return 0;
}