X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fbio%2Fserv_bio.c;h=ea88b87d36da0ed953fb7a4d8b9cbbc94bb1c1d3;hb=4db4fc48793f3680c5defd28ea32c97044a2b569;hp=6d09c1bf4b93ed486336bcad31eccfa7a11e928c;hpb=8c47559cb5ae97ec0fa35660ee16fd61a9451c72;p=citadel.git diff --git a/citadel/modules/bio/serv_bio.c b/citadel/modules/bio/serv_bio.c index 6d09c1bf4..ea88b87d3 100644 --- a/citadel/modules/bio/serv_bio.c +++ b/citadel/modules/bio/serv_bio.c @@ -1,66 +1,26 @@ /* - * $Id$ - * * This module implementsserver commands related to the display and * manipulation of user "bio" files. * + * Copyright (c) 1987-2012 by the citadel.org team * - * Copyright (c) 1987-2009 by the citadel.org team - * - * 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 3 of the License, or - * (at your option) any later version. + * This program is open source 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 3 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 + * 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. */ -#include "sysdep.h" -#include -#include -#include -#include -#include -#include -#include -#include - -#if TIME_WITH_SYS_TIME -# include -# include -#else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif -#endif +#include "ctdl_module.h" -#include -#include -#include -#include -#include "citadel.h" -#include "server.h" -#include "citserver.h" -#include "support.h" -#include "config.h" -#include "control.h" -#include "room_ops.h" -#include "user_ops.h" -#include "policy.h" -#include "database.h" -#include "msgbase.h" -#include "citadel_dirs.h" +#include +#include +#include -#include "ctdl_module.h" /* * enter user bio @@ -102,7 +62,7 @@ void cmd_rbio(char *cmdbuf) FILE *fp; extract_token(buf, cmdbuf, 0, '|', sizeof buf); - if (getuser(&ruser, buf) != 0) { + if (CtdlGetUser(&ruser, buf) != 0) { cprintf("%d No such user.\n",ERROR + NO_SUCH_USER); return; } @@ -124,27 +84,94 @@ void cmd_rbio(char *cmdbuf) /* * list of users who have entered bios */ -void cmd_lbio(char *cmdbuf) { - char buf[256]; - FILE *ls; +void cmd_lbio(char *cmdbuf) +{ + DIR *filedir = NULL; + struct dirent *filedir_entry; + struct dirent *d; + int dont_resolve_uids; + size_t d_namelen; struct ctdluser usbuf; - char listbios[256]; + int d_type = 0; - snprintf(listbios, sizeof(listbios),"cd %s; ls",ctdl_bio_dir); - ls = popen(listbios, "r"); - if (ls == NULL) { + + d = (struct dirent *)malloc(offsetof(struct dirent, d_name) + PATH_MAX + 2); + if (d == NULL) { cprintf("%d Cannot open listing.\n", ERROR + FILE_NOT_FOUND); return; } - cprintf("%d\n", LISTING_FOLLOWS); - while (fgets(buf, sizeof buf, ls)!=NULL) - if (getuserbynumber(&usbuf,atol(buf))==0) - cprintf("%s\n", usbuf.fullname); - pclose(ls); + filedir = opendir (ctdl_bio_dir); + if (filedir == NULL) { + free(d); + cprintf("%d Cannot open listing.\n", ERROR + FILE_NOT_FOUND); + return; + } + dont_resolve_uids = *cmdbuf == '1'; + cprintf("%d\n", LISTING_FOLLOWS); + while ((readdir_r(filedir, d, &filedir_entry) == 0) && + (filedir_entry != NULL)) + { +#ifdef _DIRENT_HAVE_D_NAMLEN + d_namelen = filedir_entry->d_namlen; + +#else + d_namelen = strlen(filedir_entry->d_name); +#endif + +#ifdef _DIRENT_HAVE_D_TYPE + d_type = filedir_entry->d_type; +#else + +#ifndef DT_UNKNOWN +#define DT_UNKNOWN 0 +#define DT_DIR 4 +#define DT_REG 8 +#define DT_LNK 10 + +#define IFTODT(mode) (((mode) & 0170000) >> 12) +#define DTTOIF(dirtype) ((dirtype) << 12) +#endif + d_type = DT_UNKNOWN; +#endif + if ((d_namelen == 1) && + (filedir_entry->d_name[0] == '.')) + continue; + + if ((d_namelen == 2) && + (filedir_entry->d_name[0] == '.') && + (filedir_entry->d_name[1] == '.')) + continue; + + if (d_type == DT_UNKNOWN) { + struct stat s; + char path[PATH_MAX]; + snprintf(path, PATH_MAX, "%s/%s", + ctdl_bio_dir, filedir_entry->d_name); + if (lstat(path, &s) == 0) { + d_type = IFTODT(s.st_mode); + } + } + switch (d_type) + { + case DT_DIR: + break; + case DT_LNK: + case DT_REG: + if (dont_resolve_uids) { + filedir_entry->d_name[d_namelen++] = '\n'; + filedir_entry->d_name[d_namelen] = '\0'; + client_write(filedir_entry->d_name, d_namelen); + } + else if (CtdlGetUserByNumber(&usbuf,atol(filedir_entry->d_name))==0) + cprintf("%s\n", usbuf.fullname); + } + } + free(d); + closedir(filedir); cprintf("000\n"); -} +} @@ -156,8 +183,8 @@ CTDL_MODULE_INIT(bio) CtdlRegisterProtoHook(cmd_rbio, "RBIO", "Read a user's bio"); CtdlRegisterProtoHook(cmd_lbio, "LBIO", "List users with bios"); } - /* return our Subversion id for the Log */ - return "$Id$"; + /* return our module name for the log */ + return "bio"; }