X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=client-src%2Fgetfsent.c;h=6f0f2752e46e3ace5e7a8a43fe0a909d2b5d8a1b;hb=f8684a927a9d8acea804cd885d5a583f3394de73;hp=516cf4eed228abafea1d7b3cabbd4e884c98bac5;hpb=eefb15c5c04acb3c75f0c704ea664feb1bbae75c;p=debian%2Famanda diff --git a/client-src/getfsent.c b/client-src/getfsent.c index 516cf4e..6f0f275 100644 --- a/client-src/getfsent.c +++ b/client-src/getfsent.c @@ -24,24 +24,22 @@ * file named AUTHORS, in the root directory of this distribution. */ /* - * $Id: getfsent.c,v 1.34 2006/01/14 04:37:18 paddy_s Exp $ + * $Id: getfsent.c,v 1.38 2006/07/19 17:41:14 martinea Exp $ * * generic version of code to read fstab */ #include "amanda.h" +#include "util.h" #ifdef TEST # include # include -# undef P -# define P(x) x #endif #include "getfsent.h" -static char *dev2rdev P((char *)); -static int samefile P((struct stat[3], struct stat *)); +static char *dev2rdev(char *); /* * You are in a twisty maze of passages, all alike. @@ -56,19 +54,22 @@ static int samefile P((struct stat[3], struct stat *)); #include -int open_fstab() +int +open_fstab(void) { return setfsent(); } -void close_fstab() +void +close_fstab(void) { endfsent(); } -int get_fstab_nextentry(fsent) -generic_fsent_t *fsent; +int +get_fstab_nextentry( + generic_fsent_t * fsent) { struct fstab *sys_fsent = getfsent(); static char *xfsname = NULL, *xmntdir = NULL; @@ -85,7 +86,7 @@ generic_fsent_t *fsent; fsent->mntopts = xmntopts = newstralloc(xmntopts, sys_fsent->fs_opts); #else #if defined(_AIX) - fsent->fstype = xfstype = newstralloc(xfstype, "unknown"); + fsent->fstype = xfstype = newstralloc(xfstype, _("unknown")); fsent->mntopts = xmntopts = newstralloc(xmntopts, sys_fsent->fs_type); #else fsent->fstype = xfstype = newstralloc(xfstype, sys_fsent->fs_vfstype); @@ -106,24 +107,28 @@ generic_fsent_t *fsent; static FILE *fstabf = NULL; -int open_fstab() +int +open_fstab(void) { close_fstab(); return (fstabf = fopen(VFSTAB, "r")) != NULL; } -void close_fstab() +void +close_fstab(void) { if(fstabf) afclose(fstabf); fstabf = NULL; } -int get_fstab_nextentry(fsent) -generic_fsent_t *fsent; +int +get_fstab_nextentry( + generic_fsent_t * fsent) { struct vfstab sys_fsent; + memset(&sys_fsent, 0, SIZEOF(sys_fsent)); if(getvfsent(fstabf, &sys_fsent) != 0) return 0; @@ -156,7 +161,8 @@ static FILE *fstabf1 = NULL; /* /proc/mounts */ static FILE *fstabf2 = NULL; /* MOUNTED */ static FILE *fstabf3 = NULL; /* MNTTAB */ -int open_fstab() +int +open_fstab(void) { close_fstab(); #if defined(HAVE_SETMNTENT) @@ -175,7 +181,8 @@ int open_fstab() return (fstabf1 != NULL || fstabf2 != NULL || fstabf3 != NULL); } -void close_fstab() +void +close_fstab(void) { if (fstabf1) { AMCLOSE_MNTENT(fstabf1); @@ -191,8 +198,9 @@ void close_fstab() } } -int get_fstab_nextentry(fsent) -generic_fsent_t *fsent; +int +get_fstab_nextentry( + generic_fsent_t * fsent) { struct mntent *sys_fsent = NULL; @@ -245,13 +253,15 @@ generic_fsent_t *fsent; static FILE *fstabf = NULL; -int open_fstab() +int +open_fstab(void) { close_fstab(); return (fstabf = fopen(FSTAB, "r")) != NULL; } -void close_fstab() +void +close_fstab(void) { if(fstabf) afclose(fstabf); @@ -260,8 +270,9 @@ void close_fstab() static generic_fsent_t _fsent; -int get_fstab_nextentry(fsent) -generic_fsent_t *fsent; +int +get_fstab_nextentry( + generic_fsent_t * fsent) { static char *lfsnam = NULL; static char *opts = NULL; @@ -271,6 +282,8 @@ generic_fsent_t *fsent; amfree(cp); for (; (cp = agets(fstabf)) != NULL; free(cp)) { + if (cp[0] == '\0') + continue; fsent->fsname = strtok(cp, " \t"); if ( fsent->fsname && *fsent->fsname != '#' ) break; @@ -302,10 +315,8 @@ generic_fsent_t *fsent; } fsent->fstype = lfsnam; -#define sc "hs" - if (strncmp(fsent->fstype, sc, sizeof(sc)-1) == 0) + if (strncmp_const(fsent->fstype, "hs") == 0) fsent->fstype = "iso9660"; -#undef sc fsent->freq = 0; fsent->passno = 0; @@ -333,13 +344,15 @@ generic_fsent_t *fsent; static FILE *fstabf = NULL; -int open_fstab() +int +open_fstab(void) { close_fstab(); return (fstabf = fopen(MNTTAB, "r")) != NULL; } -void close_fstab() +void +close_fstab(void) { if(fstabf) afclose(fstabf); @@ -348,22 +361,23 @@ void close_fstab() static generic_fsent_t _fsent; -int get_fstab_nextentry(fsent) -generic_fsent_t *fsent; +int +get_fstab_nextentry( + generic_fsent_t *fsent) { struct statfs fsd; char typebuf[FSTYPSZ]; static struct mnttab mnt; char *dp, *ep; - if(!fread (&mnt, sizeof mnt, 1, fstabf)) + if(!fread (&mnt, SIZEOF(mnt), 1, fstabf)) return 0; fsent->fsname = mnt.mt_dev; fsent->mntdir = mnt.mt_filsys; fsent->fstype = ""; - if (statfs (fsent->mntdir, &fsd, sizeof fsd, 0) != -1 + if (statfs (fsent->mntdir, &fsd, SIZEOF(fsd), 0) != -1 && sysfs (GETFSTYP, fsd.f_fstyp, typebuf) != -1) { dp = typebuf; ep = fsent->fstype = malloc(strlen(typebuf)+2); @@ -411,15 +425,16 @@ generic_fsent_t *fsent; *===================================================================== */ -static char *dev2rdev(name) -char *name; +static char * +dev2rdev( + char * name) { char *fname = NULL; struct stat st; char *s; int ch; - if(stat(name, &st) == 0 && S_ISCHR(st.st_mode)) { + if(stat(name, &st) == 0 && !S_ISBLK(st.st_mode)) { /* * If the input is already a character device, just return it. */ @@ -443,7 +458,7 @@ char *name; if (ch == '/') { s[-1] = '\0'; fname = newvstralloc(fname, name, "/r", s, NULL); - s[-1] = ch; + s[-1] = (char)ch; if(stat(fname, &st) == 0 && S_ISCHR(st.st_mode)) return fname; } ch = *s++; @@ -452,8 +467,13 @@ char *name; return stralloc(name); /* no match */ } -static int samefile(stats, estat) -struct stat stats[3], *estat; +#ifndef IGNORE_FSTAB +static int samefile(struct stat[3], struct stat *); + +static int +samefile( + struct stat stats[3], + struct stat *estat) { int i; for(i = 0; i < 3; ++i) { @@ -463,16 +483,21 @@ struct stat stats[3], *estat; } return 0; } +#endif /* !IGNORE_FSTAB */ -int search_fstab(name, fsent, check_dev) - char *name; - generic_fsent_t *fsent; - int check_dev; +int +search_fstab( + char * name, + generic_fsent_t * fsent, + int check_dev) { #ifdef IGNORE_FSTAB /* There is no real mount table so this will always fail and * we are using GNU tar so we can just return here. */ + (void)name; /* Quiet unused parameter warning */ + (void)fsent; /* Quiet unused parameter warning */ + (void)check_dev; /* Quiet unused parameter warning */ return 0; #else struct stat stats[3]; @@ -483,21 +508,22 @@ int search_fstab(name, fsent, check_dev) if (!name) return 0; - stats[0].st_dev = stats[1].st_dev = stats[2].st_dev = -1; + memset(stats, 0, SIZEOF(stats)); + stats[0].st_dev = stats[1].st_dev = stats[2].st_dev = (dev_t)-1; if (stat(name, &stats[0]) == -1) - stats[0].st_dev = -1; + stats[0].st_dev = (dev_t)-1; if (name[0] != '/') { fullname = stralloc2(DEV_PREFIX, name); if (stat(fullname, &stats[1]) == -1) - stats[1].st_dev = -1; + stats[1].st_dev = (dev_t)-1; fullname = newstralloc2(fullname, RDEV_PREFIX, name); if (stat(fullname, &stats[2]) == -1) - stats[2].st_dev = -1; + stats[2].st_dev = (dev_t)-1; amfree(fullname); } else if (stat((rdev = dev2rdev(name)), &stats[1]) == -1) - stats[1].st_dev = -1; + stats[1].st_dev = (dev_t)-1; amfree(rdev); @@ -513,9 +539,8 @@ int search_fstab(name, fsent, check_dev) amfree(rdev); - if(fsent->mntdir != NULL && - (smnt = stat(fsent->mntdir, &mntstat)) == -1) - continue; + if(fsent->mntdir != NULL) + smnt = stat(fsent->mntdir, &mntstat); if(fsent->fsname != NULL) { sfs = stat(fsent->fsname, &fsstat); @@ -543,8 +568,9 @@ int search_fstab(name, fsent, check_dev) #endif /* !IGNORE_FSTAB */ } -int is_local_fstype(fsent) -generic_fsent_t *fsent; +int +is_local_fstype( + generic_fsent_t * fsent) { if(fsent->fstype == NULL) /* unknown, assume local */ return 1; @@ -560,8 +586,9 @@ generic_fsent_t *fsent; } -char *amname_to_devname(str) -char *str; +char * +amname_to_devname( + char * str) { generic_fsent_t fsent; @@ -573,8 +600,9 @@ char *str; return dev2rdev(str); } -char *amname_to_dirname(str) -char *str; +char * +amname_to_dirname( + char * str) { generic_fsent_t fsent; @@ -586,8 +614,8 @@ char *str; return stralloc(str); } -char *amname_to_fstype(str) -char *str; +char *amname_to_fstype( + char * str) { generic_fsent_t fsent; @@ -599,128 +627,132 @@ char *str; #ifdef TEST +void print_entry(generic_fsent_t *fsent); + void -print_entry(fsent) -generic_fsent_t *fsent; +print_entry( + generic_fsent_t * fsent) { #define nchk(s) ((s)? (s) : "") - printf("%-20.20s %-14.14s %-7.7s %4d %5d %s\n", + g_printf("%-20.20s %-14.14s %-7.7s %4d %5d %s\n", nchk(fsent->fsname), nchk(fsent->mntdir), nchk(fsent->fstype), fsent->freq, fsent->passno, nchk(fsent->mntopts)); } -int main(argc, argv) - int argc; - char **argv; +int +main( + int argc, + char ** argv) { generic_fsent_t fsent; char *s; char *name = NULL; - unsigned long malloc_hist_1, malloc_size_1; - unsigned long malloc_hist_2, malloc_size_2; + + /* + * Configure program for internationalization: + * 1) Only set the message locale for now. + * 2) Set textdomain for all amanda related programs to "amanda" + * We don't want to be forced to support dozens of message catalogs. + */ + setlocale(LC_MESSAGES, "C"); + textdomain("amanda"); safe_fd(-1, 0); set_pname("getfsent"); + dbopen(NULL); + /* Don't die when child closes pipe */ signal(SIGPIPE, SIG_IGN); - malloc_size_1 = malloc_inuse(&malloc_hist_1); - if(!open_fstab()) { - fprintf(stderr, "getfsent_test: could not open fstab\n"); + g_fprintf(stderr, _("getfsent_test: could not open fstab\n")); return 1; } - printf("getfsent (%s)\n",GETFSENT_TYPE); - printf("l/r fsname mntdir fstype freq pass# mntopts\n"); + g_printf("getfsent (%s)\n",GETFSENT_TYPE); + g_printf("l/r fsname mntdir fstype freq pass# mntopts\n"); while(get_fstab_nextentry(&fsent)) { - printf("%c ",is_local_fstype(&fsent)? 'l' : 'r'); + g_printf("%c ",is_local_fstype(&fsent)? 'l' : 'r'); print_entry(&fsent); } - printf("--------\n"); + g_printf("--------\n"); close_fstab(); name = newstralloc(name, "/usr"); if(search_fstab(name, &fsent, 1) || search_fstab(name, &fsent, 0)) { - printf("Found %s mount for %s:\n", - is_local_fstype(&fsent)? "local" : "remote", name); + g_printf(_("Found %s mount for %s:\n"), + is_local_fstype(&fsent)? _("local") : _("remote"), name); print_entry(&fsent); } else - printf("Mount for %s not found\n", name); + g_printf(_("Mount for %s not found\n"), name); name = newstralloc(name, "/"); if(search_fstab(name, &fsent, 1) || search_fstab(name, &fsent, 0)) { - printf("Found %s mount for %s:\n", - is_local_fstype(&fsent)? "local" : "remote", name); + g_printf(_("Found %s mount for %s:\n"), + is_local_fstype(&fsent)? _("local") : _("remote"), name); print_entry(&fsent); } else - printf("Mount for %s not found\n", name); + g_printf(_("Mount for %s not found\n"), name); name = newstralloc(name, "/"); s = amname_to_fstype(name); - printf("fstype of `%s': %s\n", name, s); + g_printf(_("fstype of `%s': %s\n"), name, s); amfree(s); name = newstralloc(name, "/dev/root"); s = amname_to_fstype(name); - printf("fstype of `%s': %s\n", name, s); + g_printf(_("fstype of `%s': %s\n"), name, s); amfree(s); name = newstralloc(name, "/usr"); s = amname_to_fstype(name); - printf("fstype of `%s': %s\n", name, s); + g_printf(_("fstype of `%s': %s\n"), name, s); amfree(s); name = newstralloc(name, "c0t3d0s0"); s = amname_to_fstype(name); - printf("fstype of `%s': %s\n", name, s); + g_printf(_("fstype of `%s': %s\n"), name, s); amfree(s); name = newstralloc(name, "/tmp/foo"); s = amname_to_devname(name); - printf("device of `%s': %s\n", name, s); + g_printf(_("device of `%s': %s\n"), name, s); amfree(s); s = amname_to_dirname(name); - printf("dirname of `%s': %s\n", name, s); + g_printf(_("dirname of `%s': %s\n"), name, s); amfree(s); s = amname_to_fstype(name); - printf("fstype of `%s': %s\n", name, s); + g_printf(_("fstype of `%s': %s\n"), name, s); amfree(s); name = newstralloc(name, "./foo"); s = amname_to_devname(name); - printf("device of `%s': %s\n", name, s); + g_printf(_("device of `%s': %s\n"), name, s); amfree(s); s = amname_to_dirname(name); - printf("dirname of `%s': %s\n", name, s); + g_printf(_("dirname of `%s': %s\n"), name, s); amfree(s); s = amname_to_fstype(name); - printf("fstype of `%s': %s\n", name, s); + g_printf(_("fstype of `%s': %s\n"), name, s); amfree(s); while (--argc > 0) { name = newstralloc(name, *++argv); s = amname_to_devname(name); - printf("device of `%s': %s\n", name, s); + g_printf(_("device of `%s': %s\n"), name, s); amfree(s); s = amname_to_dirname(name); - printf("dirname of `%s': %s\n", name, s); + g_printf(_("dirname of `%s': %s\n"), name, s); amfree(s); s = amname_to_fstype(name); - printf("fstype of `%s': %s\n", name, s); + g_printf(_("fstype of `%s': %s\n"), name, s); amfree(s); } amfree(name); - malloc_size_2 = malloc_inuse(&malloc_hist_2); - - if(malloc_size_1 != malloc_size_2) { - malloc_list(fileno(stderr), malloc_hist_1, malloc_hist_2); - } - return 0; }