1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License, Version 1.0 only
   6  * (the "License").  You may not use this file except in compliance
   7  * with the License.
   8  *
   9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10  * or http://www.opensolaris.org/os/licensing.
  11  * See the License for the specific language governing permissions
  12  * and limitations under the License.
  13  *
  14  * When distributing Covered Code, include this CDDL HEADER in each
  15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16  * If applicable, add the following below this CDDL HEADER, with the
  17  * fields enclosed by brackets "[]" replaced with your own identifying
  18  * information: Portions Copyright [yyyy] [name of copyright owner]
  19  *
  20  * CDDL HEADER END
  21  */
  22 /*
  23  * Copyright (c) 1996, by Sun Microsystems, Inc.
  24  * All Rights Reserved.
  25  */
  26 
  27 #pragma ident   "%Z%%M% %I%     %E% SMI"
  28 
  29 #include <stdio.h>
  30 #include <string.h>
  31 #include <sys/param.h>
  32 #include <stdlib.h>
  33 
  34 #include "rules.h"
  35 
  36 char *gettext(const char *);
  37 
  38 char *
  39 get_fname(char *fullpath)
  40 {
  41         static char buf[MAXPATHLEN];
  42         char *s;
  43         int len;
  44 
  45         strcpy(buf, fullpath);
  46         len = strlen(buf);
  47         if (len == 1) {
  48                 return ((char *) NULL);
  49         }
  50         if (buf[len-1] == '/')
  51                 buf[len-1] = (char)0;
  52         s = strrchr(buf, '/');
  53         if (s != (char *)0) {
  54                 s++;
  55                 return (s);
  56         }
  57         return ((char *) NULL);
  58 }
  59 
  60 char *
  61 get_dirname(char *fullpath)
  62 {
  63         static char buf[MAXPATHLEN];
  64         char *s;
  65         int len;
  66 
  67         strcpy(buf, fullpath);
  68         len = strlen(buf);
  69         if (len == 1)
  70                 return (buf);
  71         if (buf[len-1] == '/')
  72                 buf[len-1] = '\0';
  73         s = strrchr(buf, '/');
  74         if (s != (char *)0) {
  75                 if (s != buf) {
  76                         *s = '\0';
  77                 } else {
  78                         s++;
  79                         *s = '\0';
  80                 }
  81                 return (buf);
  82         }
  83         return ((char *) NULL);
  84 }
  85 
  86 FILE *
  87 open_rulesfile()
  88 {
  89         int pid;
  90         char rulesnam[MAXPATHLEN];
  91         FILE *rfd;
  92         int err;
  93 
  94         pid = getpid();
  95 
  96 #ifdef CFS_PK_CURD
  97         /*
  98          * Try to creat file in current directory
  99          */
 100         sprintf(rulesnam, "./%s.%d", TMPRULES, pid);
 101         rfd = fopen(rulesnam, "w");
 102         if (rfd != NULL) fclose(rfd);
 103         rfd = fopen(rulesnam, "r+");
 104         if (rfd != NULL) {
 105 #ifdef DEBUG
 106                 printf("open_rulesfile: tmp rules file = %s\n", rulesnam);
 107 #endif /* DEBUG */
 108                 goto unlink;
 109         }
 110 #endif /* CFS_PK_CURD */
 111 
 112         /*
 113          * try to create file in /tmp directory
 114          */
 115         sprintf(rulesnam, "/tmp/%s.%d", TMPRULES, pid);
 116         rfd = fopen(rulesnam, "w");
 117         if (rfd != NULL) fclose(rfd);
 118         rfd = fopen(rulesnam, "r+");
 119         if (rfd != NULL) {
 120 #ifdef DEBUG
 121                 printf("open_rulesfile: tmp rules file = %s\n", rulesnam);
 122 #endif /* DEBUG */
 123                 goto unlink;
 124         }
 125         perror("cachefspack: Can't open packing rules file\n");
 126         exit(1);
 127 
 128 unlink:
 129 #ifndef DEBUG
 130         err = unlink(rulesnam);
 131         if (err < 0) {
 132                 perror("error unlinking temporary packing rules file");
 133                 exit(1);
 134         }
 135 #endif /* ! DEBUG */
 136 
 137         return (rfd);
 138 }
 139 
 140 /*
 141  * mstrdup - my strdup
 142  *
 143  * This is done so there is common error processing for all strdup(s).
 144  */
 145 char *
 146 mstrdup(const char *str)
 147 {
 148         char *s;
 149 
 150         s = strdup(str);
 151         if (s == (char *)0) {
 152                 fprintf(stderr, gettext("strdup failed - no space"));
 153                 exit(1);
 154         }
 155         return (s);
 156 }
 157 
 158 /*
 159  * mmalloc - my malloc
 160  *
 161  * This is done so there is common error processing for all malloc(s).
 162  */
 163 void *
 164 mmalloc(size_t size)
 165 {
 166         void *p;
 167 
 168         p = malloc(size);
 169         if (p == NULL) {
 170                 fprintf(stderr, gettext("malloc  failed - no space"));
 171                 exit(1);
 172         }
 173         return (p);
 174 }