Back to index

lightning-sunbird  0.9+nobinonly
Defines | Functions | Variables
pathsub.h File Reference
#include <limits.h>
#include <sys/types.h>
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Defines

#define PATH_MAX   1024
#define NAME_MAX   256

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)

Variables

char * program

Define Documentation

#define NAME_MAX   256

Definition at line 56 of file pathsub.h.

#define PATH_MAX   1024

Definition at line 49 of file pathsub.h.


Function Documentation

void fail ( char *  format,
  ... 
)

Definition at line 69 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);
    exit(1);
}
char* getcomponent ( char *  path,
char *  name 
)

Definition at line 98 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 131 of file pathsub.c.

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

    dp = opendir("..");
    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;
}
int relatepaths ( char *  from,
char *  to,
char *  outpath 
)

Definition at line 185 of file pathsub.c.

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

    assert(*from == '/' && *to == '/');
    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;
}
void reversepath ( char *  inpath,
char *  name,
int  len,
char *  outpath 
)

Definition at line 219 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);
}
char* xbasename ( char *  path)

Definition at line 167 of file pathsub.c.

{
    char *cp;

    while ((cp = strrchr(path, '/')) && cp[1] == '\0')
       *cp = '\0';
    if (!cp) return path;
    return cp + 1;
}
void xchdir ( char *  dir)

Definition at line 178 of file pathsub.c.

{
    if (chdir(dir) < 0)
       fail("cannot change directory to %s", dir);
}
void* xmalloc ( size_t  size)

Definition at line 152 of file pathsub.c.

{
    void *p = malloc(size);
    if (!p)
       fail("cannot allocate %u bytes", size);
    return p;
}
char* xstrdup ( char *  s)

Definition at line 161 of file pathsub.c.

{
    return strcpy(xmalloc(strlen(s) + 1), s);
}

Variable Documentation

char* program

Definition at line 66 of file pathsub.c.