From 046bcfc4ad89bc8cc8be7bf416645e56593ed8a0 Mon Sep 17 00:00:00 2001 From: Fritz Elfert Date: Thu, 14 Feb 2002 06:24:33 +0000 Subject: - Unified headers. --- lib/plpintl.h | 29 ++ plpnfsd/builtins.h | 27 +- plpnfsd/main.cc | 819 +++++++++++++++++++++++++++-------------------------- plpnfsd/mp_main.c | 277 +++++++++--------- plpnfsd/rfsv_api.h | 27 +- 5 files changed, 640 insertions(+), 539 deletions(-) diff --git a/lib/plpintl.h b/lib/plpintl.h index cd97428..382fd6d 100644 --- a/lib/plpintl.h +++ b/lib/plpintl.h @@ -1,3 +1,26 @@ +/*-*-c++-*- + * $Id$ + * + * This file is part of plptools. + * + * Copyright (C) 1999 Philip Proudman + * Copyright (C) 1999-2001 Fritz Elfert + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ #ifndef _INTL_H_ #define _INTL_H_ @@ -33,3 +56,9 @@ extern inline char * stpcpy(char *dest, const char *src) { #define HAVE_GETTEXT 1 #endif /* _INTL_H_ */ + +/* + * Local variables: + * c-basic-offset: 4 + * End: + */ diff --git a/plpnfsd/builtins.h b/plpnfsd/builtins.h index 644f18b..1eda763 100644 --- a/plpnfsd/builtins.h +++ b/plpnfsd/builtins.h @@ -1,7 +1,25 @@ -/* +/*-*-c++-*- * $Id$ + * + * This file is part of plptools. + * + * Copyright (C) 1999-2001 Fritz Elfert + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * */ - #ifndef _BUILTINS_H_ #define _BUILTINS_H_ @@ -52,3 +70,8 @@ extern long generic_getdents(builtin_node *node, dentry **entries); #endif /* _BUILTINS_H_ */ +/* + * Local variables: + * c-basic-offset: 4 + * End: + */ diff --git a/plpnfsd/main.cc b/plpnfsd/main.cc index 508649f..ecc9a14 100644 --- a/plpnfsd/main.cc +++ b/plpnfsd/main.cc @@ -1,8 +1,25 @@ -// $Id$ -// -// Copyright (C) 1999 Fritz Elfert -// - +/*-*-c++-*- + * $Id$ + * + * This file is part of plptools. + * + * Copyright (C) 1999-2001 Fritz Elfert + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ #ifdef HAVE_CONFIG_H #include #endif @@ -37,479 +54,485 @@ static rpcsfactory *rp; static bufferStore owner; long rpcs_isalive() { - long s; - - if (!r) { - if (!(r = rp->create(true))) - return 0; - } - s = r->getStatus(); - if (s == rfsv::E_PSI_FILE_DISC) - r->reconnect(); - return (r->getStatus() == rfsv::E_PSI_GEN_NONE); + long s; + + if (!r) { + if (!(r = rp->create(true))) + return 0; + } + s = r->getStatus(); + if (s == rfsv::E_PSI_FILE_DISC) + r->reconnect(); + return (r->getStatus() == rfsv::E_PSI_GEN_NONE); } long rpcs_ownerRead(builtin_node *, char *buf, unsigned long offset, long len) { - if (offset >= (owner.getLen() - 1)) - return 0; - const char *s = owner.getString(offset); - int sl = strlen(s); - if (sl > len) - sl = len; - strncpy(buf, s, sl); - return sl; + if (offset >= (owner.getLen() - 1)) + return 0; + const char *s = owner.getString(offset); + int sl = strlen(s); + if (sl > len) + sl = len; + strncpy(buf, s, sl); + return sl; } long rpcs_ownerSize(builtin_node *) { - Enum res; - bufferArray a; - - if (!rpcs_isalive()) - return 0; - res = r->getOwnerInfo(a); - owner.init(); - if (res == rfsv::E_PSI_GEN_NONE) { - while (!a.empty()) { - owner.addString(a.pop().getString()); - owner.addByte('\n'); - } + Enum res; + bufferArray a; + + if (!rpcs_isalive()) + return 0; + res = r->getOwnerInfo(a); + owner.init(); + if (res == rfsv::E_PSI_GEN_NONE) { + while (!a.empty()) { + owner.addString(a.pop().getString()); + owner.addByte('\n'); } - owner.addByte(0); - return owner.getLen() - 1; + } + owner.addByte(0); + return owner.getLen() - 1; } static long psread(builtin_node *node, char *buf, unsigned long offset, long len) { - char *s = (char *)node->private_data; - - if (!s) - return 0; - if (offset >= ((unsigned long)node->size - 1)) - return 0; - s += offset; - int sl = node->size - offset; - if (sl > len) - sl = len; - strncpy(buf, s, sl); - return sl; + char *s = (char *)node->private_data; + + if (!s) + return 0; + if (offset >= ((unsigned long)node->size - 1)) + return 0; + s += offset; + int sl = node->size - offset; + if (sl > len) + sl = len; + strncpy(buf, s, sl); + return sl; } long rpcs_ps() { - Enum res; - bufferArray psbuf; - - if (!rpcs_isalive()) - return -1; - res = r->queryDrive('C', psbuf); - if (res != rfsv::E_PSI_GEN_NONE) - return -1; - while (!psbuf.empty()) { - builtin_node *dn; - builtin_node *fn1; - builtin_node *fn2; - builtin_node *bn; - char bname[40]; - - bufferStore bs = psbuf.pop(); - bufferStore bs2 = psbuf.pop(); - sprintf(bname, "%d", bs.getWord(0)); - - dn = (builtin_node *)malloc(sizeof(builtin_node)); - if (!dn) - return -1; - fn1 = (builtin_node *)malloc(sizeof(builtin_node)); - if (!fn1) { - free(dn); - return -1; - } - fn2 = (builtin_node *)malloc(sizeof(builtin_node)); - if (!fn2) { - free(fn1); - free(dn); - return -1; - } - memset(dn, 0, sizeof(builtin_node)); - memset(fn1, 0, sizeof(builtin_node)); - memset(fn2, 0, sizeof(builtin_node)); - - /** - * Directory, named by the PID - */ - dn->flags = BF_ISPROCESS; - dn->name = bname; - dn->attr = PSI_A_DIR; - dn->getlinks = generic_getlinks; - dn->getdents = generic_getdents; - - fn1->name = "cmd"; - fn1->attr = PSI_A_READ | PSI_A_RDONLY; - fn1->private_data = (char *)malloc(strlen(bs.getString(2))+2); - if (!fn1->private_data) { - free(fn1); - free(fn2); - free(dn); - return -1; - } - fn1->read = psread; - sprintf(fn1->private_data, "%s\n", bs.getString(2)); - fn1->size = strlen(fn1->private_data); - - fn2->name = "args"; - fn2->attr = PSI_A_READ | PSI_A_RDONLY; - fn2->private_data = (char *)malloc(strlen(bs2.getString())+2); - if (!fn2->private_data) { - free(fn1->private_data); - free(fn1); - free(fn2); - free(dn); - return -1; - } - fn2->read = psread; - sprintf(fn2->private_data, "%s\n", bs2.getString()); - fn2->size = strlen(fn2->private_data); - - if (!(bn = register_builtin("proc", dn))) { - free(fn1->private_data); - free(fn1); - free(fn2->private_data); - free(fn2); - free(dn); - return -1; - } - strcpy(bname, builtin_path(bn)); - if (!register_builtin(bname, fn1)) { - free(fn1->private_data); - free(fn1); - free(fn2->private_data); - free(fn2); - unregister_builtin(bn); - free(dn); - return -1; - } - if (!register_builtin(bname, fn2)) { - free(fn2->private_data); - free(fn2); - unregister_builtin(bn); - free(dn); - return -1; - } - free(fn1); - free(fn2); - free(dn); + Enum res; + bufferArray psbuf; + + if (!rpcs_isalive()) + return -1; + res = r->queryDrive('C', psbuf); + if (res != rfsv::E_PSI_GEN_NONE) + return -1; + while (!psbuf.empty()) { + builtin_node *dn; + builtin_node *fn1; + builtin_node *fn2; + builtin_node *bn; + char bname[40]; + + bufferStore bs = psbuf.pop(); + bufferStore bs2 = psbuf.pop(); + sprintf(bname, "%d", bs.getWord(0)); + + dn = (builtin_node *)malloc(sizeof(builtin_node)); + if (!dn) + return -1; + fn1 = (builtin_node *)malloc(sizeof(builtin_node)); + if (!fn1) { + free(dn); + return -1; } - return 0; + fn2 = (builtin_node *)malloc(sizeof(builtin_node)); + if (!fn2) { + free(fn1); + free(dn); + return -1; + } + memset(dn, 0, sizeof(builtin_node)); + memset(fn1, 0, sizeof(builtin_node)); + memset(fn2, 0, sizeof(builtin_node)); + + /** + * Directory, named by the PID + */ + dn->flags = BF_ISPROCESS; + dn->name = bname; + dn->attr = PSI_A_DIR; + dn->getlinks = generic_getlinks; + dn->getdents = generic_getdents; + + fn1->name = "cmd"; + fn1->attr = PSI_A_READ | PSI_A_RDONLY; + fn1->private_data = (char *)malloc(strlen(bs.getString(2))+2); + if (!fn1->private_data) { + free(fn1); + free(fn2); + free(dn); + return -1; + } + fn1->read = psread; + sprintf(fn1->private_data, "%s\n", bs.getString(2)); + fn1->size = strlen(fn1->private_data); + + fn2->name = "args"; + fn2->attr = PSI_A_READ | PSI_A_RDONLY; + fn2->private_data = (char *)malloc(strlen(bs2.getString())+2); + if (!fn2->private_data) { + free(fn1->private_data); + free(fn1); + free(fn2); + free(dn); + return -1; + } + fn2->read = psread; + sprintf(fn2->private_data, "%s\n", bs2.getString()); + fn2->size = strlen(fn2->private_data); + + if (!(bn = register_builtin("proc", dn))) { + free(fn1->private_data); + free(fn1); + free(fn2->private_data); + free(fn2); + free(dn); + return -1; + } + strcpy(bname, builtin_path(bn)); + if (!register_builtin(bname, fn1)) { + free(fn1->private_data); + free(fn1); + free(fn2->private_data); + free(fn2); + unregister_builtin(bn); + free(dn); + return -1; + } + if (!register_builtin(bname, fn2)) { + free(fn2->private_data); + free(fn2); + unregister_builtin(bn); + free(dn); + return -1; + } + free(fn1); + free(fn2); + free(dn); + } + return 0; } long rfsv_isalive() { - if (!a) { - if (!(a = rf->create(true))) - return 0; - } - return (a->getStatus() == rfsv::E_PSI_GEN_NONE); + if (!a) { + if (!(a = rf->create(true))) + return 0; + } + return (a->getStatus() == rfsv::E_PSI_GEN_NONE); } long rfsv_dir(const char *file, dentry **e) { - PlpDir entries; - dentry *tmp; - long ret; - - if (!a) - return -1; - ret = a->dir(file, entries); - - for (int i = 0; i < entries.size(); i++) { - PlpDirent pe = entries[i]; - tmp = *e; - *e = (dentry *)malloc(sizeof(dentry)); - if (!*e) - return -1; - (*e)->time = pe.getPsiTime().getTime(); - (*e)->size = pe.getSize(); - (*e)->attr = pe.getAttr(); - (*e)->name = strdup(pe.getName()); - (*e)->next = tmp; - } - return ret; + PlpDir entries; + dentry *tmp; + long ret; + + if (!a) + return -1; + ret = a->dir(file, entries); + + for (int i = 0; i < entries.size(); i++) { + PlpDirent pe = entries[i]; + tmp = *e; + *e = (dentry *)malloc(sizeof(dentry)); + if (!*e) + return -1; + (*e)->time = pe.getPsiTime().getTime(); + (*e)->size = pe.getSize(); + (*e)->attr = pe.getAttr(); + (*e)->name = strdup(pe.getName()); + (*e)->next = tmp; + } + return ret; } long rfsv_dircount(const char *file, u_int32_t *count) { - if (!a) - return -1; - return a->dircount(file, *count); + if (!a) + return -1; + return a->dircount(file, *count); } long rfsv_rmdir(const char *name) { - if (!a) - return -1; - return a->rmdir(name); + if (!a) + return -1; + return a->rmdir(name); } long rfsv_mkdir(const char *file) { - if (!a) - return -1; - return a->mkdir(file); + if (!a) + return -1; + return a->mkdir(file); } long rfsv_closecached() { - if (!a) - return -1; - if (!a_filename) - return 0; - a->fclose(a_handle); - free(a_filename); - a_filename = 0; + if (!a) + return -1; + if (!a_filename) return 0; + a->fclose(a_handle); + free(a_filename); + a_filename = 0; + return 0; } long rfsv_remove(const char *file) { - if (!a) - return -1; - if (a_filename && !strcmp(a_filename, file)) - rfsv_closecached(); - return a->remove(file); + if (!a) + return -1; + if (a_filename && !strcmp(a_filename, file)) + rfsv_closecached(); + return a->remove(file); } long rfsv_fclose(long handle) { - if (!a) - return -1; - if (a_filename && (handle == a_handle)) { - free(a_filename); - a_filename = 0; - } - return a->fclose(handle); + if (!a) + return -1; + if (a_filename && (handle == a_handle)) { + free(a_filename); + a_filename = 0; + } + return a->fclose(handle); } long rfsv_fcreate(long attr, const char *file, u_int32_t *handle) { - u_int32_t ph; - long ret; - - if (!a) - return -1; - if (a_filename && !strcmp(a_filename, file)) - rfsv_closecached(); - ret = a->fcreatefile(attr, file, ph); - *handle = ph; - return ret; + u_int32_t ph; + long ret; + + if (!a) + return -1; + if (a_filename && !strcmp(a_filename, file)) + rfsv_closecached(); + ret = a->fcreatefile(attr, file, ph); + *handle = ph; + return ret; } static long rfsv_opencached(const char *name, long mode) { - long ret; - int retry = 100; - - if (!a) - return -1; - while (((ret = a->fopen(a->opMode(mode), name, a_handle)) - == rfsv::E_PSI_GEN_INUSE) && retry--) - ; - if (ret) - return ret; - a_offset = 0; - a_openmode = mode; - a_filename = strdup(name); + long ret; + int retry = 100; + + if (!a) + return -1; + while (((ret = a->fopen(a->opMode(mode), name, a_handle)) + == rfsv::E_PSI_GEN_INUSE) && retry--) + ; + if (ret) return ret; + a_offset = 0; + a_openmode = mode; + a_filename = strdup(name); + return ret; } long rfsv_read(char *buf, long offset, long len, char *name) { - u_int32_t ret = 0; - u_int32_t r_offset; - - if (!a) - return -1; - if (!a_filename || strcmp(a_filename, name) || a_openmode != rfsv::PSI_O_RDONLY) { - rfsv_closecached(); - if((ret = rfsv_opencached(name, rfsv::PSI_O_RDONLY))) - return ret; - } - if (a_offset != offset) { - if (a->fseek(a_handle, offset, rfsv::PSI_SEEK_SET, r_offset) != rfsv::E_PSI_GEN_NONE) - return -1; - if (offset != r_offset) - return -1; - } - a_offset = offset; - if (a->fread(a_handle, (unsigned char *)buf, len, ret) != rfsv::E_PSI_GEN_NONE) - return -1; - a_offset += ret; - return ret; + u_int32_t ret = 0; + u_int32_t r_offset; + + if (!a) + return -1; + if (!a_filename || strcmp(a_filename, name) || a_openmode != rfsv::PSI_O_RDONLY) { + rfsv_closecached(); + if((ret = rfsv_opencached(name, rfsv::PSI_O_RDONLY))) + return ret; + } + if (a_offset != offset) { + if (a->fseek(a_handle, offset, rfsv::PSI_SEEK_SET, r_offset) != rfsv::E_PSI_GEN_NONE) + return -1; + if (offset != r_offset) + return -1; + } + a_offset = offset; + if (a->fread(a_handle, (unsigned char *)buf, len, ret) != rfsv::E_PSI_GEN_NONE) + return -1; + a_offset += ret; + return ret; } long rfsv_write(char *buf, long offset, long len, char *name) { - u_int32_t ret = 0; - u_int32_t r_offset; - - if (!a) - return -1; - - if (!a_filename || strcmp(a_filename, name) || a_openmode != rfsv::PSI_O_RDWR) { - if ((ret = rfsv_closecached())) - return ret; - if ((ret = rfsv_opencached(name, rfsv::PSI_O_RDWR))) - return ret; - } - if (a_offset != offset) { - if (a->fseek(a_handle, offset, rfsv::PSI_SEEK_SET, r_offset) != rfsv::E_PSI_GEN_NONE) - return -1; - if (offset != r_offset) - return -1; - } - a_offset = offset; - if (a->fwrite(a_handle, (unsigned char *)buf, len, ret) != rfsv::E_PSI_GEN_NONE) - return -1; - a_offset += ret; - return ret; + u_int32_t ret = 0; + u_int32_t r_offset; + + if (!a) + return -1; + + if (!a_filename || strcmp(a_filename, name) || a_openmode != rfsv::PSI_O_RDWR) { + if ((ret = rfsv_closecached())) + return ret; + if ((ret = rfsv_opencached(name, rfsv::PSI_O_RDWR))) + return ret; + } + if (a_offset != offset) { + if (a->fseek(a_handle, offset, rfsv::PSI_SEEK_SET, r_offset) != rfsv::E_PSI_GEN_NONE) + return -1; + if (offset != r_offset) + return -1; + } + a_offset = offset; + if (a->fwrite(a_handle, (unsigned char *)buf, len, ret) != rfsv::E_PSI_GEN_NONE) + return -1; + a_offset += ret; + return ret; } long rfsv_setmtime(const char *name, long time) { - if (!a) - return -1; - if (a_filename && !strcmp(a_filename, name)) - rfsv_closecached(); - return a->fsetmtime(name, PsiTime(time)); + if (!a) + return -1; + if (a_filename && !strcmp(a_filename, name)) + rfsv_closecached(); + return a->fsetmtime(name, PsiTime(time)); } long rfsv_setsize(const char *name, long size) { - u_int32_t ph; - long ret; - - if (!a) - return -1; - if (a_filename && !strcmp(name, a_filename)) - return a->fsetsize(a_handle, size); - ret = a->fopen(a->opMode(rfsv::PSI_O_RDWR), name, ph); - if (!ret) { - ret = a->fsetsize(ph, size); - a->fclose(ph); - } - return ret; + u_int32_t ph; + long ret; + + if (!a) + return -1; + if (a_filename && !strcmp(name, a_filename)) + return a->fsetsize(a_handle, size); + ret = a->fopen(a->opMode(rfsv::PSI_O_RDWR), name, ph); + if (!ret) { + ret = a->fsetsize(ph, size); + a->fclose(ph); + } + return ret; } long rfsv_setattr(const char *name, long sattr, long dattr) { - if (!a) - return -1; - if (a_filename && !strcmp(name, a_filename)) - rfsv_closecached(); - return a->fsetattr(name, dattr, sattr); + if (!a) + return -1; + if (a_filename && !strcmp(name, a_filename)) + rfsv_closecached(); + return a->fsetattr(name, dattr, sattr); } long rfsv_getattr(const char *name, long *attr, long *size, long *time) { - long res; - PlpDirent e; - - if (!a) - return -1; - res = a->fgeteattr(name, e); - *attr = e.getAttr(); - *size = e.getSize(); - *time = e.getPsiTime().getTime(); - return res; + long res; + PlpDirent e; + + if (!a) + return -1; + res = a->fgeteattr(name, e); + *attr = e.getAttr(); + *size = e.getSize(); + *time = e.getPsiTime().getTime(); + return res; } long rfsv_statdev(char letter) { - PlpDrive drive; + PlpDrive drive; - if (!a) - return -1; - return (a->devinfo(letter, drive) != rfsv::E_PSI_GEN_NONE); + if (!a) + return -1; + return (a->devinfo(letter, drive) != rfsv::E_PSI_GEN_NONE); } long rfsv_rename(const char *oldname, const char *newname) { - if (!a) - return -1; - return a->rename(oldname, newname); + if (!a) + return -1; + return a->rename(oldname, newname); } long rfsv_drivelist(int *cnt, device **dlist) { - *dlist = NULL; - u_int32_t devbits; - long ret; - int i; - - if (!a) - return -1; - ret = a->devlist(devbits); - if (ret == 0) - for (i = 0; i<26; i++) { - PlpDrive drive; - - if ((devbits & 1) && - ((a->devinfo(i + 'A', drive) == rfsv::E_PSI_GEN_NONE))) { - - device *next = *dlist; - *dlist = (device *)malloc(sizeof(device)); - (*dlist)->next = next; - (*dlist)->name = strdup(drive.getName().c_str()); - (*dlist)->total = drive.getSize(); - (*dlist)->free = drive.getSpace(); - (*dlist)->letter = 'A' + i; - (*dlist)->attrib = drive.getMediaType(); - (*cnt)++; - } - devbits >>= 1; - } - return ret; + *dlist = NULL; + u_int32_t devbits; + long ret; + int i; + + if (!a) + return -1; + ret = a->devlist(devbits); + if (ret == 0) + for (i = 0; i<26; i++) { + PlpDrive drive; + + if ((devbits & 1) && + ((a->devinfo(i + 'A', drive) == rfsv::E_PSI_GEN_NONE))) { + + device *next = *dlist; + *dlist = (device *)malloc(sizeof(device)); + (*dlist)->next = next; + (*dlist)->name = strdup(drive.getName().c_str()); + (*dlist)->total = drive.getSize(); + (*dlist)->free = drive.getSpace(); + (*dlist)->letter = 'A' + i; + (*dlist)->attrib = drive.getMediaType(); + (*cnt)++; + } + devbits >>= 1; + } + return ret; } void usage() { - cerr << "usage: plpnfsd [-v] [-V] [-p port] [-d mountdir] [-u user]\n"; - exit(1); + cerr << "usage: plpnfsd [-v] [-V] [-p port] [-d mountdir] [-u user]\n"; + exit(1); } int main(int argc, char**argv) { - ppsocket *skt; - ppsocket *skt2; - char *user = 0L; - char *mdir = DMOUNTPOINT; - int sockNum = DPORT; - int verbose = 0; - int status = 0; - - struct servent *se = getservbyname("psion", "tcp"); - endservent(); - if (se != 0L) - sockNum = ntohs(se->s_port); - - for (int i = 1; i < argc; i++) { - if (!strcmp(argv[i], "-p") && i + 1 < argc) { - sockNum = atoi(argv[++i]); - } else if (!strcmp(argv[i], "-d") && i + 1 < argc) { - mdir = argv[++i]; - } else if (!strcmp(argv[i], "-u") && i + 1 < argc) { - user = argv[++i]; - } else if (!strcmp(argv[i], "-v")) { - verbose++; - } else if (!strcmp(argv[i], "-D")) { - debug++; - } else if (!strcmp(argv[i], "-V")) { - cout << "plpnfsd version " << VERSION << endl; - exit(0); - } else - usage(); - } - - skt = new ppsocket(); - if (!skt->connect(NULL, sockNum)) { - cerr << "plpnfsd: could not connect to ncpd" << endl; - status = 1; - } - skt2 = new ppsocket(); - if (!skt2->connect(NULL, sockNum)) { - cerr << "plpnfsd: could not connect to ncpd" << endl; - status = 1; - } - if (status == 0) { - rf = new rfsvfactory(skt); - rp = new rpcsfactory(skt2); - a = rf->create(true); - r = rp->create(true); - openlog("plpnfsd", LOG_PID|LOG_CONS, LOG_DAEMON); - if ((a != NULL) && (r != NULL)) - syslog(LOG_INFO, "connected, status is %d", status); - else - syslog(LOG_INFO, "could not create rfsv or rpcs object, connect delayed"); - status = mp_main(verbose, mdir, user); - delete a; - delete r; - } - exit(status); + ppsocket *skt; + ppsocket *skt2; + char *user = 0L; + char *mdir = DMOUNTPOINT; + int sockNum = DPORT; + int verbose = 0; + int status = 0; + + struct servent *se = getservbyname("psion", "tcp"); + endservent(); + if (se != 0L) + sockNum = ntohs(se->s_port); + + for (int i = 1; i < argc; i++) { + if (!strcmp(argv[i], "-p") && i + 1 < argc) { + sockNum = atoi(argv[++i]); + } else if (!strcmp(argv[i], "-d") && i + 1 < argc) { + mdir = argv[++i]; + } else if (!strcmp(argv[i], "-u") && i + 1 < argc) { + user = argv[++i]; + } else if (!strcmp(argv[i], "-v")) { + verbose++; + } else if (!strcmp(argv[i], "-D")) { + debug++; + } else if (!strcmp(argv[i], "-V")) { + cout << "plpnfsd version " << VERSION << endl; + exit(0); + } else + usage(); + } + + skt = new ppsocket(); + if (!skt->connect(NULL, sockNum)) { + cerr << "plpnfsd: could not connect to ncpd" << endl; + status = 1; + } + skt2 = new ppsocket(); + if (!skt2->connect(NULL, sockNum)) { + cerr << "plpnfsd: could not connect to ncpd" << endl; + status = 1; + } + if (status == 0) { + rf = new rfsvfactory(skt); + rp = new rpcsfactory(skt2); + a = rf->create(true); + r = rp->create(true); + openlog("plpnfsd", LOG_PID|LOG_CONS, LOG_DAEMON); + if ((a != NULL) && (r != NULL)) + syslog(LOG_INFO, "connected, status is %d", status); + else + syslog(LOG_INFO, "could not create rfsv or rpcs object, connect delayed"); + status = mp_main(verbose, mdir, user); + delete a; + delete r; + } + exit(status); } + +/* + * Local variables: + * c-basic-offset: 4 + * End: + */ diff --git a/plpnfsd/mp_main.c b/plpnfsd/mp_main.c index e83e15a..719af42 100644 --- a/plpnfsd/mp_main.c +++ b/plpnfsd/mp_main.c @@ -46,11 +46,11 @@ time_t devcache_stamp = 0; fattr root_fattr = { - NFDIR, 0040500, 1, 0, 0, - BLOCKSIZE, BLOCKSIZE, FID, 1, FID, 1, - {0, 0}, - {0, 0}, - {0, 0} + NFDIR, 0040500, 1, 0, 0, + BLOCKSIZE, BLOCKSIZE, FID, 1, FID, 1, + {0, 0}, + {0, 0}, + {0, 0} }; #if defined(hpux) || defined(__SVR4) || defined(__sgi) @@ -59,11 +59,11 @@ void usleep(usec) int usec; { - struct timeval t; + struct timeval t; - t.tv_sec = (long) (usec / 1000000); - t.tv_usec = (long) (usec % 1000000); - select(0, (fd_set *) 0, (fd_set *) 0, (fd_set *) 0, &t); + t.tv_sec = (long) (usec / 1000000); + t.tv_usec = (long) (usec % 1000000); + select(0, (fd_set *) 0, (fd_set *) 0, (fd_set *) 0, &t); } #endif #endif /* hpux */ @@ -71,154 +71,159 @@ int usec; int debuglog(char *fmt, ...) { - va_list ap; - char *buf; - - if (!debug) - return 0; - buf = (char *)malloc(1024); - va_start(ap, fmt); - vsnprintf(buf, 1024, fmt, ap); - syslog(LOG_DEBUG, buf); - free(buf); - va_end(ap); + va_list ap; + char *buf; + + if (!debug) return 0; + buf = (char *)malloc(1024); + va_start(ap, fmt); + vsnprintf(buf, 1024, fmt, ap); + syslog(LOG_DEBUG, buf); + free(buf); + va_end(ap); + return 0; } int errorlog(char *fmt, ...) { - va_list ap; - char *buf = (char *)malloc(1024); - - va_start(ap, fmt); - vsnprintf(buf, 1024, fmt, ap); - va_end(ap); - syslog(LOG_ERR, buf); - free(buf); - return 0; + va_list ap; + char *buf = (char *)malloc(1024); + + va_start(ap, fmt); + vsnprintf(buf, 1024, fmt, ap); + va_end(ap); + syslog(LOG_ERR, buf); + free(buf); + return 0; } int infolog(char *fmt, ...) { - va_list ap; - char *buf = (char *)malloc(1024); - - va_start(ap, fmt); - vsnprintf(buf, 1024, fmt, ap); - syslog(LOG_INFO, buf); - free(buf); - va_end(ap); - return 0; + va_list ap; + char *buf = (char *)malloc(1024); + + va_start(ap, fmt); + vsnprintf(buf, 1024, fmt, ap); + syslog(LOG_INFO, buf); + free(buf); + va_end(ap); + return 0; } int force_cache_clean = 0; int set_owner(char *user, int logstdio) { - struct passwd *pw = NULL; - - if (user && *user) { - if (!(pw = getpwnam(user))) { - if (logstdio) - fprintf(stderr, "User %s not found.\n", user); - else - errorlog("User %s not found.\n", user); - endpwent(); - return 1; - } - if (getuid() && pw->pw_uid != getuid()) { - if (logstdio) - fprintf(stderr, "Only root can set owner to someone other.\n"); - else - errorlog("Only root can set owner to someone other.\n"); - endpwent(); - return 1; - } - } else { - if (!logstdio) { - errorlog("Request to change owner with empty argument.\n"); - return 1; - } - if (!(pw = getpwuid(getuid()))) { - fprintf(stderr, "You don't exist, go away!\n"); - endpwent(); - return 1; - } + struct passwd *pw = NULL; + + if (user && *user) { + if (!(pw = getpwnam(user))) { + if (logstdio) + fprintf(stderr, "User %s not found.\n", user); + else + errorlog("User %s not found.\n", user); + endpwent(); + return 1; } - if (pw) { - if ((root_fattr.uid != pw->pw_uid) || (root_fattr.gid != pw->pw_gid)) { - struct group *g = getgrgid(pw->pw_gid); - char *gname = (g && g->gr_name && *(g->gr_name)) ? g->gr_name : "???"; - - root_fattr.uid = pw->pw_uid; - root_fattr.gid = pw->pw_gid; - if (logstdio) - printf("Owner set to %s.%s\n", pw->pw_name, gname); - else - infolog("Owner set to %s.%s\n", pw->pw_name, gname); - endgrent(); - force_cache_clean = 1; - cache_flush(); - } + if (getuid() && pw->pw_uid != getuid()) { + if (logstdio) + fprintf(stderr, "Only root can set owner to someone other.\n"); + else + errorlog("Only root can set owner to someone other.\n"); + endpwent(); + return 1; } - endpwent(); - return 0; + } else { + if (!logstdio) { + errorlog("Request to change owner with empty argument.\n"); + return 1; + } + if (!(pw = getpwuid(getuid()))) { + fprintf(stderr, "You don't exist, go away!\n"); + endpwent(); + return 1; + } + } + if (pw) { + if ((root_fattr.uid != pw->pw_uid) || (root_fattr.gid != pw->pw_gid)) { + struct group *g = getgrgid(pw->pw_gid); + char *gname = (g && g->gr_name && *(g->gr_name)) ? g->gr_name : "???"; + root_fattr.uid = pw->pw_uid; + root_fattr.gid = pw->pw_gid; + if (logstdio) + printf("Owner set to %s.%s\n", pw->pw_name, gname); + else + infolog("Owner set to %s.%s\n", pw->pw_name, gname); + endgrent(); + force_cache_clean = 1; + cache_flush(); + } + } + endpwent(); + return 0; } int mp_main(int verbose, char *dir, char *user) { - struct passwd *pw; - struct timeval tv; - struct timezone tz; - p_inode *rp; - nfs_fh root_fh; - DIR *dirp; - DIRENT *diep; - int i; - - - if (!(pw = getpwuid(getuid()))) { - fprintf(stderr, "You don't exist, go away!\n"); - return 1; - } - if (!user) { - if (!(user = (char *) getenv("USER"))) - user = (char *) getenv("logname"); - } - endpwent(); - if (set_owner(user, 1)) - return 1; - gettimeofday(&tv, &tz); - - debug = verbose; - if (debug) - printf("plpnfsd: version %s, mounting on %s ...\n", VERSION, dir); - - /* Check if mountdir is empty (or else you can overmount e.g /etc) - It is done here, because exit hangs, if hardware flowcontrol is - not present. Bugreport Nov 28 1996 by Olaf Flebbe */ - if (!(dirp = opendir(dir))) { - perror(dir); - return 1; - } - i = 0; - while ((diep = readdir(dirp)) != 0) - if (strcmp(diep->d_name, ".") && strcmp(diep->d_name, "..")) - i++; - closedir(dirp); - if (i) { - fprintf(stderr, "Sorry, directory %s is not empty, exiting.\n", dir); - return 1; - } - openlog("plpnfsd", LOG_PID|LOG_CONS, LOG_DAEMON); - rp = get_nam(""); - inode2fh(rp->inode, root_fh.data); - root_fattr.fileid = rp->inode; - root_fattr.atime.seconds = root_fattr.mtime.seconds = - root_fattr.ctime.seconds = tv.tv_sec; - - mount_and_run(dir, nfs_program_2, &root_fh); - return 0; + struct passwd *pw; + struct timeval tv; + struct timezone tz; + p_inode *rp; + nfs_fh root_fh; + DIR *dirp; + DIRENT *diep; + int i; + + + if (!(pw = getpwuid(getuid()))) { + fprintf(stderr, "You don't exist, go away!\n"); + return 1; + } + if (!user) { + if (!(user = (char *) getenv("USER"))) + user = (char *) getenv("logname"); + } + endpwent(); + if (set_owner(user, 1)) + return 1; + gettimeofday(&tv, &tz); + + debug = verbose; + if (debug) + printf("plpnfsd: version %s, mounting on %s ...\n", VERSION, dir); + + /* Check if mountdir is empty (or else you can overmount e.g /etc) + It is done here, because exit hangs, if hardware flowcontrol is + not present. Bugreport Nov 28 1996 by Olaf Flebbe */ + if (!(dirp = opendir(dir))) { + perror(dir); + return 1; + } + i = 0; + while ((diep = readdir(dirp)) != 0) + if (strcmp(diep->d_name, ".") && strcmp(diep->d_name, "..")) + i++; + closedir(dirp); + if (i) { + fprintf(stderr, "Sorry, directory %s is not empty, exiting.\n", dir); + return 1; + } + openlog("plpnfsd", LOG_PID|LOG_CONS, LOG_DAEMON); + rp = get_nam(""); + inode2fh(rp->inode, root_fh.data); + root_fattr.fileid = rp->inode; + root_fattr.atime.seconds = root_fattr.mtime.seconds = + root_fattr.ctime.seconds = tv.tv_sec; + + mount_and_run(dir, nfs_program_2, &root_fh); + return 0; } + +/* + * Local variables: + * c-basic-offset: 4 + * End: + */ diff --git a/plpnfsd/rfsv_api.h b/plpnfsd/rfsv_api.h index cd98beb..d93b9d1 100644 --- a/plpnfsd/rfsv_api.h +++ b/plpnfsd/rfsv_api.h @@ -1,8 +1,23 @@ -/* $Id$/ +/*-*-c++-*- + * $Id$ * - * C API for rfsv + * This file is part of plptools. * - * Copyright (C) 1999 Fritz Elfert + * Copyright (C) 1999-2001 Fritz Elfert + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _rfsv_api_h_ @@ -50,3 +65,9 @@ extern long rpcs_ps(); #define PSI_A_TEXT 0x1000 #endif + +/* + * Local variables: + * c-basic-offset: 4 + * End: + */ -- cgit v1.2.3