1

Ubuntu 16.04
Bash 4.4.0

How can a sourcemod/scripting/file.sp be verified to be legit before executing the file with the sourcemod/scripting/compile.sh ?

Here is the sourcemod/scripting/compile.sh

#!/bin/bash -e
cd "$(dirname "$0")"

test -e compiled || mkdir compiled

if [[ $# -ne 0 ]]; then
    for sourcefile in "$@"
    do
        smxfile="`echo $sourcefile | sed -e 's/\.sp$/\.smx/'`"
        echo -e "\nCompiling $sourcefile..."
        ./spcomp $sourcefile -ocompiled/$smxfile
    done
else
    for sourcefile in *.sp
    do
        smxfile="`echo $sourcefile | sed -e 's/\.sp$/\.smx/'`"
        echo -e "\nCompiling $sourcefile ..."
        ./spcomp $sourcefile -ocompiled/$smxfile
    done
fi  

Here is a plugin called sounds.sp

/**
 * vim: set ts=4 :
 * =============================================================================
 * SourceMod Sound Commands Plugin
 * Implements basic sound commands.
 *
 * SourceMod (C)2004-2008 AlliedModders LLC.  All rights reserved.
 * =============================================================================
 *
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License, version 3.0, as published by the
 * Free Software Foundation.
 *
 * 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, see <http://www.gnu.org/licenses/>.
 *
 * As a special exception, AlliedModders LLC gives you permission to link the
 * code of this program (as well as its derivative works) to "Half-Life 2," the
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
 * by the Valve Corporation.  You must obey the GNU General Public License in
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
 * this exception to all derivative works.  AlliedModders LLC defines further
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
 * or <http://www.sourcemod.net/license.php>.
 *
 * Version: $Id$
 */

#include <sourcemod>

#pragma semicolon 1
#pragma newdecls required

public Plugin myinfo =
{
  name = "Sound Commands",
  author = "AlliedModders LLC",
  description = "Sound Commands",
  version = SOURCEMOD_VERSION,
  url = "http://www.sourcemod.net/"
};

public void OnPluginStart()
{
  LoadTranslations("common.phrases");
  LoadTranslations("sounds.phrases");

  RegAdminCmd("sm_play", Command_Play, ADMFLAG_GENERIC, "sm_play <#userid|name> <filename>");
}

public Action Command_Play(int client, int args)
{
  if (args < 2)
  {
    ReplyToCommand(client, "[SM] Usage: sm_play <#userid|name> <filename>");
    return Plugin_Handled;
  }

  char Arguments[PLATFORM_MAX_PATH + 65];
  GetCmdArgString(Arguments, sizeof(Arguments));

  char Arg[65];
  int len = BreakString(Arguments, Arg, sizeof(Arg));

  /* Make sure it does not go out of bound by doing "sm_play user  "*/
  if (len == -1)
  {
    ReplyToCommand(client, "[SM] Usage: sm_play <#userid|name> <filename>");
    return Plugin_Handled;
  }

  /* Incase they put quotes and white spaces after the quotes */
  if (Arguments[len] == '"')
  {
    len++;
    int FileLen = TrimString(Arguments[len]) + len;

    if (Arguments[FileLen - 1] == '"')
    {
      Arguments[FileLen - 1] = '\0';
    }
  }

  char target_name[MAX_TARGET_LENGTH];
  int target_list[MAXPLAYERS], target_count;
  bool tn_is_ml;

  if ((target_count = ProcessTargetString(
      Arg,
      client,
      target_list,
      MAXPLAYERS,
      COMMAND_FILTER_NO_BOTS,
      target_name,
      sizeof(target_name),
      tn_is_ml)) <= 0)
  {
    ReplyToTargetError(client, target_count);
    return Plugin_Handled;
  }

  for (int i = 0; i < target_count; i++)
  {
    ClientCommand(target_list[i], "playgamesound \"%s\"", Arguments[len]);
    LogAction(client, target_list[i], "\"%L\" played sound on \"%L\" (file \"%s\")", client, target_list[i], Arguments[len]);
  }

  if (tn_is_ml)
  {
    ShowActivity2(client, "[SM] ", "%t", "Played sound to target", target_name);
  }
  else
  {
    ShowActivity2(client, "[SM] ", "%t", "Played sound to target", "_s", target_name);
  }

  return Plugin_Handled;
}
1
  • 2
    Same as you would compiling anything else - compile it to a temporary output filename, check the exit code of the compiler. If it's zero (i.e. no errors), mv it to the correct place. You can automate this with make and a Makefile. – cas Jul 22 at 2:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.