/* $Id$ * reactos filesystem name strings functions emulation of libcaptive * Copyright (C) 2002 Jan Kratochvil * * 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; exactly version 2 of June 1991 is required * * 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 */ #include "config.h" #include "reactos/ddk/fsfuncs.h" /* self */ #include #include "captive/unicode.h" /** * FsRtlIsFatDbcsLegal: * @DbcsName_nonconst: #ANSI_STRING to check. * Yes, the string is passed by value, not by reference! * @WildCardsPermissible: Allow '*' or '?' characters? * @PathNamePermissible: Allow '\' for pathname checking? Otherwise plain filename is required. * @LeadingBackslashPermissible: Allow first directory component empty? * * Characters 0x00..0x1F, '"', '/', ':', '|', '+', ',', ';', '=', '[' and ']' are always forbidden anywhere. * Characters '*' and '?' are permitted if @WildCardsPermissible. * Basename length must be >=1 && <=8. Extension length must be >=0 && <=3. * Basename or extension must not contain trailing space (' '). * Only one '.' is allowed inside one filename component - to split filename to basename and extension. * * Returns: %TRUE if @DbcsName_nonconst is a valid pathname according to the constaints. */ BOOLEAN FsRtlIsFatDbcsLegal(IN ANSI_STRING DbcsName_nonconst, IN BOOLEAN WildCardsPermissible,IN BOOLEAN PathNamePermissible,IN BOOLEAN LeadingBackslashPermissible) { const ANSI_STRING *cDbcsName; gboolean gotdot=FALSE; gint len=0,i; g_return_val_if_fail(captive_validate_AnsiString(&DbcsName_nonconst),FALSE); g_return_val_if_fail(PathNamePermissible==FALSE,FALSE); /* FIXME: 'PathNamePermissible' not yet implemented */ cDbcsName=&DbcsName_nonconst; for (i=0;iLength;i++) { char c=cDbcsName->Buffer[i]; if ((c>=0x00 && c<=0x1F) || c=='"' || c=='/' || c==':' || c=='|' || c=='+' || c==',' || c==';' || c=='=' || c=='[' || c==']') /* always invalid */ return FALSE; if (!PathNamePermissible && c=='\\') return FALSE; if (!LeadingBackslashPermissible && i==0 && c=='\\') return FALSE; if (!WildCardsPermissible && (c=='*' || c=='?')) return FALSE; if (c!='.') { len++; continue; } /* c=='.' */ if (gotdot) return FALSE; gotdot=TRUE; if (len<1 || len>8) return FALSE; len=0; if (' '==cDbcsName->Buffer[i-1]) return FALSE; } if (!cDbcsName->Length) return FALSE; if (' '==cDbcsName->Buffer[cDbcsName->Length-1]) return FALSE; if (len>(!gotdot ? 8 : 3)) return FALSE; return TRUE; }