Back to index

lightning-sunbird  0.9+nobinonly
Functions | Variables
pathsub.c File Reference
#include <assert.h>
#include <dirent.h>
#include <errno.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "pathsub.h"

Go to the source code of this file.

Functions

void fail (char *format,...)
char * getcomponent (char *path, char *name)
char * ino2name (ino_t ino, char *dir)
voidxmalloc (size_t size)
char * xstrdup (char *s)
char * xbasename (char *path)
void xchdir (char *dir)
int relatepaths (char *from, char *to, char *outpath)
void reversepath (char *inpath, char *name, int len, char *outpath)
void diagnosePath (const char *path)

Variables

char * program

Function Documentation

void diagnosePath ( const char *  path)

Definition at line 257 of file pathsub.c.

{
    char *    myPath;
    char *      slash;
    int              rv;
    struct stat sb;
    char      buf[BUFSIZ];

    if (!path || !path[0]) 
       fail("Null pointer or empty string passed to mkdirs()");
    myPath = strdup(path);
    if (!myPath)
       fail("strdup() failed!");
    do {
       rv = lstat(myPath, &sb);
       if (rv < 0) {
           perror(myPath);
       } else if (S_ISLNK(sb.st_mode)) {
           rv = readlink(myPath, buf, sizeof buf);
           if (rv < 0) {
              perror("readlink");
              buf[0] = 0;
           } else {
              buf[rv] = 0;
           }
           fprintf(stderr, "%s is a link to %s\n", myPath, buf);
       } else if (S_ISDIR(sb.st_mode)) {
           fprintf(stderr, "%s is a directory\n", myPath);
           rv = access(myPath, X_OK);
           if (rv < 0) {
              fprintf(stderr, "%s: no search permission\n", myPath);
           }
       } else {
           fprintf(stderr, "%s is a file !?!\n", myPath);
           rv = access(myPath, F_OK);
           if (rv < 0) {
              fprintf(stderr, "%s does not exist\n", myPath);
           }
       }

       /* chop path off one level. */
       slash = strrchr(myPath, '/');
       if (!slash)
           slash = strrchr(myPath, '\\');
       if (!slash)
           slash = myPath;
       *slash = 0;
    } while (myPath[0]);
    free(myPath);
}

Here is the call graph for this function:

Here is the caller graph for this function:

void fail ( char *  format,
  ... 
)

Definition at line 61 of file pathsub.c.

{
    int error;
    va_list ap;

#ifdef USE_REENTRANT_LIBC
    R_STRERROR_INIT_R();
#endif

    error = errno;
    fprintf(stderr, "%s: ", program);
    va_start(ap, format);
    vfprintf(stderr, format, ap);
    va_end(ap);
    if (error) {

#ifdef USE_REENTRANT_LIBC
    R_STRERROR_R(errno);
       fprintf(stderr, ": %s", r_strerror_r);
#else
       fprintf(stderr, ": %s", strerror(errno));
#endif
    }
 
    putc('\n', stderr);
    abort();
    exit(1);
}

Here is the call graph for this function:

char* getcomponent ( char *  path,
char *  name 
)

Definition at line 91 of file pathsub.c.

{
    if (*path == '\0')
       return 0;
    if (*path == '/') {
       *name++ = '/';
    } else {
       do {
           *name++ = *path++;
       } while (*path != '/' && *path != '\0');
    }
    *name = '\0';
    while (*path == '/')
       path++;
    return path;
}
char* ino2name ( ino_t  ino,
char *  dir 
)

Definition at line 123 of file pathsub.c.

{
    DIR *dp;
    struct dirent *ep;
    char *name;

    dp = opendir("..");            /* XXX */
    if (!dp)
       fail("cannot read parent directory");
    for (;;) {
       if (!(ep = readdir(dp)))
           fail("cannot find current directory");
       if (ep->d_ino == ino)
           break;
    }
    name = xstrdup(ep->d_name);
    closedir(dp);
    return name;
}

Here is the call graph for this function:

int relatepaths ( char *  from,
char *  to,
char *  outpath 
)

Definition at line 187 of file pathsub.c.

{
    char *cp, *cp2;
    int len;
    char buf[NAME_MAX];

    assert(*from == '/' && *to == '/');
    if (!from || *from != '/')
       fail("relatepaths: from path does not start with /");
    if (!to || *to != '/')
       fail("relatepaths: to   path does not start with /");

    for (cp = to, cp2 = from; *cp == *cp2; cp++, cp2++)
       if (*cp == '\0')
           break;
    while (cp[-1] != '/')
       cp--, cp2--;
    if (cp - 1 == to) {
       /* closest common ancestor is /, so use full pathname */
       len = strlen(strcpy(outpath, to));
       if (outpath[len] != '/') {
           outpath[len++] = '/';
           outpath[len] = '\0';
       }
    } else {
       len = 0;
       while ((cp2 = getcomponent(cp2, buf)) != 0) {
           strcpy(outpath + len, "../");
           len += 3;
       }
       while ((cp = getcomponent(cp, buf)) != 0) {
           sprintf(outpath + len, "%s/", buf);
           len += strlen(outpath + len);
       }
    }
    return len;
}

Here is the call graph for this function:

void reversepath ( char *  inpath,
char *  name,
int  len,
char *  outpath 
)

Definition at line 226 of file pathsub.c.

{
    char *cp, *cp2;
    char buf[NAME_MAX];
    struct stat sb;

    cp = strcpy(outpath + PATH_MAX - (len + 1), name);
    cp2 = inpath;
    while ((cp2 = getcomponent(cp2, buf)) != 0) {
       if (strcmp(buf, ".") == 0)
           continue;
       if (strcmp(buf, "..") == 0) {
           if (stat(".", &sb) < 0)
              fail("cannot stat current directory");
           name = ino2name(sb.st_ino, "..");
           len = strlen(name);
           cp -= len + 1;
           strcpy(cp, name);
           cp[len] = '/';
           free(name);
           xchdir("..");
       } else {
           cp -= 3;
           strncpy(cp, "../", 3);
           xchdir(buf);
       }
    }
    strcpy(outpath, cp);
}

Here is the call graph for this function:

char* xbasename ( char *  path)

Definition at line 165 of file pathsub.c.

{
    char *cp;

    if (!path || !path[0]) 
       fail("Null pointer or empty string passed to xbasename()");
    while ((cp = strrchr(path, '/')) && cp[1] == '\0')
       *cp = '\0';
    if (!cp) return path;
    return cp + 1;
}

Here is the call graph for this function:

void xchdir ( char *  dir)

Definition at line 178 of file pathsub.c.

{
    if (!dir || !dir[0]) 
       fail("Null pointer or empty string passed to xchdir()");
    if (chdir(dir) < 0)
       fail("cannot change directory to %s", dir);
}

Here is the call graph for this function:

void* xmalloc ( size_t  size)

Definition at line 144 of file pathsub.c.

{
    void *p;

    if (size <= 0)
       fail("attempted to allocate %u bytes", size);
    p = malloc(size);
    if (!p)
       fail("cannot allocate %u bytes", size);
    return p;
}

Here is the call graph for this function:

char* xstrdup ( char *  s)

Definition at line 157 of file pathsub.c.

{
    if (!s || !s[0]) 
       fail("Null pointer or empty string passed to xstrdup()");
    return strcpy((char*)xmalloc(strlen(s) + 1), s);
}

Here is the call graph for this function:


Variable Documentation

char* program

Definition at line 58 of file pathsub.c.